我有一个在频域中进行过滤的分配。它给了我在问题的一部分中使用的各种过滤器,但我只想弄清楚如何添加一个。我一般都在学习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);
任何人都知道我需要如何继续使用过滤器部分?
答案 0 :(得分:1)
KevinMc基本上告诉你答案是什么。 fspecial
当然允许您定义某些2D滤镜,但它没有矩形滤镜。你可以创建自己的!您可以创建一个与图像大小相同的滤镜/蒙版,其中此蒙版的中心是高度为N/8
且宽度为M/8
的矩形。完成此操作后,您只需在频域中与图像相乘,然后按照代码中指定的ifft2
进行操作。
你的代码是正确的......你只需要创建掩码!因此,使用meshgrid
生成(x,y)
坐标的2D网格,然后使用布尔条件查找跨越-N/8
到N/8
的高度和-M/8
到M/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 = 200
和cols = 200
。这意味着对于矩形滤波器,它应该从-25到25的水平频率跨越,并且对于垂直频率应该相同。这意味着我们应该得到一个50 x 50的正方形。如果我们运行此代码,这就是我得到的图像:
因此,只需使用这两行代码,您的掩码将存储在H
中。然后,您可以使用它来过滤图像。