我将截断的高斯内核定义为:
所以我混淆了截断高斯内核的正确实现。让我看看两个案例,让我知道,非常感谢你
案例1:
G_truncated=fspecial('gaussian',round(2*sigma)*2 + 1,sigma); % kernel
案例2:
G=fspecial('gaussian',round(2*sigma)*2 + 1,sigma); % normal distribution kernel
B = ones(round(2*sigma)*2 + 1,round(2*sigma)*2 + 1);
G_truncated=G.*B;
G_truncated = G_truncated/sum(G_truncated(:)); %normalized for sum=1
答案 0 :(得分:1)
截断高斯核的定义与MATLAB截断滤波器内核的方式不同,尽管它在实践中对于相当大的d
通常无关紧要。
fspecial
已经返回截断的AND规范化过滤器,因此第二种情况是冗余的,因为它生成与案例1完全相同的结果。
来自MATLAB帮助:
H = fspecial('gaussian',HSIZE,SIGMA) returns a rotationally
symmetric Gaussian lowpass filter of size HSIZE with standard
deviation SIGMA (positive). HSIZE can be a vector specifying the
number of rows and columns in H or a scalar, in which case H is a
square matrix.
The default HSIZE is [3 3], the default SIGMA is 0.5.
您可以使用fspecial('gaussian',1,sigma)
生成1x1过滤器,并确保它确实已正常化。
要生成适合您定义的过滤器内核,您需要在第二种情况下使B
为包含圆形区域的矩阵。不太严格(但实际上是多余的)解决方案是使用fspecial('disk',size)
来截断高斯内核。在任何一种情况下都不要忘记将其标准化。
答案 1 :(得分:1)
要添加到上一篇文章,有一个如何实现内核的问题。您可以使用fspecial
,截断内核以使半径之外的任何内容为零,然后重新归一化,但我假设您希望从第一原则开始这样做....所以让我们知道那个。首先,您需要生成距离蒙版中心的距离的空间地图。结合起来,您可以使用它来确定高斯值(未标准化)的含义。您可以根据距离的空间映射过滤掉未规范化遮罩中的这些值,然后对其进行标准化。因此,根据您的标准偏差tau
和您的半径rho
,您可以这样做:
%// Find grid of points
[X,Y] = meshgrid(-rho : rho, -rho : rho)
dists = (X.^2 + Y.^2); %// Find distances from the centre (Euclidean distance squared)
gaussVal = exp(-dists / (2*tau*tau)); %// Find unnormalized Gaussian values
%// Filter out those locations that are outside radius and set to 0
gaussVal(dists > rho^2) = 0;
%// Now normalize
gaussMask = gaussVal / (sum(gaussVal(:)));
以下是使用rho = 2
和tau = 2
以及每个阶段的输出的示例:
>> X
X =
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
>> Y
Y =
-2 -2 -2 -2 -2
-1 -1 -1 -1 -1
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
>> dists
dists =
8 5 4 5 8
5 2 1 2 5
4 1 0 1 4
5 2 1 2 5
8 5 4 5 8
>> gaussVal
gaussVal =
0.3679 0.5353 0.6065 0.5353 0.3679
0.5353 0.7788 0.8825 0.7788 0.5353
0.6065 0.8825 1.0000 0.8825 0.6065
0.5353 0.7788 0.8825 0.7788 0.5353
0.3679 0.5353 0.6065 0.5353 0.3679
>> gaussVal =
0 0 0.6065 0 0
0 0.7788 0.8825 0.7788 0
0.6065 0.8825 1.0000 0.8825 0.6065
0 0.7788 0.8825 0.7788 0
0 0 0.6065 0 0
>> gaussMask =
0 0 0.0602 0 0
0 0.0773 0.0876 0.0773 0
0.0602 0.0876 0.0993 0.0876 0.0602
0 0.0773 0.0876 0.0773 0
0 0 0.0602 0 0
要验证掩码总和为1,只需执行sum(gaussMask(:))
,您就会发现它等于1 ...或多或少:)
答案 2 :(得分:0)
rayryeng的答案对我来说非常有用。我只将高斯核扩展到球核。球内核定义如下:
所以基于rayryeng的回答。我们可以通过
来做到这一点sigma=2;
rho=sigma;
tau=sigma;
%// Find grid of points
[X,Y] = meshgrid(-rho : rho, -rho : rho)
dists = (X.^2 + Y.^2); %// Find distances from the centre (Euclidean distance squared)
ballVal=dists;
ballVal(dists>sigma)=0;
ballVal(dists<=sigma)=1;
%// Now normalize
ballMask = ballVal / (sum(ballVal(:)));
如果有任何错误或问题,请告诉我。谢谢