wavelet.rar

  • S1_851713
    了解作者
  • 2.7MB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-04-25 05:06
    上传日期
在openCV平台下的小波变换函数,可以进行图像的小波分解和重构!
wavelet.rar
  • wavelet
  • Debug
  • vc60.pdb
    548KB
  • wavelet.pdb
    481KB
  • vc60.idb
    345KB
  • wavelet.obj
    49.2KB
  • wavelet.exe
    196.1KB
  • wavelet.pch
    8MB
  • wavelet.ilk
    307.8KB
  • wavelet.dsp
    3.4KB
  • wavelet.plg
    1.3KB
  • wavelet.opt
    49.5KB
  • wavelet.cpp
    4.7KB
  • wavelet.dsw
    520B
  • wavelet.cpp.bak
    7.6KB
  • lena.BMP
    257.1KB
  • wavelet.ncb
    41KB
内容介绍
// DWT.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "cv.h" #include "highgui.h" // 二维离散小波变换(单通道浮点图像) void DWT(IplImage *pImage, int nLayer) { // 执行条件 if (pImage) { if (pImage->nChannels == 1 && pImage->depth == IPL_DEPTH_32F && ((pImage->width >> nLayer) << nLayer) == pImage->width && ((pImage->height >> nLayer) << nLayer) == pImage->height) { int i, x, y, n; float fValue = 0; float fRadius = sqrt(2.0f); int nWidth = pImage->width; int nHeight = pImage->height; int nHalfW = nWidth / 2; int nHalfH = nHeight / 2; float **pData = new float*[pImage->height]; float *pRow = new float[pImage->width]; float *pColumn = new float[pImage->height]; for (i = 0; i < pImage->height; i++) { pData[i] = (float*) (pImage->imageData + pImage->widthStep * i); } // 多层小波变换 for (n = 0; n < nLayer; n++, nWidth /= 2, nHeight /= 2, nHalfW /= 2, nHalfH /= 2) { // 水平变换 for (y = 0; y < nHeight; y++) { // 奇偶分离 memcpy(pRow, pData[y], sizeof(float) * nWidth); for (i = 0; i < nHalfW; i++) { x = i * 2; pData[y][i] = pRow[x]; pData[y][nHalfW + i] = pRow[x + 1]; } // 提升小波变换 for (i = 0; i < nHalfW - 1; i++) { fValue = (pData[y][i] + pData[y][i + 1]) / 2; pData[y][nHalfW + i] -= fValue; } fValue = (pData[y][nHalfW - 1] + pData[y][nHalfW - 2]) / 2; pData[y][nWidth - 1] -= fValue; fValue = (pData[y][nHalfW] + pData[y][nHalfW + 1]) / 4; pData[y][0] += fValue; for (i = 1; i < nHalfW; i++) { fValue = (pData[y][nHalfW + i] + pData[y][nHalfW + i - 1]) / 4; pData[y][i] += fValue; } // 频带系数 for (i = 0; i < nHalfW; i++) { pData[y][i] *= fRadius; pData[y][nHalfW + i] /= fRadius; } } // 垂直变换 for (x = 0; x < nWidth; x++) { // 奇偶分离 for (i = 0; i < nHalfH; i++) { y = i * 2; pColumn[i] = pData[y][x]; pColumn[nHalfH + i] = pData[y + 1][x]; } for (i = 0; i < nHeight; i++) { pData[i][x] = pColumn[i]; } // 提升小波变换 for (i = 0; i < nHalfH - 1; i++) { fValue = (pData[i][x] + pData[i + 1][x]) / 2; pData[nHalfH + i][x] -= fValue; } fValue = (pData[nHalfH - 1][x] + pData[nHalfH - 2][x]) / 2; pData[nHeight - 1][x] -= fValue; fValue = (pData[nHalfH][x] + pData[nHalfH + 1][x]) / 4; pData[0][x] += fValue; for (i = 1; i < nHalfH; i++) { fValue = (pData[nHalfH + i][x] + pData[nHalfH + i - 1][x]) / 4; pData[i][x] += fValue; } // 频带系数 for (i = 0; i < nHalfH; i++) { pData[i][x] *= fRadius; pData[nHalfH + i][x] /= fRadius; } } } delete[] pData; delete[] pRow; delete[] pColumn; } } } void main(int argc, char* argv[]) { // 小波变换层数 int nLayer = 1; // 输入彩色图像 IplImage *pSrc = cvLoadImage("lena.bmp", 1); // 计算小波图象大小 CvSize size = cvGetSize(pSrc); /* 这段有点不明白,不知道是什么意思,屏蔽后程序正常运行 if ((pSrc->width >> nLayer) << nLayer != pSrc->width) { size.width = ((pSrc->width >> nLayer) + 1) << nLayer; } if ((pSrc->height >> nLayer) << nLayer != pSrc->height) { size.height = ((pSrc->height >> nLayer) + 1) << nLayer; } */ // 创建小波图象 IplImage *pWavelet = cvCreateImage(size, IPL_DEPTH_32F, pSrc->nChannels); if (pWavelet) { // 小波图象赋值 cvSetImageROI(pWavelet, cvRect(0, 0, pSrc->width, pSrc->height)); cvConvertScale(pSrc, pWavelet, 1, -128); cvResetImageROI(pWavelet); cvNamedWindow("pWavelet",1); cvShowImage("pWavelet",pSrc); // 彩色图像小波变换 IplImage *pImage = cvCreateImage(cvGetSize(pWavelet), IPL_DEPTH_32F,1); if (pImage) { for (int i = 1; i <= pWavelet->nChannels; i++) { cvSetImageCOI(pWavelet, i); cvCopy(pWavelet, pImage, NULL); // 二维离散小波变换 DWT(pImage, nLayer); // 二维离散小波恢复 // IDWT(pImage, nLayer); cvCopy(pImage, pWavelet, NULL); } cvSetImageCOI(pWavelet, 0); cvReleaseImage(&pImage); } // 小波变换图象 cvSetImageROI(pWavelet, cvRect(0, 0, pSrc->width, pSrc->height)); cvConvertScale(pWavelet, pSrc, 1, 128); cvResetImageROI(pWavelet); // 本行代码有点多余,但有利用养成良好的编程习惯 cvReleaseImage(&pWavelet); } // 显示图像pSrc cvNamedWindow("dwt",1); cvShowImage("dwt",pSrc); cvWaitKey(0); cvDestroyWindow("dwt"); cvDestroyWindow("pWavelet"); // ... cvReleaseImage(&pSrc); return ; }
评论
    相关推荐
    • 双目视觉重构8点法算法的OpenCV实现.zip
      8点法的算法的OpenCV实现,适合学习双目相机三维重建的人
    • openCV形态学开闭重构
      感谢梁华~~本程序借鉴梁华的形态学开源库~~真正实现了形态学对图像的开闭重构~~再次对原作者表示感谢! 感谢梁华~~本程序借鉴梁华的形态学开源库~~真正实现了形态学对图像的开闭重构~~再次对原作者表示感谢!
    • motion-tracker:使用 OpenCV 3.0.0 对视频中的运动物体进行运动跟踪
      运动追踪器 使用 OpenCV 3.0.0 对视频中的运动物体进行运动跟踪 基本依赖项是 OpenCV 3.0.0 和 Numpy 大部分代码需要重构,以便更容易地调整参数。 我在蚂蚁数据上运行代码的结果可以在这里看到: :
    • qtopencv.zip
      "⑥形态学重构." "⑦轮廓的提取及描述." 图像滤波处理主要包括以下五种滤波: "①方框滤波." "②均值滤波." "③高斯滤波." "④中值滤波." "⑤双边滤波." 图像分割主要包括以下五种类型的分割: "①基于阈值的...
    • opencv实现多角度重建
      根据多角度拍摄图像进行三维重构 能得出三维模型
    • OpenCV三维重构代码
      环境OpenCV3.3.0,标定双目相机,用OpenCV写的三维重构的代码,
    • 小波变换支持opencv mat的vs2010完整工程
      小波变换支持opencv mat的vs2010完整工程,包括分解和重构,本人亲自调通,希望对你有所帮助
    • OpenCV中PCA实现人脸降维
      OpenCV中PCA实现人脸降维详细的介绍了怎样来降维
    • OpenCV参考手册(英文)
      OpenCV参考手册(英文)。 主要介绍了OpenCV在一下方面的使用。包括有:行为分析与目标跟踪、图像分析、形状分析、目标识别、物体重构等。
    • GaussDB_100_1.0.1-DATABASE-REDHAT-64bit.tar.gz
      guassdb100在redhat上安装包,单机部署的包,安装步骤请看我的文中介绍,经过大量实验搭建总结出来的文档