我正在尝试使用MATLAB学习图像处理,我已阅读有关图像的过滤器。考虑这段代码:
gaussianFilter = fspecial('gaussian', [7, 7], 5) ,
这构建了一个7行7列的高斯滤波器矩阵,标准差为5.因此,滤波器矩阵的大小为7 x 7.
此矩阵的大小如何在过滤时有效? (这个矩阵做什么?)
我应该在哪些方面设置代码中滤镜矩阵的大小?
答案 0 :(得分:15)
确定高斯滤波器的大小和最终标准偏差的最常见和启发式测量方法之一是所谓的 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']);
您将获得以下输出:
答案 1 :(得分: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
您可以看到外部列/行填充了非常小的值,这些值对结果没有相关输入。对于这种小标准派生,您可以使用较小的过滤器来节省计算时间。我建议对具有锐边的图像应用不同的尺寸,如果尺寸很小并且推导高,你会看到人工制品。