【问题标题】:Why using magnitude method to get processed image?为什么使用幅度方法来获取处理后的图像?
【发布时间】:2019-04-15 10:57:02
【问题描述】:

大家好,我正在考虑这个问题:

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

我读过教科书,上面说当我们在傅里叶域中处理完图像后,我们必须将其反转回来才能得到处理后的图像。

而教科书教导了求逆的实部。

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

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

愿有人知道这一切背后的含义:

  1. 为什么要使用magnitudeabs 来获取处理后的图像?

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

【问题讨论】:

标签: opencv image-processing fft magnitude


【解决方案1】:

教科书是对的,教程是错的。

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 的滤波器)。本教程正确计算傅立叶域的原点(尽管对于 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)

【讨论】:

  • @kris:这取决于您如何创建内核。在教程中,他们在变换上使用了fftshift,这意味着原点在图像的中间。您的内核必须设计为在同一位置具有原点。如果您的内核是在空间域中生成的内核的 FFT 的结果,您应该将ifftshift 应用于空间域内核,然后将fft 应用于图像和移位的内核,然后相乘,然后执行逆变换(傅里叶域中没有fftshift)。
  • @kris:如果滤波器不是对称的,那么逆变换将是一个复值函数。一些过滤器是这样设计的(请参阅我添加到答案中的段落)。这取决于过滤器及其设计方式,以及如何处理复杂的输出。关于对称滤波器的讨论涉及旨在保持实值图像为实值的滤波器,例如低通、高通或带通滤波器。
  • OpenCV文档中的错误已更正:github.com/opencv/opencv/issues/13152
  • @kris:FT 是一个连续域结构,需要无限长的信号。对该信号进行采样会产生一个周期性的频域。现在你有了 DTFT(离散时间 FT)。对信号加窗(当我们测量一个没有无限长数据的信号时)意味着我们不能再应用 FT。因此,我们假设信号的周期性,无限重复。现在我们确实有一些可以计算 FT 的东西。周期性导致离散的频域。现在你有了一个 DFT(离散 FT)。 FFT 计算 DFT。
  • @kris:DSP Stack Exchange 是提出有关傅立叶分析和许多其他问题的好地方。
猜你喜欢
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2012-05-06
  • 2018-12-25
  • 1970-01-01
  • 2015-04-09
相关资源
最近更新 更多