为什么要使用幅值方法来获取经过处理的图像?

时间:2018-11-12 17:08:05

标签: opencv image-processing fft magnitude

嗨,我正在考虑这个问题:

我知道我们使用傅立叶变换进入频域来处理图像。

我读过教科书,它说在傅立叶域中处理完图像后,我们必须将其反转以得到处理后的图像。

教科书教得求逆的实部。

但是,当我浏览the OpenCv tutorial时,无论使用OpenCV还是NumPy版本,最终他们都会使用magnitude(对于OpenCV)或np.abs(对于NumPy)。

对于OpenCV,反函数返回两个包含实部和虚部的通道。当我取逆的实部时,我得到了一个完全奇怪的图像。

可能有人知道所有这些背后的含义:

  1. 为什么使用magnitudeabs获取经过处理的图像?

  2. 教科书教学有什么问题(取逆的实质)?

1 个答案:

答案 0 :(得分:4)

教科书是正确的,本教程是错误的。

A real-valued image has a complex conjugate symmetry in the Fourier domain。这意味着图像的FFT将具有特定的对称性。如果要使逆变换保持实值,则所做的任何处理都必须保持这种对称性。如果处理错误,则逆变换将是复数值,并且可能是无意义的。

如果在傅立叶域中适当地保留对称性,则逆变换的虚部将接近零(由于数值不精确,可能与零不同)。丢弃这个虚构的组件是正确的事情。计算幅度将产生相同的结果,除了所有负值都将变为正值(请注意,某些滤波器旨在产生负值,例如微分滤波器),而且计算成本也会增加。

例如,卷积是傅立叶域中的乘法。傅立叶域中的滤波器必须是实值,并且围绕原点对称。通常,人们会混淆原点在傅立叶域中的位置,并乘以一个看似对称但实际上相对于原点偏移的过滤器,从而使其不对称。这种移位会引入逆变换的相位变化(请参见shift property of the Fourier transform)。逆变换的幅度不受相位变化的影响,因此采用该逆变换的幅度将产生看起来不错的输出,除非期望在滤波器结果中看到负值。最好能正确理解FFT算法,在傅立叶域中创建一个适当的对称滤波器,并仅保留逆变换的实部部分。

尽管如此,某些滤波器还是专门设计用来打破对称性并产生复值滤波器输出。例如,Gabor filter具有偶数(对称)分量和奇数(反对称)分量。偶数分量产生实值输出,奇数分量产生虚值输出。在这种情况下,感兴趣的是复数值的大小。同样,a quadrature filter专门用于产生复数值输出。从the analytic signal(或其多维扩展,单基因信号)的输出中,幅度和相位都受到关注,例如,在边缘检测的phase congruency方法中使用。


看链接的教程,是一行

fshift[crow-30:crow+30, ccol-30:ccol+30] = 0

生成傅立叶域滤镜并将其应用于图像(等效于乘以1和0的滤镜)。本教程正确地计算了Fourier域的起源(尽管对于Python 3,您将使用crow,ccol = rows//2 , cols//2来获得整数除法)。但是上面的过滤器在该原点周围不是对称的。在Python中,crow-30:crow+30指示原点左侧30像素,而右侧仅29像素(不包括右侧边界!)。正确的过滤器为:

fshift[crow-30:crow+30+1, ccol-30:ccol+30+1] = 0

使用此滤波器,逆变换是纯实数的(虚数分量的值约为1e-13,这是数字误差)。因此,现在可以(并且正确)将img_back = np.abs(img_back)替换为img_back = np.real(img_back)