如何为图像中的每个水平线数据实现一维 FFT 滤波器

Posted

技术标签:

【中文标题】如何为图像中的每个水平线数据实现一维 FFT 滤波器【英文标题】:How to implement 1D FFT filter for each horizontal line data from image 【发布时间】:2010-07-06 01:59:56 【问题描述】:

我希望对图像的每条水平线应用频域滤波器,例如低通或带通。这可能使用opencv吗?

【问题讨论】:

“FFT 过滤器”没有意义。既不是“通过只需要的频率”。 @leonbloy - 自从我搞砸 FFts 以来已经 20 多年了,但是(我认为)我记得有许多数据过滤器基于将数据从时域转换到频域(使用 FFT)处理频域数据然后转换回时域(反向 FFT)我记得我们将这些滤波器称为“FFT 滤波器” @erjik - 你说的是高通滤波器之类的东西吗? en.wikipedia.org/wiki/High_pass_filter @Michael J - 是的,我实际上是指高通或低通滤波器。 @leonbloy - 那么用什么来代替“FFT 滤波器”和“只通过需要的频率”更好呢?请纠正我。 【参考方案1】:

我认为您需要详细说明您的问题。或许,举一些具体的例子。

如果我将您的问题解释为:

你有一张 10 x 10 的图片

第 1 行

第 2 行

第 3 行 ...

第 10 行

您想在这些线路上独立应用一些过滤器(低通/带通)。

然后,首先您需要设计水平过滤器(使用您想要的任何工具)。

让我们假设(不失一般性)您有 2 个过滤器:

低通:1x10 图像

带通:1x10 图像

然后您可以使用 cv::dft 将这些滤波器转换为频域。还可以使用 cv::dft 将图像转换为频域。当然,您应该单独转换各个行。一种方法是:

cv::Mat im = cv::imread('myimage.jpg', 1);
cv::Mat one_row_in_frequency_domain;
for (int i=0; i<im.rows; i++)
  cv::Mat one_row = im.row(i);
  cv::dft(one_row, one_row_in_frequency_domain);

  // Apply your filter by multiplying

【讨论】:

【参考方案2】:

实际上,openCV 可以开箱即用地做到这一点: see here in the manual

DFT_ROWS 对输入矩阵的每一行进行正向或逆变换;此标志使您可以同时转换多个向量,并可用于减少开销

【讨论】:

以上是关于如何为图像中的每个水平线数据实现一维 FFT 滤波器的主要内容,如果未能解决你的问题,请参考以下文章

python中的fft带通滤波器

我做“基于FFT算法与实现”和“FIR滤波器的设计与实现”的实验。。

iPhone/iOS:如何为 Scrollview 的子视图实现拖放?

如何为每个数组保存一个图像

OpenCV-一维频域滤波器

OpenCV-一维频域滤波器