【问题标题】:Fourier Filtering using CIMg & C++使用 CIMg 和 C++ 进行傅里叶滤波
【发布时间】: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


【解决方案1】:

既然是作业,请随意尝试。

您需要开始工作的第一步是直接将图像转换回来,并获取原始输入。如果这不起作用,你会很高兴早点发现它。

第二步是将 FFT 的某些部分归零,将结果转换回来,看看它有何不同。 FFT 中的每个像素代表输入中的一个频率,因此请尝试找出关系。然后向自己解释这种关系。

最后,一旦您确定了哪些像素要归零以及保留哪些像素,请创建一个黑白蒙版,将其转换为灰度图像,然后对其进行模糊处理。 FFT 域中的锐利边缘在图像域中具有无限支持 - 实际上,这会导致额外的假边缘。最好有一个模糊的边缘。

【讨论】:

  • 我按照你建议的步骤做了,似乎知道我需要做什么
猜你喜欢
  • 2011-04-16
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
相关资源
最近更新 更多