执行逆FFT后,频率滤波图像为黑色

时间:2013-11-19 19:55:57

标签: java image filter fft frequency

我正在编写一个程序来计算图像的FFT,在频域中应用简单的滤波器,然后执行逆FFT以在时域中显示滤波后的图像。

我做了以下事情:

  1. 创建一个NxN矩阵,使N * N的幂为2,N大于原始图像的宽度和高度。

  2. 将矩阵初始化为复数0 + 0i。用零有效填充图像。

  3. 将源图像置于矩阵中心,记录每个像素值,使它们最终显示在频域的可见范围内。我在一个单独的矩阵中处理​​每个R / G / B颜色元素。

  4. 将矩阵转换为1D阵列并对数据执行1D FFT。我稍后会将其升级为2D FFT。

  5. 将过滤器应用于频率数据。在这种情况下,我在频率数据的中心使用了一个圆圈。如果排除圆外的数据,则应该充当高通滤波器;如果排除圆内的数据,则应当充当低通滤波器。 为了应用滤波器,我用0 + 0i替换被拒绝频率的复数值。这应该与通过频率的滤波器矩阵1相乘,对于拒绝的频率则相乘0。

  6. 对滤波后的频率数据执行逆FFT,并构建时域滤波图像。

  7. 这一切似乎都有效,但有一个例外:

    当我使用包含频域中心点的频率滤波器时,逆FFT成功并生成仅具有高频率的图像。

    当我使用排除图像中心点的频率滤波器时,生成的逆FFT会产生完全黑色的图像。

    我不确定为什么整个图像结果是黑色的。我希望它包含所有的低频数据。滤波器是否需要对称?我缺少的起源频率点有什么特别之处吗?

1 个答案:

答案 0 :(得分:1)

变换后的图像的“中心”点代表图像的“DC分量”,即“时间”域中所有像素的平均值。

如果将此组件设置为零,则会将所有像素向下移动此量。因此,您的输入范围(RGB Vlues)为0..255将变为-128 .. 128。

您可以将输出切换回某个“可见”范围,或者不修改此DC分量也称为中心像素。