Matlab中用于平滑图像的均值滤波器
Posted
技术标签:
【中文标题】Matlab中用于平滑图像的均值滤波器【英文标题】:Mean filter for smoothing images in Matlab 【发布时间】:2010-12-16 19:33:24 【问题描述】:我需要在 Matlab 中测试一些基本的图像处理技术。我需要测试和比较特别是两种类型的过滤器:均值过滤器和中值过滤器。
为了使用中值滤波平滑图像,图像处理工具箱中有一个很棒的功能medfilt2
。均值滤波器有类似的功能吗?或者如何使用filter2
函数来创建均值滤波器?
对我来说最重要的事情之一是可以设置过滤器的半径。 IE。对于中值滤波器,如果我想要 [3 x 3] 半径(掩码),我只需使用
imSmoothed = medfilt2(img, [3 3]);
我想为均值滤波器实现类似的效果。
【问题讨论】:
【参考方案1】:h = fspecial('average', n);
filter2(h, img);
见doc fspecial
:
h = fspecial('average', n)
返回一个平均滤波器。 n
是一个 1×2 向量,用于指定 h
中的行数和列数。
【讨论】:
太好了,这正是我所需要的。并在那里找到了一些其他有趣的过滤器,如果可以的话,我会接受这个答案两次:D 非常感谢! 您可以在这里查看:matlab.izmiran.ru/help/toolbox/images/enhan23b.html【参考方案2】: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) 库来加速执行。
【讨论】:
你不能为中值滤波设计一个内核,因为它是一个非线性卷积:对于每个 NxN 邻域,计算不仅仅涉及乘积和求和。 平均核对图像分割有什么好处?我读了一些论文,他们说平均内核和高斯内核是相似的。并且平均内核会比 1D 卷积的高斯内核运行得更快,对吧? 两者都具有模糊图像的效果,不同之处在于它们如何合并附近的像素。平均核取邻域中像素的平均值,所有像素的权重相同。高斯核将采用加权平均值,这样它会给邻域中间的像素更多的权重,而当您远离中心时,权重会减少(权重来自正态分布“钟形曲线”)。比较fspecial('average', [7 7])
和 fspecial('gaussian', [7 7], 1.1)
的输出(两者都返回归一化内核,总和为 1
)
@user8264:我现在无法访问这本书,但通常高斯内核提供更温和的平滑效果,并且比相同大小的均值滤波器更倾向于保留边缘。想想这两种情况下低通滤波器的frequency response...这是一个很好解释的页面:homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm
这里是一个例子,展示了应用两个过滤器的区别:i.stack.imgur.com/GYIlj.png【参考方案3】:
我看到已经给出了很好的答案,但我认为在 MATLAB 中提供一种不使用特殊函数或工具箱执行均值滤波的方法可能会很好。这也非常有助于准确理解该过程是如何工作的,因为您需要显式设置卷积核。幸运的是,均值滤波器内核非常简单:
I = imread(...)
kernel = ones(3, 3) / 9; % 3x3 mean kernel
J = conv2(I, kernel, 'same'); % Convolve keeping size of I
请注意,对于彩色图像,您必须将其应用于图像中的每个通道。
【讨论】:
谢谢。但在 imfilter 文档中,据说它在大多数情况下都使用 conv2。所以阅读文档让我得出了同样的结论。无论如何谢谢:)【参考方案4】:卷积是通过变换域中的乘法来定义的:
conv2(x,y) = fftshift(ifft2(fft2(x).*fft2(y)))
如果考虑一个频道...对于更多频道,这必须在每个频道中完成
【讨论】:
【参考方案5】:f=imread(...);
h=fspecial('average', [3 3]);
g= imfilter(f, h);
imshow(g);
【讨论】:
这个答案与this one有什么不同?以上是关于Matlab中用于平滑图像的均值滤波器的主要内容,如果未能解决你的问题,请参考以下文章