Matlab中用于平滑图像的均值滤波器

16

我需要在Matlab中测试一些基本的图像处理技术。我需要测试并比较特别是两种类型的滤波器:均值滤波器和中值滤波器。

使用中值滤波平滑图像,可以使用图像处理工具箱中的一个很好的函数medfilt2。是否有类似的函数可用于均值滤波器?或者如何使用filter2函数创建均值滤波器?

对我来说最重要的事情之一是有可能设置滤波器的半径。即,对于中值滤波器,如果我想要[3 x 3]的半径(掩模),我只需使用:

imSmoothed = medfilt2(img, [3 3]);

我希望对均值滤波器实现类似的效果。

5个回答

31
h = fspecial('average', n);
filter2(h, img);

参见doc fspecialh = fspecial('average', n)返回一个平均滤波器。 n是一个1x2向量,指定h中的行数和列数。


太好了,这正是我所需要的。我还发现了一些其他有趣的过滤器,如果可以的话,我会两次接受这个答案:D 非常感谢! - Gacek
您可以在此处查看:http://matlab.izmiran.ru/help/toolbox/images/enhan23b.html - SalahAdDin

9

我看到已经有很好的答案了,但我认为提供一种在MATLAB中执行均值滤波的方法而不使用特殊函数或工具箱可能是不错的。这对于理解过程如何工作非常有帮助,因为您需要显式设置卷积核。幸运的是,均值滤波器核非常简单:

I = imread(...)
kernel = ones(3, 3) / 9; % 3x3 mean kernel
J = conv2(I, kernel, 'same'); % Convolve keeping size of I

请注意,对于彩色图像,您需要将此应用于图像中的每个通道。

谢谢。但是在imfilter文档中,它说大多数情况下使用conv2。因此阅读文档使我得出了相同的结论。无论如何,还是感谢您 :) - Gacek

5
I = imread('peppers.png');
H = fspecial('average', [5 5]);
I = imfilter(I, H);
imshow(I)

请注意,可以使用filter2对强度图像(2D矩阵)应用过滤器,而在多维图像(RGB图像或3D矩阵)中使用imfilter
此外,在英特尔处理器上,imfilter可以使用英特尔集成性能原语(IPP)库来加速执行。

3
由于中值滤波是一种非线性卷积,所以不能为其设计核心:对于每个NxN邻域,计算涉及到的不仅仅是乘积和求和。 - Amro
两者都会使图像模糊,不同之处在于它们如何合并附近的像素。平均核心会取邻域中像素的平均值,并赋予所有像素相等的权重。高斯核心将采用加权平均值,使其更多地关注邻域中心的像素,并随着远离中心而减少权重(权重来自正态分布的“钟形曲线”)。比较fspecial('average', [7 7])fspecial('gaussian', [7 7], 1.1)的输出结果(两者都返回一个归一化的核心,总和为1)。 - Amro
1
@user8264:我现在没有书的访问权限,但通常高斯核提供了更温和的平滑效果,并且倾向于比相同大小的均值滤波器更好地保留边缘。想象一下两种情况下低通滤波器的频率响应……这里有一个很好的解释页面:http://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm - Amro
1
这里有一个示例,展示了应用两个过滤器的差异:http://i.stack.imgur.com/GYIlj.png - Amro
我认为高斯核和均值核之间的另一个不同之处在于,均值核为其邻居提供了相等加权值,而高斯核则提供了不同的加权值。与球形核(所有加权值均为1)进行比较,您认为哪种更适合图像去噪? - John
显示剩余2条评论

2

卷积是通过变换域中的乘法来定义的:

conv2(x,y) = fftshift(ifft2(fft2(x).*fft2(y)))

如果只考虑一个频道...对于更多的频道,这个操作必须在每个频道上执行。

0
f=imread(...);

h=fspecial('average', [3 3]);
g= imfilter(f, h);
imshow(g);

2
这个答案与这个有何不同? - Shai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接