傅里叶变换与数字图像处理_第1页
傅里叶变换与数字图像处理_第2页
傅里叶变换与数字图像处理_第3页
傅里叶变换与数字图像处理_第4页
傅里叶变换与数字图像处理_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、M-L同样,给出F(u),能用反DFT来获得原函数:数字图像处理技术的根底,其通过在时域和频域来回切换图像,对图像的信息特征it进展提取和分析。一维傅里叶变换及其反变换单变量连续函数,f(x)的傅里叶变换F(u)定义为等式:u=0, 1, 2,,M1F(?/) - f其中,二口J-S相反,给定F(U通过傅里叶反变换可以获得(x) = J F(u)e17nfXdu这两个等式组成了傅里叶变换对,它fl指出在前一节中提到的重尊事实.即一个函数可以从它的反变换中重新获得。;产 /(用y)二疝优十口以城J-CC J-O0类似地,反变换为;/(x, v) = f I 尸)小小J s J 8单变量高嶷函数可

2、口(其中K二0,1,2,M-1)的傅里叶变换由以下等式给出m傅里叶变换与数字图像处理(2021-05-24 20:06:24)转载 傅里叶变换是将时域信号分解为不同频率的正弦和 /余弦和的形式。傅里叶变换是M-1小)二£尸(”w=0x=Dp2,,Mi从欧拉公式中得到二e-e=cos。+/sin6得出-lA/-1M仁Af-l=Z/GXcos(-2m,x),M+jsin(-27/A1)/A/)Mx=0jf-i=Z/(xXcos2力优iM-jsin2m(XtM)|M仁其中,u=0,1,2,,M1。因此,我们看到傅里叶变换的每项即对于每个u值,F(u)的值由f(x)函数所有值的和组成。f(x

3、)的值那么与各种频率的正弦值和余弦值相乘。F(u)值的范围覆盖的域(u的值)称为频率域,因为u决定了变换的频率成分(x也作用于频率,但它们相加,对每个u值有一样的奉献)。F(u)的M项中的每一个被称为变换的频率分量。使用术语频率域和频率成分与时间域和时间成分没有差异,假设x是一个时间变量,可以用它来表示f(x)的域和值。二维DFT及其反变换一维离散傅里叶变换及其反变换向二维扩展是简单明了的。一个图像尺寸为MXN的函数f(x,y)的离散傅里叶变换由以下等式给出:3yX1J=L("一/2.v-N/2)其中Z表示引文中的傅里叶变换。这个等式说明£优)(-1/傅里叶变换的原点即F(

4、0,0)被设置在u=M/2和v=N/2上。换句话说,用(-1)x+y乘以f(x,y)将F(u,v)原点变换到频率坐标下的(M/2;N/2),它是二维DFT设置的MXN区域的中心。我们将此频率域的范围指定为频率矩形,它从u=0到u=M-1从v=0到v=N-1(u和v是整数)。为了确保挪动后的坐标为整数,要求M和N为偶数。当在计算机中使用傅里叶变换时,总和的范围为u从1至ijM,v从1至ijN。实际的变换中心将为u=(M/2)+1和v=(N/2)十1。当(u,v)=(0,0)时的变换值为:尸。)=T7T7-££/(X,丁)MN即f(x,y)的平均值。换句话说,假设f(x,y)是

5、一幅图像,在原点的傅里叶变换即等于图像的平均灰度级。因为在原点处常常为零,F(0,0)有时称做频率谱的直流成分。理解了傅里叶变化,下面看看为什么要在频率域研究图像增强。1 .可以利用频率成分和图像外表之间的对应关系。一些在空间域表述困难的增强任务,在频率域中变得非常普通。2 .滤波在频率域更为直观,它可以解释空间域滤波的某些性质。3 .可以在频率域指定滤波器,做反变换,然后在空间域使用结果滤波器作为空间域滤波器的指导。4 .一旦通过频率域试验选择了空间滤波,通常施行都在空间域进展。在冈萨雷斯版数字图像处理里面的解释就非常的形象:一个恰当的比喻是将傅里叶变换比作一个玻璃棱镜。棱镜是可以将光分解为

6、不同颜色的物理仪器,每个成分的颜色由波长或频率来决定。傅里叶变换可以看作是数学上的棱镜,将函数基于频率分解为不同的成分。当我们考虑光时,讨论它的光谱或频率谱。同样,傅立叶变换使我们能通过频率成分来分析一个函数。傅立叶变换在图像处理中有非常非常的作用。因为不仅傅立叶分析涉及图像处理的很多方面,傅立叶的改进算法,比方离散余弦变换,gabor与小波在图像处理中也有重要的分量。傅立叶变换在图像处理以下几个话题都有重要作用:1 .图像增强与图像去噪绝大局部噪音都是图像的高频分量,通过低通滤波器来滤除高频噪声;边缘也是图像的高频分量,可以通过添加高频分量来增强原始图像的边缘;2 .图像分割之边缘检测提取图

7、像高频分量3 .图像特征提取:形状特征:傅里叶描绘子纹理特征:直接通过傅里叶系数来计算纹理特征其他特征:将提取的特征值进展傅里叶变换来使特征具有平移、伸缩、旋转不变性4 .图像压缩可以直接通过傅里叶系数来压缩数据;常用的离散余弦变换是傅立叶变换的实变换;5 .信号在频率域的表现在频域中,频率越大说明原始信号变化速度越快;频率越小说明原始信号越平缓。当频率为0时,表示直流信号,没有变化。因此,频率的大小反响了信号的变化快慢。高频分量解释信号的突变局部,而低频分量决定信号的整体形象。在图像处理中,频域反响了图像在空域灰度变化剧烈程度,也就是图像灰度的变化速度,也就是图像的梯度大小。对图像而言,图像

8、的边缘局部是突变局部,变化较快,因此反响在频域上是高频分量;图像的噪声大局部情况下是高频局部;图像平缓变化局部那么为低频分量。也就是说,傅立叶变换提供另外一个角度来观察图像,可以将图像从灰度分布转化到频率分布上来观察图像的特征。书面一点说就是,傅里叶变换提供了一条从空域到频率自由转换的途径。对图像处理而言,以下概念非常的重要:图像高频分量:图像突变局部;在某些情况下指图像边缘信息,某些情况下指噪声,更多是两者的混合;低频分量:图像变化平缓的局部,也就是图像轮廓信息高通滤波器:让图像使低频分量抑制,高频分量通过低通滤波器:与高通相反,让图像使高频分量抑制,低频分量通过带通滤波器:使图像在某一局部

9、的频率信息通过,其他过低或过高都抑制还有个带阻滤波器,是带通的反。6 .图像去噪图像去噪就是压制图像的噪音局部。因此,假设噪音是高频额,从频域的角度来看,就是需要用一个低通滤波器对图像进展处理。通过低通滤波器可以抑制图像的高频分量。但是这种情况下常常会造成边缘信息的抑制。常见的去噪模板有均值模板,高斯模板等。这两种滤波器都是在局部区域抑制图像的高频分量,模糊图像边缘的同时也抑制了噪声。还有一种非线性滤波-中值滤波器。中值滤波器对脉冲型噪声有很好的去掉。因为脉冲点都是突变的点,排序以后输出中值,那么那些最大点和最小点就可以去掉了。中值滤波对高斯噪音效果较差。椒盐噪声:对于椒盐采用中值滤波可以很好

10、的去除。用均值也可以获得一定的效果,但是会引起边缘的模糊。高斯白噪声:白噪音在整个频域的都有分布,好似比较困难。7 .图像增强有时候感觉图像增强与图像去噪是一对矛盾的过程,图像增强经常是需要增强图像的边缘,以获得更好的显示效果,这就需要增加图像的高频分量。而图像去噪是为了消除图像的噪音,也就是需要抑制高频分量。有时候这两个又是指类似的事情。比方说,消除噪音的同时图像的显示效果显著的提升了,那么,这时候就是同样的意思了。常见的图像增强方法有比照度拉伸,直方图平衡化,图像锐化等。前面两个是在空域进展基于像素点的变换,后面一个是在频域处理。我理解的锐化就是直接在图像上加上图像高通滤波后的分量,也就是

11、图像的边缘效果。比照度拉伸和直方图平衡化都是为了进步图像的比照度,也就是使图像看起来差异更明显一些,我想,经过这样的处理以后,图像也应该增强了图像的高频分量,使得图像的细节上差异更大。同时也引入了一些噪音。最后讨论一以下图像傅立叶变换的物理意义图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域,对应的频率值较高。傅立叶变换在实际中有非常明显的物理意义,设f是一个能量有限的模拟信号,那么其傅立叶变换就表示f的谱。从纯粹的数学意义上看,傅立叶变换

12、是将一个函数转换为一系列周期函数来处理的。从物理效果看,傅立叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。换句话说,傅立叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数,傅立叶逆变换是将图像的频率分布函数变换为灰度分布函数。最后附上傅里叶变换的一个例子。原始图像DFT通过上面的DFT变换可以看到:图像信号能量将集中在系数矩阵的四个角上。这是由二维傅立叶变换本身性质决定的。同时也说明一股图像能量集中低频区域。FT原点居中经过变换之后的图像在原点平移之前四角是低频,最亮,平移之后中间局部是低频,最亮,亮度大说明低频的能量大。傅立叶变换在图像处理中有非常非常

13、的作用。因为不仅傅立叶分析涉及图像处理的很多方面,傅立叶的改进算法,比方离散余弦变换,gabor与小波在图像处理中也有重要的分量。印象中,傅立叶变换在图像处理以下几个话题都有重要作用:1 .图像增强与图像去噪绝大局部噪音都是图像的高频分量,通过低通滤波器来滤除高频噪声;边缘也是图像的高频分量,可以通过添加高频分量来增强原始图像的边缘;2 .图像分割之边缘检测提取图像高频分量3 .图像特征提取:形状特征:傅里叶描绘子纹理特征:直接通过傅里叶系数来计算纹理特征其他特征:将提取的特征值进展傅里叶变换来使特征具有平移、伸缩、旋转不变性4 .图像压缩可以直接通过傅里叶系数来压缩数据;常用的离散余弦变换是

14、傅立叶变换的实变换;傅立叶变换傅里叶变换是将时域信号分解为不同频率的正弦信号或余弦函数叠加之和。连续情况下要求原始信号在一个周期内满足绝对可积条件。离散情况下,傅里叶变换一定存在。冈萨雷斯版图像处理里面的解释非常形象:一个恰当的比喻是将傅里叶变换比作一个玻璃棱镜。棱镜是可以将光分解为不同颜色的物理仪器,每个成分的颜色由波长或频率来决定。傅里叶变换可以看作是数学上的棱镜,将函数基于频率分解为不同的成分。当我们考虑光时,讨论它的光谱或频率谱。同样,傅立叶变换使我们能通过频率成分来分析一个函数。傅立叶变换有很多优良的性质。比方线性,对称性可以用在计算信号的傅里叶变换里面;时移性:函数在时域中的时移,

15、对应于其在频率域中附加产生的相移,而幅度频谱那么保持不变;频移性:函数在时域中乘以eAjwt,可以使整个频谱搬移wo这个也叫调制定理,通讯里面信号的频分复用需要用到这个特性将不同的信号调制到不同的频段上同时传输;卷积定理:时域卷积等于频域乘积;时域乘积等于频域卷积附加一个系数。图像处理里面这个是个重点信号在频率域的表现在频域中,频率越大说明原始信号变化速度越快;频率越小说明原始信号越平缓。当频率为0时,表示直流信号,没有变化。因此,频率的大小反响了信号的变化快慢。高频分量解释信号的突变局部,而低频分量决定信号的整体形象。在图像处理中,频域反响了图像在空域灰度变化剧烈程度,也就是图像灰度的变化速

16、度,也就是图像的梯度大小。对图像而言,图像的边缘局部是突变局部,变化较快,因此反响在频域上是高频分量;图像的噪声大局部情况下是高频局部;图像平缓变化局部那么为低频分量。也就是说,傅立叶变换提供另外一个角度来观察图像,可以将图像从灰度分布转化到频率分布上来观察图像的特征。书面一点说就是,傅里叶变换提供了一条从空域到频率自由转换的途径。对图像处理而言,以下概念非常的重要:图像高频分量:图像突变局部;在某些情况下指图像边缘信息,某些情况下指噪声,更多是两者的混合;低频分量:图像变化平缓的局部,也就是图像轮廓信息高通滤波器:让图像使低频分量抑制,高频分量通过低通滤波器:与高通相反,让图像使高频分量抑制

17、,低频分量通过带通滤波器:使图像在某一局部的频率信息通过,其他过低或过高都抑制还有个带阻滤波器,是带通的反。模板运算与卷积定理在时域内做模板运算,实际上就是对图像进展卷积。模板运算是图像处理一个很重要的处理过程,很多图像处理过程,比方增强/去噪这两个分不清楚,边缘检测中普遍用到。根据卷积定理,时域卷积等价与频域乘积。因此,在时域内对图像做模板运算就等效于在频域内对图像做滤波处理。比方说一个均值模板,其频域响应为一个低通滤波器;在时域内对图像作均值滤波就等效于在频域内对图像用均值模板的频域响应对图像的频域响应作一个低通滤波。图像去噪图像去噪就是压制图像的噪音局部。因此,假设噪音是高频额,从频域的

18、角度来看,就是需要用一个低通滤波器对图像进展处理。通过低通滤波器可以抑制图像的高频分量。但是这种情况下常常会造成边缘信息的抑制。常见的去噪模板有均值模板,高斯模板等。这两种滤波器都是在局部区域抑制图像的高频分量,模糊图像边缘的同时也抑制了噪声。还有一种非线性滤波-中值滤波器。中值滤波器对脉冲型噪声有很好的去掉。因为脉冲点都是突变的点,排序以后输出中值,那么那些最大点和最小点就可以去掉了。中值滤波对高斯噪音效果较差。椒盐噪声:对于椒盐采用中值滤波可以很好的去除。用均值也可以获得一定的效果,但是会引起边缘的模糊。高斯白噪声:白噪音在整个频域的都有分布,好似比较困难。冈萨雷斯幅员像处理P185:算术

19、均值滤波器和几何均值滤波器尤其是后者更适宜于处理高斯或者均匀的随机噪声。谐波均值滤波器更适宜于处理脉冲噪声。图像增强有时候感觉图像增强与图像去噪是一对矛盾的过程,图像增强经常是需要增强图像的边缘,以获得更好的显示效果,这就需要增加图像的高频分量。而图像去噪是为了消除图像的噪音,也就是需要抑制高频分量。有时候这两个又是指类似的事情。比方说,消除噪音的同时图像的显示效果显著的提升了,那么,这时候就是同样的意思了。常见的图像增强方法有比照度拉伸,直方图平衡化,图像锐化等。前面两个是在空域进展基于像素点的变换,后面一个是在频域处理。我理解的锐化就是直接在图像上加上图像高通滤波后的分量,也就是图像的边缘

20、效果。比照度拉伸和直方图平衡化都是为了进步图像的比照度,也就是使图像看起来差异更明显一些,我想,经过这样的处理以后,图像也应该增强了图像的高频分量,使得图像的细节上差异更大。同时也引入了一些噪音。* /函数名称:* LowPassFilter()* /输入参数:* LPSTRIpDIBBits-指向需要滤波的图像像素指针* intnWidth-数据宽度* intnHeight-数据高度* intnRadius-理想低通滤波的滤波半径* /返回值:* BOOL/成功返回TRUE,否那么返回FALSE。* /说明:* lpD旧Bits是指向需要滤波的图像像素指针。* 经过低通滤波的数据仍然存储在I

21、pDIBBits当中*/BOOLLowPassFilter(LPSTRIpDIBBits,LONGnWidth,LONGnHeight,intnRadius)unsignedchar*IpSrc;/指向源图像的指针inty;/循环控制变量intx;/循环控制变量doubledTmpOne;doubledTmpTwo;intnTransWidth;intnTransHeight;doubleunchValue;/存放临时变量/存放临时变量/傅立叶变换的宽度2的整数次曷/傅立叶变换的高度2的整数次曷/存贮图像各像素灰度的临时变量complex<double>*pCTData;/comp

22、lex<double>*pCFData;/指向时域数据的指针指向频域数据的指针/计算进展傅立叶变换的点数-横向2的整数次曷dTmpOne=log(nWidth)/log(2);dTmpTwo=ceil(dTmpOne);dTmpTwo=pow(2,dTmpTwo);nTransWidth=(int)dTmpTwo;/计算进展傅立叶变换的点数-纵向2的整数次曷dTmpOne=log(nHeight)/log(2);dTmpTwo=ceil(dTmpOne);dTmpTwo=pow(2,dTmpTwo);nTransHeight=(int)dTmpTwo;doubledReal;/傅立

23、叶变换的实部doubledImag;/傅立叶变换的虚部/低通滤波的半径不能超过频域的最大半径if(nRadius>(nTransWidth/2)|nRadius>(nTransHeight/2)return(false);/返回FALSEpCTData二newcomplex<double>nTransWidth*nTransHeight;/分配内存pCFData二newcomplex<double>nTransWidth*nTransHeight;/分配内存/图像数据的宽和高不一定是2的整数次曷,所以pCTData有一局部数据需要补0for(y=0;yvnT

24、ransHeight;y+)for(x=0;x<nTransWidth;x+)pCTDatay*nTransWidth+x=complex<double>(0,0);/补零把图像数据传给pCTDatafor(y=0;yvnHeight;y+)for(x=0;x<nWidth;x+)/指向DIB第y行,第x个象素的指针IpSrc=(unsignedchar*)lpDIBBits+nWidth*(nHeight-1-y)+x;unchValue=*lpSrc;pCTDatay*nTransWidth+x=complex<double>(unchValue,0);

25、FFT_2D(pCTData,nWidth,nHeight,pCFData);/傅立叶正变换for(x=0;x<nTransWidth;x+)/开始施行理想的低通滤波for(y=nRadius;y<nTransHeight-nRadius;y+)/把纵向所有大于nRadius2的高频分量设置为0pCFDatax*nTransHeight+y=complex<double>(0,0);for(x=nRadius;x<nTransWidth-nRadius;x+)for(y=0;y<nTransHeight;y+)/把横向所有大于nRadiusI的高频分量设置为

26、0pCFDatax*nTransHeight+y=complex<double>(0,0);IFFT_2D(pCFData,pCTData,nHeight,nWidth);/经过低通滤波的图象进展反变换for(y=0;y<nHeight;y+)/反变换的数据传给IpDIBBitsfor(x=0;x<nWidth;x+)/需要考虑信号的正负问题以及实际所用的图象数据是灰度值还是原始数据dReal=pCTDatay*nTransWidth+x.real();/实部dImag=pCTDatay*nTransWidth+x.imag();/虚部unchValue二dReal;/

27、指向DIB第y行,第x个象素的指针lpSrc=(unsignedchar*)lpDIBBits+nWidth*(nHeight-1-y)+x;*lpSrc二unchValue;deletepCTData;/释放内存deletepCFData;/释放内存pCTData=NULL;pCFData=NULL;return (true);/返回结果/*/函数名称:* ButterWorthLowPass()* /输入参数:* LPSTRlpD旧Bits-指向需要滤波的图像像素指针* intnWidth-数据宽度* intnHeight-数据高度* intnRadius-ButterWorth低通滤波的

28、"半功率"点* /返回值:* BOOL/成功返回TRUE,否那么返回FALSE。* /说明:*pDIBBits是指向需要滤波的图像像素指针。*经过ButterWorth低通滤波的数据仍然存储在IpDIBBits当中*/BOOLButterWorthLowPass(LPSTRIpDIBBits,LONGnWidth,LONGnHeight,intnRadius)unsignedchar*IpSrc;/指向源图像的指针inty;/循环控制变量intx;/循环控制变量doubledTmpOne;/存放临时变量doubledTmpTwo;/存放临时变量doubleH;/Butter

29、Worth滤波系数intnTransWidth;/傅立叶变换的宽度2的整数次曷intnTransHeight;/傅立叶变换的高度2的整数次曷doubledReal;/傅立叶变换的实部doubledImag;/傅立叶变换的虚部doubleunchValue;/存贮图像各像素灰度的临时变量complex<double>*pCTData;/指向时域数据的指针complex<double>*pCFData;/指向频域数据的指针/计算进展傅立叶变换的点数-横向2的整数次曷dTmpOne=log(nWidth)/log(2);dTmpTwo=ceil(dTmpOne);dTmpTw

30、o=pow(2,dTmpTwo);nTransWidth=(int)dTmpTwo;/计算进展傅立叶变换的点数-纵向2的整数次曷dTmpOne=log(nHeight)/log(2);dTmpTwo=ceil(dTmpOne);dTmpTwo=pow(2,dTmpTwo);nTransHeight=(int)dTmpTwo;/低通滤波的半径不能超过频域的最大半径if(nRadius>(nTransWidth/2)|nRadius>(nTransHeight/2)return(false);/返回FALSEpCTData二newcomplex<double>nTransW

31、idth*nTransHeight;/分配内存pCFData二newcomplex<double>nTransWidth*nTransHeight;/分配内存/图像数据的宽和高不一定是2的整数次曷,所以pCTData有一局部数据需要补0for(y=0;yvnTransHeight;y+)for(x=0;x<nTransWidth;x+)pCTDatay*nTransWidth+x=complex<double>(0,0);/补零for(y=0;yvnHeight;y+)/把图像数据传给pCTDatafor(x=0;x<nWidth;x+)/指向DIB第y行,

32、第x个象素的指针IpSrc=(unsignedchar*)lpDIBBits+nWidth*(nHeight-1-y)+x;unchValue=*lpSrc;pCTDatay*nTransWidth+x=complex<double>(unchValue,0);FFT_2D(pCTData,nWidth,nHeight,pCFData);/傅立叶正变换for(y=0;y<nTransHeight;y+)/开始施行ButterWorth低通滤波for(x=0;x<nTransWidth;x+)H=(double)(y*y+x*x);H=H/(nRadius*nRadius

33、);H=1/(1+H);求H值pCFDatay*nTransWidth+x=complex<double>(pCFDatay*nTransWidth+x.real()*H,pCFDatay*nTransWidth+x.imag()*H);/经过ButterWorth低通滤波的图象进展反变换IFFT_2D(pCFData,pCTData,nWidth,nHeight);for(y=0;y<nHeight;y+)/反变换的数据传给IpDIBBitsfor(x=0;x<nWidth;x+)dReal=pCTDatay*nTransWidth+x.real();dImag=pC

34、TDatay*nTransWidth+x.imag();unchValue=max(0,min(255,sqrt(dReal*dReal+dImag*dImag);/指向DIB第y行,第x个象素的指针IpSrc=(unsignedchar*)lpDIBBits+nWidth*(nHeight-1-y)+x;*IpSrc二unchValue;deletepCTData;/释放内存deletepCFData;/释放内存pCTData=NULL;pCFData=NULL;return(true);/返回结果/* /函数名称:* GaussLowPass()* /输入参数:* LPSTRlpD旧Bit

35、s-指向需要滤波的图像像素指针* intnWidth-数据宽度* intnHeight-数据高度* intnRadius-Gauss低通滤波的"半功率"点* /返回值:* BOOL/成功返回TRUE,否那么返回FALSE。*/说明:*pDIBBits是指向需要滤波的图像像素指针。*经过Gauss低通滤波的数据仍然存储在IpDIBBits当中。*/BOOLGaussLowPass(LPSTRIpDIBBits,LONGnWidth,LONGnHeight,intnRadius)unsignedchar*IpSrc;/指向源图像的指针inty;/循环控制变量intx;/循环控制

36、变量doubledTmpOne;/存放临时变量doubledTmpTwo;/存放临时变量doubleH;/ButterWorth滤波系数intnTransWidth;/傅立叶变换的宽度2的整数次曷intnTransHeight;/傅立叶变换的高度2的整数次曷doubledReal;/傅立叶变换的实部doubledImag;/傅立叶变换的虚部doubleunchValue;/存贮图像各像素灰度的临时变量complex<double>*pCTData;/指向时域数据的指针complex<double>*pCFData;/指向频域数据的指针/计算进展傅立叶变换的点数-横向2的

37、整数次曷dTmpOne=log(nWidth)/log(2);dTmpTwo=ceil(dTmpOne);dTmpTwo=pow(2,dTmpTwo);nTransWidth=(int)dTmpTwo;/计算进展傅立叶变换的点数-纵向2的整数次曷dTmpOne=log(nHeight)/log(2);dTmpTwo=ceil(dTmpOne);dTmpTwo=pow(2,dTmpTwo);nTransHeight=(int)dTmpTwo;/低通滤波的半径不能超过频域的最大半径if(nRadius>(nTransWidth/2)|nRadius>(nTransHeight/2)re

38、turn(false);/返回FALSEpCTData二newcomplex<double>nTransWidth*nTransHeight;/分配内存pCFData二newcomplex<double>nTransWidth*nTransHeight;/分配内存/图像数据的宽和高不一定是2的整数次曷,所以pCTData有一局部数据需要补0for(y=0;yvnTransHeight;y+)for(x=0;x<nTransWidth;x+)补零pCTDatay*nTransWidth+x=complex<double>(0,0);/for(y=0;y&

39、lt;nHeight;y+)/把图像数据传给pCTDatafor(x=0;x<nWidth;x+)/指向DIB第y行,第x个象素的指针IpSrc=(unsignedchar*)lpDIBBits+nWidth*(nHeight-1-y)+x;unchValue=*lpSrc;pCTDatay*nTransWidth+x=complex<double>(unchValue,0);FFT_2D(pCTData,nWidth,nHeight,pCFData);/傅立叶正变换for(y=0;y<nTransHeight;y+)/开始施行Gauss低通滤波for(x=0;x<

40、;nTransWidth;x+)H=(double)(y*y+x*x);H=H/(2*nRadius*nRadius);H=exp(-H);求H值pCFDatay*nTransWidth+x=complex<double>(pCFDatay*nTransWidth+x.real()*H,pCFDatay*nTransWidth+x.imag()*H);/经过Gauss低通滤波的图象进展反变换IFFT_2D(pCFData,pCTData,nWidth,nHeight);for(y=0;y<nHeight;y+)/反变换的数据传给IpDIBBitsfor(x=0;x<nW

41、idth;x+)dReal=pCTDatay*nTransWidth+x.real();dImag=pCTDatay*nTransWidth+x.imag();unchValue=max(0,min(255,sqrt(dReal*dReal+dImag*dImag);/指向DIB第y行,第x个象素的指针IpSrc=(unsignedchar*)lpDIBBits+nWidth*(nHeight-1-y)+x;*lpSrc二unchValue;deletepCTData;/释放内存deletepCFData;/释放内存pCTData=NULL;pCFData=NULL;return(true);

42、/返回结果/* /函数名称:* HighPassFilter()* /输入参数:* LPSTRlpDIBBits-指向需要滤波的图像像素指针* intnWidth-数据宽度* intnHeight-数据高度* intnRadius-理想高通滤波的滤波半径* /返回值:* BOOL/成功返回TRUE,否那么返回FALSE。* /说明:* lpDIBBits是指向需要滤波的图像像素指针。* 经过高通滤波的数据仍然存储在lpDIBBits当中。*/BOOLHighPassFilter(LPSTRlpDIBBits,LONGnWidth,LONGnHeight,intnRadius)unsignedc

43、har*lpSrc;/指向源图像的指针inty;/循环控制变量double dTmpOne ; double dTmpTwo ; int nTransWidth ;int nTransHeight;double unchValue;intx;/循环控制变量/存放临时变量/存放临时变量/傅立叶变换的宽度2的整数次曷/傅立叶变换的高度2的整数次曷/存贮图像各像素灰度的临时变量指向时域数据的指针指向频域数据的指针2的整数次曷2的整数次曷complex<double>*pCTData;/complex<double>*pCFData;/计算进展傅立叶变换的点数横向dTmpOne

44、=log(nWidth)/log(2);dTmpTwo=ceil(dTmpOne);dTmpTwo=pow(2,dTmpTwo);nTransWidth=(int)dTmpTwo;/计算进展傅立叶变换的点数纵向dTmpOne=log(nHeight)/log(2);dTmpTwo=ceil(dTmpOne);dTmpTwo=pow(2,dTmpTwo);nTransHeight=(int)dTmpTwo;doubledReal;/傅立叶变换的实部doubledImag;/傅立叶变换的虚部/滤波的半径不能超过频域的最大半径if(nRadius>nTransWidth-1|nRadius&g

45、t;nTransHeight-1)return(false);/返回falsepCTData二newcomplex<double>nTransWidth*nTransHeight;/分配内存pCFData二newcomplex<double>nTransWidth*nTransHeight;/分配内存/图像数据的宽和高不一定是2的整数次曷,所以pCTData有一局部数据需要补0for(y=0;yvnTransHeight;y+)for(x=0;x<nTransWidth;x+)补零pCTDatay*nTransWidth+x=complex<double&g

46、t;(0,0);/for(y=0;y<nHeight;y+)/把图像数据传给pCTDatafor(x=0;x<nWidth;x+)/指向DIB第y行,第x个象素的指针IpSrc=(unsignedchar*)lpDIBBits+nWidth*(nHeight-1-y)+x;unchValue=*lpSrc;pCTDatay*nTransWidth+x=complex<double>(unchValue,0);FFT_2D(pCTData,nWidth,nHeight,pCFData);/傅立叶正变换for(x=0;x<nTransWidth;x+)/开始施行理想的

47、高通滤波for(y=0;y<nRadius;y+)把纵向所有小于nRadius的低频分量设置为0pCFDatax*nTransHeight+y=complex<double>(0,0);for(y二nTransHeight-1-nRadius;y<nTransHeight;y+)pCFDatax*nTransHeight+y=complex<double>(0,0);for(x=0;x<nRadius;x+)把横向所有小于nRadius的低频分量设置为0for(y=0;y<nTransHeight;y+)pCFDatax*nTransHeight

48、+y=complex<double>(0,0);for(x=nTransWidth-nRadius;x<nTransWidth;x+)for(y=0;y<nTransHeight;y+)pCFDatax*nTransHeight+y=complex<double>(0,0);IFFT_2D(pCFData,pCTData,nHeight,nWidth);/经过高通滤波的图象进展反变换for(y=0;y<nHeight;y+)/反变换的数据传给IpDIBBitsfor(x=0;x<nWidth;x+)/需要考虑信号的正负问题以及实际所用的图象数据是

49、灰度值还是原始数据dReal=pCTDatay*nTransWidth+x.real();dImag=pCTDatay*nTransWidth+x.imag();unchValue二dReal;/指向DIB第y行,第x个象素的指针lpSrc=(unsignedchar*)lpDIBBits+nWidth*(nHeight-1-y)+x;*lpSrc二unchValue;deletepCTData;/释放内存deletepCFData;/释放内存pCTData=NULL;pCFData=NULL;return (true);/ 返回结果/*/函数名称:* ButterWorthHighPass(

50、)* /输入参数:* LPSTRlpD旧Bits-指向需要滤波的图像像素指针* intnWidth-数据宽度* intnHeight-数据高度* intnRadius-ButterWorth高通滤波的"半功率"点* /返回值:* BOOL/成功返回TRUE,否那么返回FALSE。*/说明:*pDIBBits是指向需要滤波的图像像素指针。*经过ButterWorth低通滤波的数据仍然存储在IpDIBBits当中*/*BOOLButterWorthHighPass(LPSTRIpDIBBits,LONGnWidth,LONGnHeight,intnRadius)unsigned

51、char*IpSrc;/指向源图像的指针inty;/循环控制变量intx;/循环控制变量doubledTmpOne;/存放临时变量doubledTmpTwo;/存放临时变量doubleH;/ButterWorth滤波系数intnTransWidth;/傅立叶变换的宽度2的整数次曷intnTransHeight;/傅立叶变换的高度2的整数次曷doubledReal;/傅立叶变换的实部doubledImag;/傅立叶变换的虚部doubleunchValue;/存贮图像各像素灰度的临时变量complex<double>*pCTData;/指向时域数据的指针complex<doubl

52、e>*pCFData;/指向频域数据的指针/计算进展傅立叶变换的点数-横向2的整数次曷dTmpOne=log(nWidth)/log(2);dTmpTwo=ceil(dTmpOne);dTmpTwo=pow(2,dTmpTwo);nTransWidth=(int)dTmpTwo;/计算进展傅立叶变换的点数-纵向2的整数次曷dTmpOne=log(nHeight)/log(2);dTmpTwo=ceil(dTmpOne);dTmpTwo=pow(2,dTmpTwo);nTransHeight=(int)dTmpTwo;pCTData二newcomplex<double>nTra

53、nsWidth*nTransHeight;/分配内存pCFData二newcomplex<double>nTransWidth*nTransHeight;/分配内存/图像数据的宽和高不一定是2的整数次曷,所以pCTData有一局部数据需要补0for(y=0;yvnTransHeight;y+)for(x=0;x<nTransWidth;x+)pCTDatay*nTransWidth+x=complex<double>(0,0);/补零for(y=0;yvnHeight;y+)/把图像数据传给pCTDatafor(x=0;x<nWidth;x+)/指向DIB第y行,第x个象素的指针IpSrc=(unsignedchar*)lpDIBBits+nWidth*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论