одномерная функция свертки Гаусса в Matlab
Я пытаюсь написать функцию, которая возвращает один dimentional фильтр Гаусса. в качестве параметра функция приняла Сигму. Проблема в том, что функция возвращает тот же массив для всех сигм.
function gaussFilter=gauss(sigma)
width = 3 * sigma;
support = (-width :sigma: width);
gaussFilter= exp( - (support).^2 / (2*sigma^2));
gaussFilter = gaussFilter/ sum(gaussFilter);
обратите внимание, что массив поддержки вычисляется правильно, но проблема возникает при применении exp.
2 ответов
идея в том, что фильтр должен быть достаточно широким, чтобы представлять функцию Гаусса. Эмпирическое правило-использовать размер фильтра не менее 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);
пример: (все следующие утверждения эквивалентны)
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)
нет ничего плохого в результатах. Ваш support
вектор-это, по сути,
[-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
так вот почему вы всегда получите тот же ответ.
поэтому вам нужно проверить свой алгоритм для принятия одномерный гауссовский фильтр.
EDIT:
ваш исходный код в порядке:за исключением я не понимаю, почему вы сделали support
С -3*sigma:sigma:3*sigma
- вы должны изменить его на support = -3:3
.
вы также можете использовать:
gaussFilter = fspecial('gaussian',[1 7],sigma)
EDIT: проверить решение Амро для полного кода и объяснения, почему support = -3*sigma:3*sigma
, а не support = -3*sigma:sigma:3*sigma