在上一篇文章的基础上,还有一个如何实现内核的问题。你可以使用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 的示例,每个阶段的输出:
第 1 阶段 - 查找网格坐标
>> 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
第 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
第 3 步 - 过滤掉不属于半径范围内的位置并设置为 0
>> 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
步骤 #4 - 归一化,使总和等于 1
>> 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...或多或少 :)