图像处理分析FFT.docx

上传人:b****4 文档编号:12318416 上传时间:2023-04-18 格式:DOCX 页数:16 大小:385.72KB
下载 相关 举报
图像处理分析FFT.docx_第1页
第1页 / 共16页
图像处理分析FFT.docx_第2页
第2页 / 共16页
图像处理分析FFT.docx_第3页
第3页 / 共16页
图像处理分析FFT.docx_第4页
第4页 / 共16页
图像处理分析FFT.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

图像处理分析FFT.docx

《图像处理分析FFT.docx》由会员分享,可在线阅读,更多相关《图像处理分析FFT.docx(16页珍藏版)》请在冰豆网上搜索。

图像处理分析FFT.docx

图像处理分析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模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1