《数字图像处理》DFT(离散傅里叶变换)及HF(同态滤波)的实现

DFT及HF的实现

1 DFT(离散傅里叶变换)的实现

1.1 DFT(离散傅里叶变换)的定义及原理

对于基于图像的傅里叶变换(二维离散傅里叶变换)的过程如下:首先对于每一行都做一维的傅里叶变换,然后对于每一列做一维的傅里叶变换。具体来说,先对于第1行的N个点做傅里叶变换(实部有值,虚部为0),将变换输出的实部放回原来第1行的实部,将输出的虚部放回第1行的虚部,这样计算完成全部的行之后,图像的实部和虚部包含的是中间数据,然后用相同的办法进行列方向上的相同的傅里叶变换,这样大小为MN的图像经过DFT就得到了一个MN的频谱(图片)。同时,根据快速傅里叶变换的计算要求,需要图像的行数、列数均满足2的n次方,如果不满足,在计算傅里叶变换之前先要对图像补零以满足2的n次方的要求。
对于一个M*N的图像f(x,y),其二维离散傅里叶变化(DFT)公式如下:
在这里插入图片描述
实际的计算中,我们将上式分解为以下的两部分进行计算,先计算F(x,v),再由其计算得到最终的F(u,v):
《数字图像处理》DFT(离散傅里叶变换)及HF(同态滤波)的实现_第1张图片

1.2 DFT(离散傅里叶变换)的代码实现

按照1.1小节的流程使用python进行代码的编写,具体代码见附件中的DFT_mself.py文件。主要流程是:1.计算变换矩阵;2.将赋值取对数加一;3.将对数频谱进行中心化。

1.3 实验结果

本小节对于所有的4张图片进行DFT变换,并将自己编写的DFT结果与python中numpy库中自带的二维傅里叶变换函数np.fft.fft2的结果进行比较。通过观察,我自己的编写的DFT函数的结果和numpy中自带的函数的FFT结果的效果几乎完全相同。其具体的实验结果如下:
图片一结果:
《数字图像处理》DFT(离散傅里叶变换)及HF(同态滤波)的实现_第2张图片
通过观察可以发现,经过傅里叶变换后,频域图的中间有一条很亮的竖线,其在原图中代表着水平方向的纹理,由于水平方向的纹理较强(但是较稀疏),所以频域中的竖线较亮;在频域图的水平方向有三条比较亮的线,其对应着原图竖直方向的几条亮线。
图片二结果:
《数字图像处理》DFT(离散傅里叶变换)及HF(同态滤波)的实现_第3张图片
通过观察可以发现,图二的竖直方向的纹理相比于图一来说更强更密集,而且分布更广,所以在频域图中的水平方向显示出来的亮度以及幅值都相比于图一更强。 在原图的水平方向的纹理没有图片一那么明显,所以在频域中的竖直方向幅值更低且分布的较为集中。
图片三结果:
《数字图像处理》DFT(离散傅里叶变换)及HF(同态滤波)的实现_第4张图片
因为在频谱图中,中心点代表着图片的原图的低频特征,或者说是,图片的灰度值变化较慢。所以在频谱图中相对于图片一和图片二,图片三的中间区域的亮度较高。仔细观察也可发现,在频谱图的中心附近的上下左右分别有一个点,在水平与竖直方向也分别有线,其对应于原图的黑白边缘的过渡部分。
图片四结果:
《数字图像处理》DFT(离散傅里叶变换)及HF(同态滤波)的实现_第5张图片
因为图片四的纹理较前三张图片较为复杂。所以在整个频谱图中的亮度较为均匀,在中心的亮度不是非常的突出,没有什么较为明显的特征。
通过实验可知,傅里叶变换系数靠近中心描述的是图像中慢变化的特性,或者说灰度变化比较缓慢的特性(频率比较慢的部分);傅里叶变换系数远离中心描述的是图像中快变化的特性,或者说灰度变换比较剧烈的特性(频率比较快的部分);频谱中水平方向的亮度(幅值),对应于原图中竖直方向的纹理变化;频谱中竖直方向的亮度(幅值),对应于原图中水平方向的纹理变化。

2 同态滤波的实现

2.1 同态滤波的定义及原理

同态滤波有一大作用是图像增强,其可以较好的去除乘性噪声,同时增加对比度以及标准化亮度,借此达到图像增强的目的。一副图像可以表示为其照度(illumination)分量和反射(reflectance)分量的乘积,虽然在时域上这两者是不可分离的,但是经由傅立叶转换两者在频域中可以线性分离。由于照度可视为环境中的照明,相对变化很小,可以看作是图像的低频成分;而反射率相对变化较大,则可视为高频成分。通过分别处理照度和反射率对像元灰度值的影响,通常是借由高通滤波器(high-pass filter),让图像的照明更加均匀,达到增强阴影区细节特征的目的。
其过程为,先将原图取对数并进行傅里叶变换变到频域中,在频域中与滤波函数相乘(这里滤波函数作用到还没有进行中心化的DFT上),再将结果进行傅里叶逆变换并取指数。同态的性质就是保持相关的属性不变,而同态滤波的好处是将原本复杂的运算转为效能相同但相对简单的运算。其整体流程如下图:
《数字图像处理》DFT(离散傅里叶变换)及HF(同态滤波)的实现_第6张图片
对于其中的滤波函数,对于此实验我们在图片一中使用了低通滤波函数降低高频亮度对于图片的影响;在图片二中使用了高通滤波函数进行图片的增强。

2.2 同态滤波的代码实现

按照2.1小节的流程使用python进行代码的编写,具体代码见附件中的hf_mself.py文件。主要流程是:1.原图取对数;2.进行傅里叶变换;3.在频谱中与滤波函数相乘进行滤波;4.进行傅里叶逆变换;5.取指数得到最终的结果。

2.3 实验结果

本小节对于所有两张图片进行同态滤波,其具体的实验结果如下:
图片一结果:
《数字图像处理》DFT(离散傅里叶变换)及HF(同态滤波)的实现_第7张图片
《数字图像处理》DFT(离散傅里叶变换)及HF(同态滤波)的实现_第8张图片
这里通过滤波,将整体的图像变暗,相比于原图,更好的突出了手指部分的纹理细节。通过观察滤波前和滤波后的频谱图(没有中心化),可以发现四角的区域(为低频区域,因为没有中心化)经过滤波后幅值变小,这样即在原图中减少了亮度。
图片二结果:

《数字图像处理》DFT(离散傅里叶变换)及HF(同态滤波)的实现_第9张图片
《数字图像处理》DFT(离散傅里叶变换)及HF(同态滤波)的实现_第10张图片
图片二通过滤波,将图片进行了亮度增强。将原图右上角的黑暗部分“显示”了出来。通过对比滤波前后的频谱图,可以发现在高频处的幅值有明显的提高,即增加了原图片的亮度,从而达到了比较好的效果。

2.4 使用自己的DCT函数与自带FFT函数的结果对比

《数字图像处理》DFT(离散傅里叶变换)及HF(同态滤波)的实现_第11张图片
通过观察,相同的图片和滤波函数,我自己的DCT相比较于numpy自带的fft2函数,效果基本一致。只是我自己的DCT函数处理后的图片亮度会高一些,这可能与离散傅里叶变换和快速傅里叶变换本身的算法有关,总体来说实现了相同的结果。

你可能感兴趣的:(个人作品,学习笔记)