我正在尝试编写一个返回一维高斯滤波器的函数。该函数将 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 时会出现问题。
最佳答案
想法是滤波器需要足够宽以表示高斯函数。经验法则是使用至少 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)
关于matlab - Matlab中的一维高斯卷积函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1833082/