我正在尝试编写一个返回一维高斯滤波器的函数.该函数将sigma作为参数.问题是该函数为所有sigma返回相同的数组.
function gaussFilter=gauss(sigma)
width = 3 * sigma;
support = (-width :sigma: width);
gaussFilter= exp( - (support).^2 / (2*sigma^2));
gaussFilter = gaussFilter/ sum(gaussFilter);
Run Code Online (Sandbox Code Playgroud)
请注意,支持数组是正确计算的,但在应用exp时会出现问题.
这个想法是滤波器需要足够宽才能表示高斯函数。经验法则是使用大小至少为 的过滤器6*sigma
。
由于支撑需要以零为中心,这将为您提供-3*sigma
to的范围+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);
Run Code Online (Sandbox Code Playgroud)
示例:(以下所有内容都是等效的)
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)
Run Code Online (Sandbox Code Playgroud)