одномерная функция свертки Гаусса в 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