Matlab中的一维高斯卷积函数

Matlab中的一维高斯卷积函数,matlab,gaussian,Matlab,Gaussian,我试图写一个函数,返回一个一维高斯滤波器。该函数以sigma为参数。问题是该函数为所有SIGMA返回相同的数组 function gaussFilter=gauss(sigma) width = 3 * sigma; support = (-width :sigma: width); gaussFilter= exp( - (support).^2 / (2*sigma^2)); gaussFilter = gaussFilter/ sum(gaussFil

我试图写一个函数,返回一个一维高斯滤波器。该函数以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时会出现问题。

结果没有任何错误。您的
支持
向量本质上是

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

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

因此,您需要检查算法,以制作一维高斯滤波器

编辑:

你的原始代码很好:除了我不明白你为什么要用
-3*sigma:sigma:3*sigma
来做
支持
-你应该把它改成
支持=-3:3

您还可以使用:

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

编辑:查看完整的代码和解释为什么
支持=-3*sigma:3*sigma
而不是
支持=-3*sigma:sigma:3*sigma
想法是过滤器需要足够宽以表示高斯函数。经验法则是使用至少
6*sigma
的过滤器大小

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

示例:(以下所有内容都是等效的)


当您使用标量执行
exp
时会发生什么?非常感谢,但我不想应用循环。我想改用向量(支持)。请你告诉我怎么做。你写的对sigma=1是正确的,但是3*sigma:sigma:3*sigma会给我六个元素,每两个元素之间有sigma。谢谢你的特别建议,但我不想使用内置的。但是即使支持=-3:3,结果也是一样的,不是吗?结果会随着西格玛的变化而变化<代码>支持应该独立于
西格玛
,它应该只取决于窗口大小,在您的情况下,这似乎是一个1x7向量。我很抱歉我的问题很重,但您能否根据我的代码更正我的代码并给出完整的正确代码。我再次表示抱歉。还有其他问题吗?+1返回(事实上我很久以前就知道了!)如果你没有图像处理工具箱,那就太好了。
gaussFilter = fspecial('gaussian',[1 7],sigma)
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)