2009-11-15 683 views
15

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

要使用中值滤波来平滑图像,图像处理工具箱中有一个很棒的功能medfilt2。是否有任何类似的平均过滤器功能?或者如何使用filter2函数来创建平均过滤器?

对我来说最重要的事情之一是有可能设置过滤器的半径。即对于中值滤波,如果我想[3×3]半径(面罩),我只是用

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

我想实现的均值滤波类似的东西。

回答

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

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

+0

大,这是我需要什么。并发现了一些其他有趣的过滤器,如果我能我会接受这个答案两次:D非常感谢! – Gacek 2009-11-15 17:50:11

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

注意,过滤器可使用filter2被应用于强度图像(2D矩阵),而在多的二维图像(RGB图像或3D基体)用于imfilter

同样在Intel处理器上,imfilter可以使用Intel Integrated Performance Primitives(IPP)库来加速执行。

+3

您不能为中值滤波设计内核,因为它是非线性卷积:对于每个NxN邻域,计算不仅涉及产品和总和。 – Amro 2009-11-15 23:15:27

+0

图像分割中的平均内核的好处是什么?我读了一些他们说的平均内核和高斯内核类似的论文。平均内核通过一维卷积运行会比高斯内核快,对吗? – user8264 2014-08-01 03:20:42

+0

两者都具有*模糊*图像的效果,区别在于它们如何合并附近的像素。平均内核取相邻像素的平均值,所有像素的权重相同。高斯核函数将采用加权平均值,以便在离开中心点时权重从邻近中间的像素提供更多权重,并减轻权重(权重来自正态分布“钟形曲线”)。将fspecial('average',[7 7])的输出与'fspecial('gaussian',[7 7],1)的输出进行比较。1)'(都返回一个归一化内核,总和为'1') – Amro 2014-08-01 09:16:53

6

我看到好的答案已经给出,但我认为这可能是一个很好的方法来执行平均过滤在MATLAB中使用没有特殊功能或工具箱。这对于理解过程如何工作也非常有用,因为您需要明确设置卷积内核。平均过滤器内核是幸运的很简单:

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

注意,对于彩色图像,你将不得不将此应用到每一个图像中的通道。

+0

谢谢。但在imfilter文档中,据说在大多数情况下它使用conv2。所以阅读这个文档给了我相同的结论。无论如何感谢:) – Gacek 2009-11-16 14:54:41

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

以什么方式这个答案不同于[这一个](http://stackoverflow.com/a/1738390/1714410)? – Shai 2013-10-23 11:02:24