【发布时间】:2014-11-10 11:02:09
【问题描述】:
我需要实现一个非常简单的滤波器来抑制一系列频率。 然后我需要计算傅里叶逆变换并保存新图像。
我正在使用 CImg 库 ( C++ )。 到目前为止,我已经完成了:
const CImg<unsigned char> img(source_img);
CImgList<> F = img.get_FFT();
我被困在这里。 F 是实部和虚部两个 CImg 对象的列表,对吗?
有了这个 F 如何抑制频率并重建新图像?
附:这是一个家庭作业,所以我不想要一个解决方案,而是解释如何做, 怎么做以及为什么。
【问题讨论】:
-
这取决于过滤器,以及 CImg 实现是否执行 fftshift。在任何情况下,一种简单的过滤方式是将转换后图像上的一些像素设置为 0(例如,基于与您需要的点/频率的距离),然后使用逆 fft 将图像转换回来。
-
CImg 没有实现 fftshift。您能否描述一下所需的步骤(假设 fftshift 可用?)
-
fftshift 只是将 DC(低频)位置移动到图像的中心,而不是角落。如果你想要一个低通滤波器,你需要将高频的位置(远离 DC)归零,如果你想要高通,只需将 DC 周围的区域归零。
-
“将一些像素设置为零”相当于在 FFT 域中乘以黑白滤波器。反过来,这相当于空间域中的卷积。你的黑白滤镜有可怕的铃声。它看起来像一个过度压缩的 JPG。
标签: c++ image-processing fft cimg