我想学习使用MATLAB进行图像处理,我已经阅读了有关图像滤波器的内容。通过考虑以下代码:
gaussianFilter = fspecial('gaussian', [7, 7], 5) ,
这将构建一个高斯滤波矩阵,具有7行7列,标准偏差为5。因此,过滤器矩阵的大小为7 x 7。
这个矩阵的大小如何对过滤有影响?(这个矩阵是用来干什么的?)
在我的代码中,我应该通过哪些方法设置过滤器矩阵的大小?
我想学习使用MATLAB进行图像处理,我已经阅读了有关图像滤波器的内容。通过考虑以下代码:
gaussianFilter = fspecial('gaussian', [7, 7], 5) ,
这将构建一个高斯滤波矩阵,具有7行7列,标准偏差为5。因此,过滤器矩阵的大小为7 x 7。
这个矩阵的大小如何对过滤有影响?(这个矩阵是用来干什么的?)
在我的代码中,我应该通过哪些方法设置过滤器矩阵的大小?
在确定高斯滤波器的大小和标准差方面,最常见和启发式的措施之一是所谓的3σ规则。如果您还记得概率论,高斯分布的大部分值都集中在[μ - 3×σ,μ + 3×σ]
之间,其中μ
是分布的平均值,σ
是分布的标准差。这实际上被称为99%置信区间。下面是一个很好的图示:
来源: 维基百科
通过观察高斯分布曲线中的区间 [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);
%// 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']);
理论上高斯钟曲线具有无限大小,但这将导致计算时间太长。
看一下这个输出:
>> 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
你可以看到,外部列/行填充了非常小的值,这些值对结果没有任何影响。对于这样一个很小的标准偏差,你可以使用较小的过滤器来节省计算时间。如果图像具有锐利的边缘,并且大小较小且导数高,则建议应用不同的大小,否则会出现伪影。