【问题标题】:Filter in Frequency Domain频域滤波器
【发布时间】:2014-12-02 13:27:42
【问题描述】:

我有一个要在频域中过滤的任务。它为我提供了在部分问题中使用的各种过滤器,但我只是想弄清楚如何添加一个。总的来说,我还在学习 Matlab 和图像处理。

作业问题:使用 index2gray 将“tees.tif”转换为灰度图像。过滤灰度图像 频域使用2D fft(fft2),执行操作后可以使用2D ifft (ifft2) 在空间域中显示过滤后的图像:

a- 使用 (uc=N/8,vc=M/8) 的截止频率的矩形低通滤波器,其中 N 和 M 是图像的行和列大小。

我当前的代码是

[I,cmap] = imread('trees.tif');
img = ind2gray(I,cmap);
[rows columns] = size(img);
imshow(img);
fftO = fft2(double(img));
shifted = fftshift(fftO);
logged = log(1+abs(shifted));
imshow(logged,[]);

如果我理解正确,我有频域中的灰度图像,现在需要对其进行过滤。我对过滤部分感到困惑。我需要使用截止频率制作一个矩形低通滤波器。 如何添加截止频率?我假设我将使用高斯或巴特沃斯滤波器,并且滤波器大小与图像相同。

弄清楚这个过滤器的事情后,我应该可以做(H是过滤器)

 filtered = logged.*H; 
 invert = real(ifft2(filtered));
 imshow(invert);

有人知道我需要如何处理过滤器部分吗?

【问题讨论】:

  • 在频域中,我相信矩形低通滤波器对于低于截止频率的频率基本上应该为 1,对于高于截止频率的频率应该为 0,因此您应该能够从中构造 H。既然是作业,那我就到此为止了。
  • 我希望使用预定义的 fspecial(),但现在我想我将不得不创建我的矩阵/过滤器,而不是使用带参数预定义的东西。这是正确的吗?

标签: matlab image-processing


【解决方案1】:

KevinMc 基本上告诉你答案是什么。 fspecial 当然允许您定义某些 2D 过滤器,但它没有矩形过滤器。你可以创建自己的!您创建一个与图像大小相同的过滤器/蒙版,其中该蒙版的中心是一个矩形,高度为N/8,宽度为M/8。完成此操作后,您只需在频域中与图像相乘,然后按照您在代码中指定的方式获取 ifft2

你的代码是正确的......你只需要创建面具!因此,使用meshgrid 生成(x,y) 坐标的二维网格,然后使用布尔条件查找跨越-N/8N/8-M/8M/8 之间的像素宽度,确保蒙版的中心是原点(0,0)。因此:

[X,Y] = meshgrid(1:columns, 1:rows);

H = (X - floor(columns/2) >= -columns/8) & (X - floor(columns/2) <= columns/8) & ...
       (Y - floor(rows/2) >= -rows/8) & (Y - floor(rows/2) <= rows/8);

H = double(H);

最后一行代码很重要,因为我们需要转换为double,以便您可以通过乘以图像的频域版本来对图像进行卷积/过滤。您只能在 MATLAB 中相乘,前提是它们的类型相同。 H 是应用布尔条件后的logical,因此您需要在继续之前转换为double

例如,假设rows = 200cols = 200。这意味着对于矩形滤波器,这应该从 -25 到 25 的水平频率跨越,对于垂直频率也是如此。这意味着我们应该得到一个 50 x 50 的正方形。如果我们运行这段代码,这就是我得到的图像:

因此,只需使用这两行代码,您的掩码就会存储在H 中。然后,您可以使用它来过滤您的图像。

祝你好运!

【讨论】:

  • 我最终制作了自己的矩阵并循环将 1 放置在适当的位置。当我尝试在结果上显示时,我现在只得到一个黑色图像。我的代码和您建议的代码都会发生这种情况。有任何想法吗?我正在使用 imshow(反转)。如果我使用 imshow(invert,[]) 它只是一个灰色图像。我也试过 abs(invert) 并没有成功。
  • @Chad - 尝试将您的图像转换为uint8,然后显示您的结果。您阅读的原始图像可能属于这种类型。因此:invert = im2uint8(invert);invert 很可能是 double 类型,imshow 期望 double 图像的强度介于 [0,1]... 之间,因此小于 0 的值是黑色,大于 1 的值是白色。这可能不是你想要的,所以转换成uint8 看看你会得到什么!
  • 不,它仍然显示为黑色。在我去显示图像之前,一切似乎都是正确的。明天下课的时候我要问我的老师。感谢所有的帮助。如果我弄明白了,我会回复这个。
  • 他提到我应该使用 imagesc 而不是 imshow 但它没有解决问题。我从来没有最终解决这个问题。对不起!
猜你喜欢
  • 2014-03-20
  • 2015-06-08
  • 2019-02-03
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 2011-09-20
  • 1970-01-01
相关资源
最近更新 更多