Matlab中的一维高斯卷积函数
我试图写一个函数,返回一个一维高斯滤波器。该函数以sigma为参数。问题是该函数为所有SIGMA返回相同的数组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
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)