在MATLAB中,我应该使用哪些措施来设置高斯滤波器的大小?

3

我想学习使用MATLAB进行图像处理,我已经阅读了有关图像滤波器的内容。通过考虑以下代码:

gaussianFilter = fspecial('gaussian', [7, 7], 5)  ,

这将构建一个高斯滤波矩阵,具有7行7列,标准偏差为5。因此,过滤器矩阵的大小为7 x 7。

这个矩阵的大小如何对过滤有影响?(这个矩阵是用来干什么的?)

在我的代码中,我应该通过哪些方法设置过滤器矩阵的大小?

2个回答

15

在确定高斯滤波器的大小和标准差方面,最常见和启发式的措施之一是所谓的3σ规则。如果您还记得概率论,高斯分布的大部分值都集中在[μ - 3×σ,μ + 3×σ]之间,其中μ是分布的平均值,σ是分布的标准差。这实际上被称为99%置信区间。下面是一个很好的图示:

Confidence Interval for Gaussian

来源: 维基百科

通过观察高斯分布曲线中的区间 [mu - 3*sigma, mu + 3*sigma],可以包含99%的变化。值得一提的是,区间 [mu - 2*sigma, mu + 2*sigma] 包含了大约95%的总面积,而对于区间 [mu - sigma, mu + sigma],则包含了大约68%的总面积。

因此,人们通常会查看图像并确定 最小 特征是什么。他们测量特征的宽度或高度,并确保特征的宽度/高度/跨度适合于 99% 的置信区间。横向测量给我们总宽度为 6 * sigma。然而,因为我们处理的是离散域,我们还需要考虑高斯分布的 中心。因此,您需要确保总宽度如下:2 * floor(3*sigma) + 1。因此,您需要确定所需的宽度。一旦这样做了,您就可以确定需要满足此宽度的 sigma 是多少。例如,假设我们最小特征的宽度为 19。则通过以下方式计算您的 sigma

19 = 2*floor(3*sigma) + 1
19 = 6*sigma + 1
18 = 6*sigma
sigma = 3

因此,您可以像这样创建高斯核:
h = fspecial('gaussian', [19 19], 3);

如果您想尝试修改掩模大小,只需使用上述方程式来操作并解决每次的sigma。现在回答您关于大小的问题,这是一个低通滤波器。因此,增加矩阵的大小实际上会增加LPF的效果。随着大小的增加,您的图像将逐渐变得更模糊。尝试调整大小并查看结果。如果您在尝试时没有特定的图像,请使用MATLAB中的任何内置图像。因此,请尝试执行以下操作:
%// Read in the image - Part of MATLAB path
im = imread('cameraman.tif');

%// Determine widths and standard deviations
width1 = 3; sigma1 = (width1-1) / 6;
width2 = 7; sigma2 = (width2-1) / 6;
width3 = 13; sigma3 = (width3-1) / 6;
width4 = 19; sigma4 = (width4-1) / 6;

%// Create Gaussian kernels
h1 = fspecial('gaussian', [width1 width1], sigma1);
h2 = fspecial('gaussian', [width2 width2], sigma2);
h3 = fspecial('gaussian', [width3 width3], sigma3);
h4 = fspecial('gaussian', [width4 width4], sigma4);

%// Filter the image using each kernel
out1 = imfilter(im, h1, 'replicate');
out2 = imfilter(im, h2, 'replicate');
out3 = imfilter(im, h3, 'replicate');
out4 = imfilter(im, h4, 'replicate');

%// Display them all on a figure
figure;
subplot(2,2,1);
imshow(out1);
title(['Width = 3']);
subplot(2,2,2);
imshow(out2);
title(['Width = 7']);
subplot(2,2,3);
imshow(out3);
title(['Width = 13']);
subplot(2,2,4);
imshow(out4);
title(['Width = 19']);

您将获得以下输出:

enter image description here


2
很好的回答 ;) 谢谢。 - Nastaran Hakimi

2

理论上高斯钟曲线具有无限大小,但这将导致计算时间太长。

看一下这个输出:

>> fspecial('gaussian', [7, 7], 1)

ans =

    0.0000    0.0002    0.0011    0.0018    0.0011    0.0002    0.0000
    0.0002    0.0029    0.0131    0.0216    0.0131    0.0029    0.0002
    0.0011    0.0131    0.0586    0.0966    0.0586    0.0131    0.0011
    0.0018    0.0216    0.0966    0.1592    0.0966    0.0216    0.0018
    0.0011    0.0131    0.0586    0.0966    0.0586    0.0131    0.0011
    0.0002    0.0029    0.0131    0.0216    0.0131    0.0029    0.0002
    0.0000    0.0002    0.0011    0.0018    0.0011    0.0002    0.0000

你可以看到,外部列/行填充了非常小的值,这些值对结果没有任何影响。对于这样一个很小的标准偏差,你可以使用较小的过滤器来节省计算时间。如果图像具有锐利的边缘,并且大小较小且导数高,则建议应用不同的大小,否则会出现伪影。


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