图像处理分析FFT.docx
- 文档编号:12318416
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:16
- 大小:385.72KB
图像处理分析FFT.docx
《图像处理分析FFT.docx》由会员分享,可在线阅读,更多相关《图像处理分析FFT.docx(16页珍藏版)》请在冰豆网上搜索。
图像处理分析FFT
实验名称
实验5:
频域滤波
实验目的
掌握图像进行频域滤波的方法和步骤。
1、掌握图像频域DFT变换和反变换的方法。
2、掌握图像频域滤波的步骤
实验内容
1、灰度图像的DFT和IDFT。
具体内容:
利用OpenCV提供的cvDFT函数对图像进行DFT和IDFT变换
2、利用理想高通和低通滤波器对灰度图像进行频域滤波
具体内容:
利用cvDFT函数实现DFT,在频域上利用理想高通和低通滤波器进行滤波,并把滤波过后的图像显示在屏幕上(观察振铃现象),要求截止频率可输入。
3、利用布特沃斯高通和低通滤波器对灰度图像进行频域滤波。
具体内容:
利用cvDFT函数实现DFT,在频域上进行利用布特沃斯高通和低通滤波器进行滤波,并把滤波过后的图像显示在屏幕上(观察振铃现象),要求截止频率和n可输入。
实验完成情况
1、实验步骤:
利用OpenCV提供的cvDFT函数对图像进行DFT和IDFT变换
核心代码如下:
//DFT变换
IplImage*DFT(IplImage*src)
{
IplImage*fourier=cvCreateImage(cvGetSize(src),IPL_DEPTH_64F,2);
intdft_H,dft_W;
dft_H=src->height;
dft_W=src->width;
CvMat*src_Re=cvCreateMat(dft_H,dft_W,CV_64FC1);//doubleRe,Im;
CvMat*src_Im=cvCreateMat(dft_H,dft_W,CV_64FC1);//Imaginarypart
CvMat*sum_src=cvCreateMat(dft_H,dft_W,CV_64FC2);//2channels(src_Re,src_Im)
CvMat*sum_dst=cvCreateMat(dft_H,dft_W,CV_64FC2);//2channels(dst_Re,dst_Im)
cvConvert(src,src_Re);
cvZero(src_Im);
cvMerge(src_Re,src_Im,0,0,sum_src);
cvDFT(sum_src,sum_dst,CV_DXT_FORWARD,0);
cvConvert(sum_dst,fourier);
cvReleaseMat(&src_Re);
cvReleaseMat(&src_Im);
cvReleaseMat(&sum_src);
cvReleaseMat(&sum_dst);
returnfourier;
}
//DFT反变换
IplImage*IDFT(IplImage*fourier)
{
IplImage*dst=cvCreateImage(cvGetSize(fourier),IPL_DEPTH_8U,1);
intdft_H,dft_W;
dft_H=fourier->height;
dft_W=fourier->width;
CvMat*dst_Re=cvCreateMat(dft_H,dft_W,CV_64FC1);//doubleRe,Im;
CvMat*dst_Im=cvCreateMat(dft_H,dft_W,CV_64FC1);//Imaginarypart
CvMat*sum_dst=cvCreateMat(dft_H,dft_W,CV_64FC2);//2channels(dst_Re,dst_Im)
CvMat*sum_src=cvCreateMat(dft_H,dft_W,CV_64FC2);
cvConvert(fourier,sum_src);
cvDFT(sum_src,sum_dst,CV_DXT_INV_SCALE,0);
cvSplit(sum_dst,dst_Re,dst_Im,0,0);
cvConvert(dst_Re,dst);
cvReleaseMat(&dst_Re);
cvReleaseMat(&dst_Im);
cvReleaseMat(&sum_src);
cvReleaseMat(&sum_dst);
returndst;
}
//归一化,将灰度映射到0~255之间,并将能量最高的四角移到中心,生成图片频域能量图
voidBuildDFTImage(IplImage*fourier,IplImage*dst)
{
IplImage*image_Re=0,*image_Im=0;
image_Re=cvCreateImage(cvGetSize(fourier),IPL_DEPTH_64F,1);
image_Im=cvCreateImage(cvGetSize(fourier),IPL_DEPTH_64F,1);//Imaginarypart
cvSplit(fourier,image_Re,image_Im,0,0);
//ComputethemagnitudeofthespectrumMag=sqrt(Re^2+Im^2)
cvPow(image_Re,image_Re,2.0);
cvPow(image_Im,image_Im,2.0);
cvAdd(image_Re,image_Im,image_Re);
cvPow(image_Re,image_Re,0.5);
cvReleaseImage(&image_Im);
cvAddS(image_Re,cvScalar(1.0),image_Re);//1+Mag
cvLog(image_Re,image_Re);//log(1+Mag)
//重新安排傅里叶图像中心
//RearrangethequadrantsofFourierimagesothattheoriginisat
//theimagecenter
doubleminVal=0,maxVal=0;
cvMinMaxLoc(image_Re,&minVal,&maxVal);//Localizeminimumandmaximumvalues
CvScalarmin;
min.val[0]=minVal;
doublescale=255/(maxVal-minVal);
cvSubS(image_Re,min,image_Re);
cvConvertScale(image_Re,dst,scale);
cvReleaseImage(&image_Re);
//RearrangethequadrantsofFourierimagesothattheoriginisat
//theimagecenter
intnRow,nCol,i,j,cy,cx;
uchartmp13,tmp24;
nRow=fourier->height;
nCol=fourier->width;
cy=nRow/2;//imagecenter
cx=nCol/2;
for(j=0;j { for(i=0;i { tmp13=CV_IMAGE_ELEM(dst,uchar,j,i); CV_IMAGE_ELEM(dst,uchar,j,i)=CV_IMAGE_ELEM(dst,uchar,j+cy,i+cx); CV_IMAGE_ELEM(dst,uchar,j+cy,i+cx)=tmp13; tmp24=CV_IMAGE_ELEM(dst,uchar,j,i+cx); CV_IMAGE_ELEM(dst,uchar,j,i+cx)=CV_IMAGE_ELEM(dst,uchar,j+cy,i); CV_IMAGE_ELEM(dst,uchar,j+cy,i)=tmp24; } } } 实验结果如图: 2、实验步骤: 利用cvDFT函数实现DFT,在频域上利用理想高通和低通滤波器进行滤波,并把滤波过后的图像显示在屏幕上(观察振铃现象),截止频率可输入。 核心代码如下: voidPassFilter(IplImage*fourier,intFLAG,doubled0,intn1) { inti,j; intstate=-1; doubletempD; longwidth,height; width=fourier->width; height=fourier->height; longx,y; x=width/2; y=height/2; CvMat*H_mat; H_mat=cvCreateMat(fourier->height,fourier->width,CV_64FC2); for(i=0;i for(j=0;j if(i>y&&j>x){ state=3; }elseif(i>y){ state=1; }elseif(j>x){ state=2; }else{ state=0; } switch(state){ case0: tempD=(double)sqrt(1.0*i*i+j*j);break; case1: tempD=(double)sqrt(1.0*(height-i)*(height-i)+j*j);break; case2: tempD=(double)sqrt(1.0*i*i+(width-j)*(width-j));break; case3: tempD=(double)sqrt(1.0*(height-i)*(height-i)+(width-j)*(width-j));break; default: break; } switch(FLAG){ caseIDEAL_LOW: if(tempD<=D0){ ((double*)(H_mat->data.ptr+H_mat->step*i))[j*2]=1.0; ((double*)(H_mat->data.ptr+H_mat->step*i))[j*2+1]=0.0; }else{ ((double*)(H_mat->data.ptr+H_mat->step*i))[j*2]=0.0; ((double*)(H_mat->data.ptr+H_mat->step*i))[j*2+1]=0.0; } break; caseIDEAL_HIGH: if(tempD<=D0){ ((double*)(H_mat->data.ptr+H_mat->step*i))[j*2]=0.0; ((double*)(H_mat->data.ptr+H_mat->step*i))[j*2+1]=0.0; }else{ ((double*)(H_mat->data.ptr+H_mat->step*i))[j*2]=1.0; ((double*)(H_mat->data.ptr+H_mat->step*i))[j*2+1]=0.0; } break; caseBW_LOW: tempD=1/(1+pow(tempD/D0,2*n)); ((double*)(H_mat->data.ptr+H_mat->step*i))[j*2]=tempD; ((double*)(H_mat->data.ptr+H_mat->step*i))[j*2+1]=0.0; break; caseBW_HIGH: tempD=1/(1+pow(D0/tempD,2*n)); ((double*)(H_mat->data.ptr+H_mat->step*i))[j*2]=tempD; ((double*)(H_mat->data.ptr+H_mat->step*i))[j*2+1]=0.0; break; default: break; } } } cvMulSpectrums(fourier,H_mat,fourier,CV_DXT_ROWS); cvReleaseMat(&H_mat); } 其中选择IDEAL_LOW与IDEAL_HIGH模式即为该实验的理想低通与高通滤波器 实验结果如图: 理想低通滤波器处理过程如下图所示 理想高通滤波器处理过程如下图所示 3、实验步骤: 利用cvDFT函数实现DFT,在频域上进行利用布特沃斯高通和低通滤波器进行滤波,并把滤波过后的图像显示在屏幕上(观察振铃现象),并且截止频率和n可输入。 核心代码与2中类似 其中选择BW_LOW与BW_HIGH模式即为该实验的理想低通与高通滤波器 实验结果如图: 巴特沃斯低通滤波器处理过程如下图所示 巴特沃斯高通滤波器处理过程如下图所示 实验中的问题 问题: DFT变换后图像全为黑色。 解决方法: DFT处理后未调整图像中心,高能量集中在图片的四个拐角,重新设计算法中心化该谱,将能量集中到图像中心。 实验结果 实验源码位于实验5_曹欣_SA14225013.rar中 代码位于lab5文件夹中,5_1.cpp为主程序,可在宏定义中修改截止频率D0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图像 处理 分析 FFT