我正在尝试使用 MATLAB 学习图像处理,并且我已经阅读了有关图像过滤器的信息。通过考虑此代码:
gaussianFilter = fspecial('gaussian', [7, 7], 5) ,
这将构建一个 7 行 7 列的高斯滤波器矩阵,标准差为 5。因此,滤波器矩阵的大小为 7 x 7 。
这个矩阵的大小如何对过滤有效? (这个矩阵有什么作用?)
我应该通过哪些措施在我的代码中设置过滤器矩阵的大小?
最佳答案
确定高斯滤波器的大小和最终标准偏差的最常见和启发式方法之一是所谓的 3-sigma 规则 。如果你记忆一下概率,高斯分布的大部分值都集中在 [mu - 3*sigma, mu + 3*sigma]
之间,其中 mu
是分布的平均值,sigma
是分布的标准偏差。这实际上被称为 99% confidence interval 。一个很好的图表如下所示:
资料来源:Wikipedia
通过查看 [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']);
您将获得以下输出:
关于matlab - 我应该通过哪些措施在 MATLAB 中设置高斯滤波器的大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23832852/