Matlab中的一维高斯卷积函数

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时出现了问题。

当您使用标量执行exp时会发生什么? - Nathan Fellman
2个回答

4

结果没有问题。你的支持向量本质上就是这样,

[-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

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

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

编辑:

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

您还可以使用:

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

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


非常感谢,但我不想使用循环。我想使用向量(支持)代替。请问您能告诉我如何做吗? - Hani
你写的对于 sigma=1 是正确的,但是 3sigma:sigma:3sigma 会给我六个元素,每两个之间的 sigma 都在中间。谢谢您的 fspecial 建议,但我不想使用内置的函数。但是即使 support=-3:3,结果也会是相同的,不是吗? - Hani
结果将随着sigma的变化而改变。support应该独立于sigma,它只应该依赖于窗口大小,在您的情况下似乎是一个1x7向量。 - Jacob
对于我的问题非常抱歉,但能否请您纠正我的代码并根据我的代码给我正确的整个代码..再次非常抱歉。 - Hani
还有其他问题吗? - Jacob

4

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

由于支持区间需要围绕零点对称,因此范围为-3*sigma+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)

+1 回来了(我很久以前就点赞了!)如果你没有图像处理工具箱,这非常好。 - rayryeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接