opencv小波文档 (2)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

OpenCV里面没有提供小波变换函数确实是一大遗憾,网上找点小波变换的代码吧,大多是针对BMP直接操作的,还没有发现非常适合OpenCV的,没办法,自己动手手写了一个,意在抛砖引玉,欢迎大家批评,拍砖头,砸鸡蛋。提供函数DWT()和IDWT(),前者完成任意层次的小波变换,后者完成任意层次的小波逆变换。输入图像要求必须是单通道浮点图像,对图像大小也有要求(1层变换:w,h必须是2的倍数;2层变换:w,h必须是4的倍数;3层变换:w,h必须是8的倍数......),变换后的结果直接保存在输入图像中。1、函数参数简单,图像指针pImage和变换层数nLayer。2、一个函数直接完成多层次二维小波变换,尽量减少下标运算,避免不必要的函数调用,以提高执行效率。3、变换过程中,使用了一个指针数组pData用于保存每行数据的起始位置,pRow和pColumn用于保存一行和一列临时数据,用于奇偶分离或合并,内存消耗较少。//二维离散小波变换(单通道浮点图像)voidDWT(IplImage*pImage,intnLayer){//执行条件if(pImage){if(pImage-nChannels==1&&pImage-depth==IPL_DEPTH_32F&&((pImage-widthnLayer)nLayer)==pImage-width&&((pImage-heightnLayer)nLayer)==pImage-height){inti,x,y,n;floatfValue=0;floatfRadius=sqrt(2.0f);intnWidth=pImage-width;intnHeight=pImage-height;intnHalfW=nWidth/2;intnHalfH=nHeight/2;float**pData=newfloat*[pImage-height];float*pRow=newfloat[pImage-width];float*pColumn=newfloat[pImage-height];for(i=0;ipImage-height;i++){pData[i]=(float*)(pImage-imageData+pImage-widthStep*i);}//多层小波变换for(n=0;nnLayer;n++,nWidth/=2,nHeight/=2,nHalfW/=2,nHalfH/=2){//水平变换for(y=0;ynHeight;y++){//奇偶分离memcpy(pRow,pData[y],sizeof(float)*nWidth);for(i=0;inHalfW;i++){x=i*2;pData[y][i]=pRow[x];pData[y][nHalfW+i]=pRow[x+1];}//提升小波变换for(i=0;inHalfW-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;inHalfW;i++){fValue=(pData[y][nHalfW+i]+pData[y][nHalfW+i-1])/4;pData[y][i]+=fValue;}//频带系数for(i=0;inHalfW;i++){pData[y][i]*=fRadius;pData[y][nHalfW+i]/=fRadius;}}//垂直变换for(x=0;xnWidth;x++){//奇偶分离for(i=0;inHalfH;i++){y=i*2;pColumn[i]=pData[y][x];pColumn[nHalfH+i]=pData[y+1][x];}for(i=0;inHeight;i++){pData[i][x]=pColumn[i];}//提升小波变换for(i=0;inHalfH-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;inHalfH;i++){fValue=(pData[nHalfH+i][x]+pData[nHalfH+i-1][x])/4;pData[i][x]+=fValue;}//频带系数for(i=0;inHalfH;i++){pData[i][x]*=fRadius;pData[nHalfH+i][x]/=fRadius;}}}delete[]pData;delete[]pRow;delete[]pColumn;}}}//二维离散小波恢复(单通道浮点图像)voidIDWT(IplImage*pImage,intnLayer){//执行条件if(pImage){if(pImage-nChannels==1&&pImage-depth==IPL_DEPTH_32F&&((pImage-widthnLayer)nLayer)==pImage-width&&((pImage-heightnLayer)nLayer)==pImage-height){inti,x,y,n;floatfValue=0;floatfRadius=sqrt(2.0f);intnWidth=pImage-width(nLayer-1);intnHeight=pImage-height(nLayer-1);intnHalfW=nWidth/2;intnHalfH=nHeight/2;float**pData=newfloat*[pImage-height];float*pRow=newfloat[pImage-width];float*pColumn=newfloat[pImage-height];for(i=0;ipImage-height;i++){pData[i]=(float*)(pImage-imageData+pImage-widthStep*i);}//多层小波恢复for(n=0;nnLayer;n++,nWidth*=2,nHeight*=2,nHalfW*=2,nHalfH*=2){//垂直恢复for(x=0;xnWidth;x++){//频带系数for(i=0;inHalfH;i++){pData[i][x]/=fRadius;pData[nHalfH+i][x]*=fRadius;}//提升小波恢复fValue=(pData[nHalfH][x]+pData[nHalfH+1][x])/4;pData[0][x]-=fValue;for(i=1;inHalfH;i++){fValue=(pData[nHalfH+i][x]+pData[nHalfH+i-1][x])/4;pData[i][x]-=fValue;}for(i=0;inHalfH-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;//奇偶合并for(i=0;inHalfH;i++){y=i*2;pColumn[y]=pData[i][x];pColumn[y+1]=pData[nHalfH+i][x];}for(i=0;inHeight;i++){pData[i][x]=pColumn[i];}}//水平恢复for(y=0;ynHeight;y++){//频带系数for(i=0;inHalfW;i++){pData[y][i]/=fRadius;pData[y][nHalfW+i]*=fRadius;}//提升小波恢复fValue=(pData[y][nHalfW]+pData[y][nHalfW+1])/4;pData[y][0]-=fValue;for(i=1;inHalfW;i++){fValue=(pData[y][nHalfW+i]+pData[y][nHalfW+i-1])/4;pData[y][i]-=fValue;}for(i=0;inHalfW-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;//奇偶合并for(i=0;inHalfW;i++){x=i*2;pRow[x]=pData[y][i];pRow[x+1]=pData[y][nHalfW+i];}memcpy(pData[y],pRow,sizeof(float)*nWidth);}}delete[]pData;delete[]pRow;delete[]pColumn;}}}上述代码只能对单通道进行变换,并且对图像位深和大小也有要求,还是不太好用。没关系,就这两个函数,可以对任意大小的彩色图像进行任意层次的小波变换,给段代码://小波变换层数intnLayer=2;//输入彩色图像IplImage*pSrc=cvLoadImage(Lena.jpg,CV_LOAD_IMAGE_COLOR);//计算小波图象大小CvSizesize=cvGetSize(pSrc);if((pSrc-widthnLayer)nLayer!=pSrc-width){size.width=((pSrc-widthnLayer)+1)nLayer;}if((pSrc-heightnLayer)nLayer!=pSrc-height){size.height=((pSrc-heightnLayer)+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);//彩色图像小波变换IplImage*pImage=cvCreateImage(cvGetSize(pWavelet),IPL_DEPTH_32F,1);if(pImage){for(inti=1;i=pWavelet-nChannels;i++){cvSetImageCOI(pWavelet,i);cvCopy(pWavelet,pImage,NULL);//二维离散小波变换DWT(pImage,nLayer);//二维离散小波恢复//IDWT(pImage,nLayer);cvCopy(pImage,pWavelet,NULL);}cvSetImageCOI(pWav

1 / 25
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功