7

我正在尝试编写一个返回一维高斯滤波器的函数。该函数将 sigma 作为参数。问题是该函数为所有 sigma 返回相同的数组。

  function gaussFilter=gauss(sigma)  
  width = 3 * sigma;  
  support = (-width :sigma: width);  
  gaussFilter= exp( - (support).^2 / (2*sigma^2));   
  gaussFilter = gaussFilter/ sum(gaussFilter);  

请注意,支持数组已正确计算,但在应用 exp 时会出现问题。

4

2 回答 2

4

结果没有错。你的support向量本质上是,

[-3*sigma -2*sigma -1*sigma 0 1*sigma 2*sigma 3*sigma]

如果你将每个支持元素平方并乘以 -1,-support.^2

[-9*sigma^2 -4*sigma^2 -1*sigma^2 0 -1*sigma^2 -4*sigma^2 -9*sigma^2]

所以除以它2*sigma^2总是会产生相同的向量,

[-9/2 -4/2 -1/2 0 -1/2 -4/2 -9/2]

或者

-4.5000   -2.0000   -0.5000         0   -0.5000   -2.0000   -4.5000

所以这就是为什么你总是得到相同的答案。

所以你需要检查你的算法来制作一维高斯滤波器。

编辑:

您的原始代码很好:除了我不明白您为什么support使用-3*sigma:sigma:3*sigma- 您应该将其更改为support = -3:3.

您还可以使用:

gaussFilter = fspecial('gaussian',[1 7],sigma)

编辑:查看Amro 的解决方案以获得完整的代码和解释为什么support = -3*sigma:3*sigma而不是support = -3*sigma:sigma:3*sigma

于 2009-12-02T14:22:19.177 回答
4

这个想法是滤波器需要足够宽以表示高斯函数。经验法则是至少使用6*sigma.

由于支撑需要以零为中心,这将为您提供-3*sigmato的范围+3*sigma(更准确地说,它是-/+ round(6*sigma - 1)/2考虑中间的零)。因此:

function gaussFilter = gauss(sigma)
    width = round((6*sigma - 1)/2);
    support = (-width:width);
    gaussFilter = exp( -(support).^2 ./ (2*sigma^2) );
    gaussFilter = gaussFilter/ sum(gaussFilter);

示例:(以下都是等价的)

sigma = 1.2;
width = round((6*sigma - 1)/2);

gauss(sigma)

normpdf( -width:width, 0, sigma )

fspecial('gaussian', [1 2*width+1], sigma)

h = gausswin(2*width+1)';
h = h / sum(h)
于 2009-12-02T20:43:16.320 回答