OpenCV学习笔记-傅里叶变换

匿名 (未验证) 提交于 2019-12-03 00:22:01

写在前面的话,这个博文是我写的时间最长的,字数最多的了,从昨天开始就在看傅里叶变换了,看了很多大神的文章,也学到了很多知识,一度觉得有那么多前辈的文章,我还写它干嘛,反正也是抄一遍。不过想起以前的经历,看了那么多书,一两个月一过就全部还给作者了,所以还是要静心自己写一遍。纸上得来终觉浅,方知此事要躬行。
先推荐一下大佬的文章:傅里叶变换详解,这篇文章原理讲的很详细,很有趣。傅里叶变换代码,这篇文章对代码层面讲的很详细。所以如果大家觉得我的文章不好看,可以移步两位前辈的博客,肯定会满意的。

一、傅里叶变换

傅里叶变换可以将一副图片分解为正弦和余弦两个分量,换言之,它可以将一幅图像从空间域(spatial domain)转换为频域(frequency domain)。这种变换的思想是任何函数可以很精确的接近无穷个sin()函数和cos()函数的和。
我们来梳理一下概念:

空间域

一般情况下,空间域的图像是f(x, y) = 灰度级(0-255),形象一点就是一个二维矩阵,每一个坐标对应一个颜色值。

频率域

频率:对于图像来说就是指图像颜色值的梯度,即灰度级的变化速度
幅度:可以简单的理解为是频率的权,即该频率所占的比例

对于一个正弦信号,如果它的幅度变化很快,我们称之为高频信号,如果变化非常慢,我们称之为低频信号。迁移到图像中,图像哪里的幅度变化非常大呢?边界点或者噪声。所以我们说边界点和噪声是图像中的高频分量(这里的高频是指变化非常快,不是出现的次数多),图像的主要部分集中在低频分量。

由于图像变换的结果原点在边缘部分,不容易显示,所以将原点移动到中心部分。
那么结果便是中间一个亮点朝着周围发散开来,越远离中心位置的能量越低(越暗)。

对于二位图像其傅里叶变换公式如下:
式中 f(i, j)是图像空间域的值,F(k ,l)是频域的值。傅里叶转换的结果是复数,这也显示了傅里叶变换是一幅实数图像和虚数图像叠加或者是幅度图像和相位图像叠加的结果。

二、Numpy中的傅里叶变换

函数np.fft.fft2()可以对信号进行频率转换,输出结果是一个复杂的数组。函数的第一个参数是输入图像,要求是灰度格式。第二个参数是可选的,决定输出数组的大小。 输出数组的大小和输入大小一样。如果输出结果比输入图像大,输入图像就需要在进行FFT之前补0.如果输出结果比输入图像小,输入图像就会被切割。

注意的是,上图其实并没有什么含义,显示出来的可以看成是频域后图像的振幅信息,并没有相位信息,图像的相位
=atan(),numpy包自带一个angle函数可以直接根据复数的实部和虚部求出角度(默认出来的角度是弧度。)像上述的程序中的f和fshift都是复数,就可以直接用angle直接求解相位,我们和振幅图对比一下:
可以直接

图三就是图像上每个像素点对应的相位图,其实是毫无规律的,理解就是偏移的角度。
图像变换到频域后,我们怎么转回时域呢?这就是傅里叶逆变换,先反中心化,再逆变换,上面我们一并提到了,并做了一个对比,和原图像一样。
我们说恢复一个频域图像需要图像的振幅和相位,而一个复数也正好包含这些,振幅就是复数的实数部分的绝对值,相位就是
a
tan(),现在假设我们只用一幅图像的振幅或者相位来将频域内图像恢复到时域会怎么样?
下面给出只用振幅、只用相位、和两者结合的程序:

可以看到,仅仅振幅的恢复图什么都看不来,仅仅的相位图虽然有东西,但是也看不出来什么,最后是把振幅和相位分别作为频域内复数的实部和虚部,得到的恢复图才和原来一样。
基于此,我们来做一个实验,假设有两幅图像,将这两幅图像进行傅里叶变换到频域,然后用一幅图像的振幅和另一幅图像的相位结合生成一幅新的图像,然后我们再转回时域,那么生成的图像更像取振幅的图像,还是取相位的图像呢?我们两张大小一样的图片:

图三是图一的振幅加图二的相位,图四是图一的相位加图二的振幅。很明显的可以看出,新图像由相位决定。为什么会这样呢?可以理解为振幅不过是描述图像灰度的亮度,占用谁的振幅不过使得结果哪部分偏亮或者哪部分偏暗而已。而图像最终是什么样子,由相位来决定。相位描述的是一个方向,只要方向正确了,那么最终的结果离你的目的也不会远。
现在我们可以进行频域变换了,例如高通滤波和重建图像(DFT的逆变换)。比如我们使用一个60 x 60的矩形窗口对图像进行掩模操作去除低频分量。然后再使用函数np.fft.ifftshift()进行逆平移操作,现在直流分量又回到了左上角,然后使用函数np.ifft2()进行FFT逆变换。同样又得到一堆复杂的数字,我们取绝对值:

效果如下:
上图的结果显示高通滤波其实是一种边界检测操作。我们把中心区域的低频分量全部去除了,只留下了一些高频分量,高频分量是什么?边界和噪声啊,所以剩下的就是边界了。

下面再来试试低通滤波器什么效果,构造个低通滤波器也很简单,把上述模板中的1变成0,0变成1,其实就是低通了:

可以看出低通滤波后图像的轮廓模糊了,从原理上看,图像的主要信息都集中在低频上,所以低通滤波器相当于执行了迷糊操作。

除了高通、低通滤波器,还有其他滤波器,如高斯滤波器,butterworth滤波器等。还有就是把高通低通都结合一部分到一个模板上形成的带通滤波器,这在一些场合会很有用,还是以理想的带通滤波器试验下:
这就是带通的效果,即可以保留一部分低频,也可以保留一部分高频,至于保留多少,就要视情况而定。
在文章的最后,我们对一些算子做一下傅里叶变换,看看他们属于HPF还是LPH

从结果我们可以看出:mean_filter、guassian算子是LPH,laplacian、sobel、scharr算子是HPF

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!