我正在编写一个程序来计算图像的 FFT,在频域中应用简单的滤波器,然后执行逆 FFT 以在时域中显示滤波后的图像。
我做了以下事情:
创建一个 NxN 矩阵,使 N*N 为 2 的幂,且 N 大于原始图像的宽度和高度。
将矩阵初始化为复数 0+0i。用零有效地填充图像。
将源图像置于矩阵的中心,对每个像素值进行对数,以便它们最终可以显示在频域的可见范围内。我在单独的矩阵中处理每个 R/G/B 颜色元素。
将矩阵转换为一维数组并对数据执行一维 FFT。我稍后会将其升级为 2D FFT。
对频率数据应用过滤器。在这种情况下,我在频率数据的中心使用了一个圆圈。如果排除圆圈外的数据,这应该充当高通滤波器,或者如果排除圆圈内的数据,则充当低通滤波器。 为了应用过滤器,我将拒绝频率的复数值替换为 0+0i。这应该与乘以 1 表示通过频率、0 表示拒绝频率的滤波器矩阵相同。
对滤波后的频率数据执行逆 FFT,构建时域滤波图像。
这一切似乎都有效,但有一个异常(exception):
当我使用包括频域中心点的频率滤波器时,反向 FFT 成功并生成仅包含高频的图像。
当我使用排除图像中心点的频率滤波器时,生成的逆 FFT 生成全黑图像。
我不确定为什么整个图像结果都是黑色的。我希望它包含所有低频数据。滤波器是否需要对称?我遗漏的原点频率点有什么特别之处吗?
最佳答案
转换图像的“中心”点表示图像的“DC 分量”,即“时间”域中所有像素的平均值。
如果您将此组件设置为零,您会将所有像素向下移动这个量。因此,您的输入范围 (RGB Vlues) 0..255 将变为 -128 .. 128。
要么将输出移回某个“可见”范围,要么不修改此 DC 分量(即中心像素)。
关于java - 执行逆 FFT 后,频率滤波图像为黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20080827/