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

下载本文档

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

文档简介

傅里叶变换与数字图像处理 (2012-05-24 20:06:24)转载标签:it傅里叶变换是将时域信号分解为不同频率的正弦和/余弦和的形式。傅里叶变换是数字图像处理技术的基础,其通过在时域和频域来回切换图像,对图像的信息特征进行提取和分析。一维傅里叶变换及其反变换单变量连续函数,f(x)的傅里叶变换F(u)定义为等式:u=0,1,2,M一1同样,给出F(u), 能用反DFT来获得原函数:其中,u=0,1,2,M一1。因此,我们看到傅里叶变换的每项即对于每个u值,F(u)的值由f(x)函数所有值的和组成。f(x)的值则与各种频率的正弦值和余弦值相乘。F(u)值的范围覆盖的域(u的值)称为频率域,因为u决定了变换的频率成分(x也作用于频率,但它们相加,对每个u值有相同的贡献)。F(u)的M项中的每一个被称为变换的频率分 量。使用术语“频率域”和“频率成分”与“时间域”和“时间成分”没有差别,如果x是一个时间变量,可以用它来表示f(x)的域和值。二维DFT及其反变换一维离散傅里叶变换及其反变换向二 维扩展是简单明了的。一个图像尺寸为MN的 函数f(x,y)的离散傅里叶变换由以下等 式给出:像 在一维中的情形一样,此表达式必须对u值(u=0,1,2,M-1)和v值(v=0,1,2,N-1)计算。同样,给出F(u,v),可以通过反傅 里叶变换获得,f(x,y),由表 达 式给 出:其中,x=0,1,2,M-1,y=0,1,2,N-1。变量u和v是变换或频率变量,x和y是空间或图像变量。正如在一维中的情形那样,常量1MN的位置并不重要,有时它在反变换之前。其他时候,它被分为两个相等的常数1/根号MN,分别乘在变换和反变换的式子前。定 义傅里叶谱、相角和频率谱:并且其功率谱为:其 中,R(u,v)和I(u,v)分别是F(u,v)的实部和虚部。通 常在进行傅里叶变换之前用(-1)x+y乘以输入的图像函数。由于指数的性 质,很容易看出:其中表示引文中的傅里叶变换。这个等式说明f(x,y)(-1)x+y傅 里叶变换的原点即F(0,0)被设置在u =M2和v=N/2上。 换句话说,用(-1)x+y乘以f(x,y)将F(u,v)原点变换到频率坐标下的(M2;N/2),它是二维DFT设置的MN区 域的中心。我们将此频率域的范围指定为频率矩形,它从u=0到u=M-1从v=0到v=N-1(u和v是整数)。为了确保移动后的坐标为整数,要求M和N为偶数。当在计算机中使用傅里叶变换时,总和的范围为u从1到M,v从1到N。实际的变换中心将为u=(M2)+1和v=(N2)十1。当(u,v)=(0,0)时 的变换值为:即f(x,y)的 平均值。换句话说,如果f(x,y)是一幅图像,在原点的傅里叶变换即等于图像的平均灰度级。因为 在原点处常常为零,F(0,0)有时称做频 率谱的直流成分。了解了傅里叶变化,下面看看为什么要在频率域研究图像增强。1.可以利用频率成分和图像外表之间的对应关系。一些在空间域表述困难的增强任务,在频率域中变得非常普通。2.滤波在频率域更为直观,它可以解释空间域滤波的某些性质。3.可以在频率域指定滤波器,做反变换,然后在空间域使用结果滤波器作为空间域滤波器的指导。4.一 旦通过频率域试验选择了空间滤波,通常实施都在空间域进行。在 冈萨雷斯版里 面的解释就非常的形象:一个恰当的比喻是将傅里叶变换比作一个玻璃棱镜。棱镜是可以将光分解为不同颜色的物理仪器,每个成分的颜色由波长(或频率)来决 定。傅里叶变换可以看作是数学上的棱镜,将函数基于频率分解为不同的成分。当我们考虑光时,讨论它 的光谱或频率谱。同样, 傅立叶变换使我们能通过频率成分来分析一个函数。傅立叶变换在图像处理中有非常非常的作用。因为不仅傅立叶分析涉及图像处理的很多方面,傅立叶的改进算法,比如离散余弦变换,gabor与小波在图像处理中也有重要的分量。傅立叶变换在图像处理以下几个话题都有重要作用:1.图像增强与图像去噪绝大部分噪音都是图像 的高频分量,通过低通滤波器来滤除高频噪声; 边缘也是图像的高频分量,可以通过添加高频分量 来增强原始图像的边缘;2.图像分割之边缘检测提取图像高频分量3.图 像特征提取:形状特征:傅里叶描述子纹 理特征:直接通过傅里叶系数来计算纹理特征其他特征:将提取的特征值进行傅里叶变换来使特 征具有平移、伸缩、旋转不变性4.图像压缩可以直接通过傅里叶系数来压缩数据;常用的离散余弦变换是傅立叶变换的实变换;5.信号在频率域的表现在频域中,频率越大说明原始信号 变化速度越快;频率越小说明原始信号越平缓。当频率为0时,表示直流信号,没有变化。因此,频率的 大小反应了信号的变化快慢。高频分量解释信号的突变部分,而低频分量决定信号的整体形象。在 图像处理中,频域反应了图像在空域灰度变化剧烈程度,也就是图像灰度的变化速度,也就是图像的梯度大小。对图像而言,图像的边缘部分是突变部分,变化较 快,因此反应在频域上是高频分量;图像的噪声大部分情况下是高频部分;图像平缓变化部分则为低频分量。也就是说,傅立叶变换提供另外一个角度来观察图像, 可以将图像从灰度分布转化到频率分布上来观察图像的特征。书面一点说就是,傅里叶变换提供了一条从空域到频率自由转换的途径。对图像处理而言,以下概念非 常的重要:图像高频分量:图像突变部分;在某些情况下指图像边缘信息,某些情况 下指噪声,更多是两者的混合;低频分量:图像变化平缓的部分,也就是图像轮廓信息高通滤波器:让图像使低频分量抑制,高频分量通过低 通滤波器:与高通相反,让图像使高频分量抑制,低频分量通过带通滤波器:使图像在某一部分 的频率信息通过,其他过低或过高都抑制还有个带阻滤波器,是带通的反。6.图像去噪图 像去噪就是压制图像的噪音部分。因此,如果噪音是高频额,从频域的角度来看,就是需要用一个低通滤波器对图像进行处理。通过低通滤波器可以抑制图像的高频 分量。但是这种情况下常常会造成边缘信息的抑制。常见的去噪模板有均值模板,高斯模板等。这两种滤波器都是在局部区域抑制图像的高频分量,模糊图像边缘的 同时也抑制了噪声。还有一种非线性滤波-中值滤波器。中值滤波器对脉冲型噪声有很好的去掉。因为脉 冲点都是突变的点,排序以后输出中值,那么那些最大点和最小点就可以去掉了。中值滤波对高斯噪音效果较差。椒 盐噪声:对于椒盐采用中值滤波可以很好的去除。用均值也可以取得一定的效果,但是会引起边缘的模糊。高 斯白噪声:白噪音在整个频域的都有分布,好像比较困难。7.图像增强有时候感觉图像增强与图像去噪是一对矛盾的过程,图像增强经常是需要增强图像的边缘,以获得更好的显 示效果,这就需要增加图像的高频分量。而图像去噪是为了消除图像的噪音,也就是需要抑制高频分量。有时候这两个又是指类似的事情。比如说,消除噪音的同时 图像的显示效果显著的提升了,那么,这时候就是同样的意思了。常见的图像增强方法有对比度 拉伸,直方图均衡化,图像锐化等。前面两个是在空域进行基于像素点的变换,后面一个是在频域处理。我理解的锐化就是直接在图像上加上图像高通滤波后的分 量,也就是图像的边缘效果。对比度拉伸和直方图均衡化都是为了提高图像的对比度,也就是使图像看起来差异更明显一些,我想,经过这样的处理以后,图像也应 该增强了图像的高频分量,使得图像的细节上差异更大。同时也引入了一些噪音。最 后讨论一下图像傅立叶变换的物理意义图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对 于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域,对应的频率值较高。傅立叶变换在实际中有非常明显的物理意义,设f是一个能量有限的模拟信号,则其傅立叶变换就表示f的 谱。从纯粹的数学意义上看,傅立叶变换是将一个函数转换为一系列周期函数来处理的。从物理效果看,傅立叶变换是将图像从空间域转换到频率域,其逆变换是将 图像从频率域转换到空间域。换句话说,傅立叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数,傅立叶逆变换是将图像的频率分布函数变换为 灰度分布函数。最后附上傅里叶变换的一个例子。通过上面的DFT变换可以看到:图像信号能量将集中 在系数矩阵的四个角上。这是由二维傅立叶变换本身性质决定的。同时也表明一股图像能量集中低频区域。经过变换之后的图像在原点平移之前四角是低频,最亮,平移之后中间部分是低频,最亮,亮度大说明低频的能量大。傅立叶变换在图像处理中有非常非常的作用。因为不仅傅立叶分析涉及图像处理的很多方面,傅立叶的改进算法,比如离散余弦变换,gabor与小波在图像处理中也有重要的分量。印象中,傅立叶变换在图像处理以下几个话题都有重要作用:1.图像增强与图像去噪绝大部分噪音都是图像的高频分量,通过低通滤波器来滤除高频噪声; 边缘也是图像的高频分量,可以通过添加高频分量来增强原始图像的边缘;2.图像分割之边缘检测提取图像高频分量3.图像特征提取:形状特征:傅里叶描述子纹理特征:直接通过傅里叶系数来计算纹理特征其他特征:将提取的特征值进行傅里叶变换来使特征具有平移、伸缩、旋转不变性4.图像压缩可以直接通过傅里叶系数来压缩数据;常用的离散余弦变换是傅立叶变换的实变换;傅立叶变换傅里叶变换是将时域信号分解为不同频率的正弦信号或余弦函数叠加之和。连续情况下要求原始信号在一个周期内满足绝对可积条件。离散情况下,傅里叶变换一定存在。冈萨雷斯版里面的解释非常形象:一个恰当的比喻是将傅里叶变换比作一个玻璃棱镜。棱镜是可以将光分解为不同颜色的物理仪器,每个成分的颜色由波长(或频率)来决定。傅里叶变换可以看作是数学上的棱镜,将函数基于频率分解为不同的成分。当我们考虑光时,讨论它的光谱或频率谱。同样,傅立叶变换使我们能通过频率成分来分析一个函数。傅立叶变换有很多优良的性质。比如线性,对称性(可以用在计算信号的傅里叶变换里面);时移性:函数在时域中的时移,对应于其在频率域中附加产生的相移,而幅度频谱则保持不变;频移性:函数在时域中乘以ejwt,可以使整个频谱搬移w。这个也叫调制定理,通讯里面信号的频分复用需要用到这个特性(将不同的信号调制到不同的频段上同时传输);卷积定理:时域卷积等于频域乘积;时域乘积等于频域卷积(附加一个系数)。(图像处理里面这个是个重点)信号在频率域的表现在频域中,频率越大说明原始信号变化速度越快;频率越小说明原始信号越平缓。当频率为0时,表示直流信号,没有变化。因此,频率的大小反应了信号的变化快慢。高频分量解释信号的突变部分,而低频分量决定信号的整体形象。在图像处理中,频域反应了图像在空域灰度变化剧烈程度,也就是图像灰度的变化速度,也就是图像的梯度大小。对图像而言,图像的边缘部分是突变部分,变化较快,因此反应在频域上是高频分量;图像的噪声大部分情况下是高频部分;图像平缓变化部分则为低频分量。也就是说,傅立叶变换提供另外一个角度来观察图像,可以将图像从灰度分布转化到频率分布上来观察图像的特征。书面一点说就是,傅里叶变换提供了一条从空域到频率自由转换的途径。对图像处理而言,以下概念非常的重要:图像高频分量:图像突变部分;在某些情况下指图像边缘信息,某些情况下指噪声,更多是两者的混合;低频分量:图像变化平缓的部分,也就是图像轮廓信息高通滤波器:让图像使低频分量抑制,高频分量通过低通滤波器:与高通相反,让图像使高频分量抑制,低频分量通过带通滤波器:使图像在某一部分的频率信息通过,其他过低或过高都抑制还有个带阻滤波器,是带通的反。模板运算与卷积定理在时域内做模板运算,实际上就是对图像进行卷积。模板运算是图像处理一个很重要的处理过程,很多图像处理过程,比如增强/去噪(这两个分不清楚),边缘检测中普遍用到。根据卷积定理,时域卷积等价与频域乘积。因此,在时域内对图像做模板运算就等效于在频域内对图像做滤波处理。比如说一个均值模板,其频域响应为一个低通滤波器;在时域内对图像作均值滤波就等效于在频域内对图像用均值模板的频域响应对图像的频域响应作一个低通滤波。图像去噪图像去噪就是压制图像的噪音部分。因此,如果噪音是高频额,从频域的角度来看,就是需要用一个低通滤波器对图像进行处理。通过低通滤波器可以抑制图像的高频分量。但是这种情况下常常会造成边缘信息的抑制。常见的去噪模板有均值模板,高斯模板等。这两种滤波器都是在局部区域抑制图像的高频分量,模糊图像边缘的同时也抑制了噪声。还有一种非线性滤波-中值滤波器。中值滤波器对脉冲型噪声有很好的去掉。因为脉冲点都是突变的点,排序以后输出中值,那么那些最大点和最小点就可以去掉了。中值滤波对高斯噪音效果较差。椒盐噪声:对于椒盐采用中值滤波可以很好的去除。用均值也可以取得一定的效果,但是会引起边缘的模糊。高斯白噪声:白噪音在整个频域的都有分布,好像比较困难。冈萨雷斯版图像处理P185:算术均值滤波器和几何均值滤波器(尤其是后者)更适合于处理高斯或者均匀的随机噪声。谐波均值滤波器更适合于处理脉冲噪声。图像增强有时候感觉图像增强与图像去噪是一对矛盾的过程,图像增强经常是需要增强图像的边缘,以获得更好的显示效果,这就需要增加图像的高频分量。而图像去噪是为了消除图像的噪音,也就是需要抑制高频分量。有时候这两个又是指类似的事情。比如说,消除噪音的同时图像的显示效果显著的提升了,那么,这时候就是同样的意思了。常见的图像增强方法有对比度拉伸,直方图均衡化,图像锐化等。前面两个是在空域进行基于像素点的变换,后面一个是在频域处理。我理解的锐化就是直接在图像上加上图像高通滤波后的分量,也就是图像的边缘效果。对比度拉伸和直方图均衡化都是为了提高图像的对比度,也就是使图像看起来差异更明显一些,我想,经过这样的处理以后,图像也应该增强了图像的高频分量,使得图像的细节上差异更大。同时也引入了一些噪音。* /函数名称:* LowPassFilter()* /输入参数:* LPSTR lpDIBBits- 指向需要滤波的图像像素指针* int nWidth- 数据宽度* int nHeight- 数据高度* int nRadius- 理想低通滤波的滤波半径* /返回值:* BOOL/ 成功返回TRUE,否则返回FALSE。* /说明:* lpDIBBits 是指向需要滤波的图像像素指针。* 经过低通滤波的数据仍然存储在lpDIBBits 当中。*/BOOL LowPassFilter(LPSTR lpDIBBits, LONG nWidth, LONG nHeight,int nRadius)unsigned char*lpSrc;/ 指向源图像的指针int y ;/ 循环控制变量int x ;/ 循环控制变量double dTmpOne ;/存放临时变量double dTmpTwo ;/存放临时变量int nTransWidth ;/ 傅立叶变换的宽度(2的整数次幂)int nTransHeight;/ 傅立叶变换的高度(2的整数次幂)double unchValue;/ 存贮图像各像素灰度的临时变量complex * pCTData ;/ 指向时域数据的指针complex * 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;double dReal;/ 傅立叶变换的实部double dImag;/ 傅立叶变换的虚部/ 低通滤波的半径不能超过频域的最大半径if(nRadius (nTransWidth/2) | nRadius (nTransHeight/2) )return (false);/ 返回FALSEpCTData=new complexnTransWidth * nTransHeight;/ 分配内存pCFData=new complexnTransWidth * nTransHeight;/ 分配内存/ 图像数据的宽和高不一定是2的整数次幂,所以pCTData有一部分数据需要补0for(y=0; ynTransHeight; y+)for(x=0; xnTransWidth; x+)pCTDatay*nTransWidth + x=complex(0,0);/ 补零/把图像数据传给pCTDatafor(y=0; ynHeight; y+)for(x=0; xnWidth; x+)/ 指向DIB第y行,第x个象素的指针lpSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;unchValue = *lpSrc;pCTDatay*nTransWidth + x=complex(unchValue,0);FFT_2D(pCTData, nWidth, nHeight, pCFData) ;/ 傅立叶正变换 for(x=0;xnTransWidth;x+)/开始实施理想的低通滤波for(y=nRadius;ynTransHeight-nRadius;y+)/ 把纵向所有大于nRadius2的高频分量设置为0pCFDatax*nTransHeight + y=complex(0,0);for(x=nRadius;xnTransWidth-nRadius;x+)for(y=0;ynTransHeight;y+)/ 把横向所有大于nRadius1的高频分量设置为0pCFDatax*nTransHeight + y=complex(0,0);IFFT_2D(pCFData, pCTData,nHeight, nWidth); / 经过低通滤波的图象进行反变换for(y=0; ynHeight; y+)/ 反变换的数据传给lpDIBBitsfor(x=0; xnWidth; x+)/需要考虑信号的正负问题以及实际所用的图象数据是灰度值还是原始数据dReal = pCTDatay*nTransWidth + x.real() ;/ 实部dImag = pCTDatay*nTransWidth + x.imag() ;/ 虚部unchValue =dReal;/ 指向DIB第y行,第x个象素的指针lpSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;*lpSrc =unchValue ;delete pCTData;/ 释放内存delete pCFData;/ 释放内存pCTData = NULL;pCFData = NULL;return (true);/返回结果/* /函数名称:* ButterWorthLowPass()* /输入参数:* LPSTR lpDIBBits- 指向需要滤波的图像像素指针* int nWidth- 数据宽度* int nHeight- 数据高度* int nRadius- ButterWorth低通滤波的半功率点* /返回值:* BOOL/ 成功返回TRUE,否则返回FALSE。* /说明:* pDIBBits 是指向需要滤波的图像像素指针。* 经过ButterWorth低通滤波的数据仍然存储在lpDIBBits 当中。*/BOOL ButterWorthLowPass(LPSTR lpDIBBits, LONG nWidth, LONG nHeight, int nRadius)unsigned char*lpSrc;/ 指向源图像的指针int y ;/ 循环控制变量int x ;/ 循环控制变量double dTmpOne ;/存放临时变量double dTmpTwo ;/存放临时变量double H ;/ ButterWorth 滤波系数int nTransWidth ;/ 傅立叶变换的宽度(2的整数次幂)int nTransHeight;/ 傅立叶变换的高度(2的整数次幂)double dReal ;/ 傅立叶变换的实部double dImag;/ 傅立叶变换的虚部double unchValue;/ 存贮图像各像素灰度的临时变量complex * pCTData ;/ 指向时域数据的指针complex * 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;/ 低通滤波的半径不能超过频域的最大半径if(nRadius (nTransWidth/2) | nRadius (nTransHeight/2) )return (false);/ 返回FALSEpCTData=new complexnTransWidth * nTransHeight; / 分配内存pCFData=new complexnTransWidth * nTransHeight; / 分配内存/ 图像数据的宽和高不一定是2的整数次幂,所以pCTData有一部分数据需要补0for(y=0; ynTransHeight; y+)for(x=0; xnTransWidth; x+)pCTDatay*nTransWidth + x=complex(0,0);/ 补零for(y=0; ynHeight; y+)/ 把图像数据传给pCTDatafor(x=0; xnWidth; x+)/ 指向DIB第y行,第x个象素的指针lpSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;unchValue = *lpSrc;pCTDatay*nTransWidth + x=complex(unchValue,0);FFT_2D(pCTData, nWidth, nHeight, pCFData) ;/ 傅立叶正变换for(y=0; ynTransHeight; y+)/ 开始实施ButterWorth低通滤波for(x=0; xnTransWidth; x+)H = (double)(y*y+x*x) ;H = H / (nRadius * nRadius);H = 1/(1+H) ;/ 求H值pCFDatay*nTransWidth + x=complex(pCFDatay*nTransWidth + x.real()*H,pCFDatay*nTransWidth + x.imag()*H);/ 经过ButterWorth低通滤波的图象进行反变换IFFT_2D(pCFData, pCTData, nWidth, nHeight);for(y=0; ynHeight; y+)/ 反变换的数据传给lpDIBBitsfor(x=0; xnWidth; x+)dReal = pCTDatay*nTransWidth + x.real() ;dImag = pCTDatay*nTransWidth + x.imag() ;unchValue = max(0,min(255,sqrt(dReal*dReal+dImag*dImag) );/ 指向DIB第y行,第x个象素的指针lpSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;*lpSrc =unchValue ;delete pCTData;/ 释放内存delete pCFData;/ 释放内存pCTData = NULL;pCFData = NULL;return (true);/返回结果/* /函数名称:* GaussLowPass()* /输入参数:* LPSTR lpDIBBits- 指向需要滤波的图像像素指针* int nWidth- 数据宽度* int nHeight- 数据高度* int nRadius- Gauss低通滤波的半功率点* /返回值:* BOOL/ 成功返回TRUE,否则返回FALSE。* /说明:* pDIBBits 是指向需要滤波的图像像素指针。* 经过Gauss低通滤波的数据仍然存储在lpDIBBits 当中。*/BOOL GaussLowPass(LPSTR lpDIBBits, LONG nWidth, LONG nHeight, int nRadius)unsigned char*lpSrc;/ 指向源图像的指针int y ;/ 循环控制变量int x ;/ 循环控制变量double dTmpOne ;/存放临时变量double dTmpTwo ;/存放临时变量double H ;/ ButterWorth 滤波系数int nTransWidth ;/ 傅立叶变换的宽度(2的整数次幂)int nTransHeight;/ 傅立叶变换的高度(2的整数次幂)double dReal ;/ 傅立叶变换的实部double dImag;/ 傅立叶变换的虚部double unchValue;/ 存贮图像各像素灰度的临时变量complex * pCTData ;/ 指向时域数据的指针complex * 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;/ 低通滤波的半径不能超过频域的最大半径if(nRadius (nTransWidth/2) | nRadius (nTransHeight/2) )return (false);/ 返回FALSEpCTData=new complexnTransWidth * nTransHeight; / 分配内存pCFData=new complexnTransWidth * nTransHeight; / 分配内存/ 图像数据的宽和高不一定是2的整数次幂,所以pCTData有一部分数据需要补0for(y=0; ynTransHeight; y+)for(x=0; xnTransWidth; x+)pCTDatay*nTransWidth + x=complex(0,0);/ 补零for(y=0; ynHeight; y+)/ 把图像数据传给pCTDatafor(x=0; xnWidth; x+)/ 指向DIB第y行,第x个象素的指针lpSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;unchValue = *lpSrc;pCTDatay*nTransWidth + x=complex(unchValue,0);FFT_2D(pCTData, nWidth, nHeight, pCFData) ;/ 傅立叶正变换for(y=0; ynTransHeight; y+)/ 开始实施Gauss低通滤波for(x=0; xnTransWidth; x+)H = (double)(y*y+x*x) ;H = H / (2 * nRadius * nRadius);H = exp (-H) ;/ 求H值pCFDatay*nTransWidth + x=complex(pCFDatay*nTransWidth + x.real()*H,pCFDatay*nTransWidth + x.imag()*H);/ 经过Gauss低通滤波的图象进行反变换IFFT_2D(pCFData, pCTData, nWidth, nHeight);for(y=0; ynHeight; y+)/ 反变换的数据传给lpDIBBitsfor(x=0; xnWidth; x+)dReal = pCTDatay*nTransWidth + x.real() ;dImag = pCTDatay*nTransWidth + x.imag() ;unchValue = max(0,min(255,sqrt(dReal*dReal+dImag*dImag) );/ 指向DIB第y行,第x个象素的指针lpSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;*lpSrc =unchValue ;delete pCTData;/ 释放内存delete pCFData;/ 释放内存pCTData = NULL;pCFData = NULL;return (true);/返回结果/* /函数名称:* HighPassFilter()* /输入参数:* LPSTR lpDIBBits- 指向需要滤波的图像像素指针* int nWidth- 数据宽度* int nHeight- 数据高度* int nRadius- 理想高通滤波的滤波半径* /返回值:* BOOL/ 成功返回TRUE,否则返回FALSE。* /说明:* lpDIBBits 是指向需要滤波的图像像素指针。* 经过高通滤波的数据仍然存储在lpDIBBits 当中。*/BOOL HighPassFilter(LPSTR lpDIBBits, LONG nWidth, LONG nHeight,int nRadius)unsigned char*lpSrc;/ 指向源图像的指针int y ;/ 循环控制变量int x ;/ 循环控制变量double dTmpOne ;/存放临时变量double dTmpTwo ;/存放临时变量int nTransWidth ;/ 傅立叶变换的宽度(2的整数次幂)int nTransHeight;/ 傅立叶变换的高度(2的整数次幂)double unchValue;/ 存贮图像各像素灰度的临时变量complex * pCTData ;/ 指向时域数据的指针complex * 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;double dReal;/ 傅立叶变换的实部double dImag;/ 傅立叶变换的虚部/ 滤波的半径不能超过频域的最大半径if(nRadiusnTransWidth-1 | nRadiusnTransHeight-1)return (false);/ 返回falsepCTData=new complexnTransWidth * nTransHeight;/ 分配内存pCFData=new complexnTransWidth * nTransHeight;/ 分配内存/ 图像数据的宽和高不一定是2的整数次幂,所以pCTData有一部分数据需要补0for(y=0; ynTransHeight; y+)for(x=0; xnTransWidth; x+)pCTDatay*nTransWidth + x=complex(0,0);/ 补零for(y=0; ynHeight; y+)/ 把图像数据传给pCTDatafor(x=0; xnWidth; x+)/ 指向DIB第y行,第x个象素的指针lpSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;unchValue = *lpSrc;pCTDatay*nTransWidth + x=complex(unchValue,0);FFT_2D(pCTData, nWidth, nHeight, pCFData) ;/ 傅立叶正变换for(x=0;xnTransWidth;x+)/ 开始实施理想的高通滤波for(y=0;ynRadius;y+)/把纵向所有小于nRadius的低频分量设置为0pCFDatax*nTransHeight + y=complex(0,0);for(y=nTransHeight-1-nRadius;ynTransHeight;y+)pCFDatax*nTransHeight + y=complex(0,0);for(x=0;xnRadius;x+)/把横向所有小于nRadius的低频分量设置为0for(y=0;

温馨提示

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

评论

0/150

提交评论