截断高斯内核实现Matlab,对吧?

时间:2014-07-31 13:59:49

标签: matlab image-processing computer-vision gaussian

我将截断的高斯内核定义为:

所以我混淆了截断高斯内核的正确实现。让我看看两个案例,让我知道,非常感谢你

案例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

3 个答案:

答案 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 = 2tau = 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 - 归一化,因此sum等于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 ...或多或少:)

答案 2 :(得分:0)

rayryeng的答案对我来说非常有用。我只将高斯核扩展到球核。球内核定义如下: enter image description here

所以基于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(:)));

如果有任何错误或问题,请告诉我。谢谢