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