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

标签 java image filter fft frequency

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

我做了以下事情:

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

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

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

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

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

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

这一切似乎都有效,但有一个异常(exception):

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

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

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

最佳答案

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

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

要么将输出移回某个“可见”范围,要么不修改此 DC 分量(即中心像素)。

关于java - 执行逆 FFT 后,频率滤波图像为黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20080827/

相关文章:

java - 如何使用 lambda AND 流方法对列表进行排序

java - 我可以将相同java包的类文件拆分为Tomcat上的jar文件和classes文件夹吗?

java - 使用 actionPerformed 失败,因为其中的方法可能会引发异常

Android - 当 activity.setContentView 完成渲染时是否触发了任何事件?

python - Pandas :过滤值出现在对的两端,但不在组内

html - iOS 如何让背景看起来随时间改变亮度?

java - 我的 Java 程序意外终止

php - 如何允许用户下载图片(.gif、.png、.jpeg)?

html - 如何实现背景图片

.net - 用户定义的 linq 过滤器