Одномерная функция свертки Гаусса в Matlab

Я пытаюсь написать функцию, которая возвращает одномерный фильтр Гаусса. функция принимала сигму в качестве параметра. Проблема в том, что функция возвращает один и тот же массив для всех сигм.

  function gaussFilter=gauss(sigma)  
  width = 3 * sigma;  
  support = (-width :sigma: width);  
  gaussFilter= exp( - (support).^2 / (2*sigma^2));   
  gaussFilter = gaussFilter/ sum(gaussFilter);  

Обратите внимание, что массив поддержки рассчитывается правильно, но проблема возникает при применении exp.


person Hani    schedule 02.12.2009    source источник
comment
что происходит, когда вы выполняете exp со скаляром?   -  person Nathan Fellman    schedule 02.12.2009


Ответы (2)


Идея состоит в том, что фильтр должен быть достаточно широким, чтобы представлять функцию Гаусса. Эмпирическое правило состоит в том, чтобы использовать размер фильтра не менее 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)
person Amro    schedule 02.12.2009
comment
+1 в ответ (на самом деле я поставил +1 давным-давно!) Очень хорошо, если у вас нет набора инструментов для обработки изображений. - person rayryeng; 07.07.2014

В результатах нет ничего плохого. Ваш вектор 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]

Or

-4.5000   -2.0000   -0.5000         0   -0.5000   -2.0000   -4.5000

Итак, вот почему вы всегда получаете один и тот же ответ.

Итак, вам нужно проверить свой алгоритм создания одномерного фильтра Гаусса.

ИЗМЕНИТЬ:

Ваш исходный код в порядке: кроме я не понимаю, почему вы сделали support с -3*sigma:sigma:3*sigma - вы должны изменить его на support = -3:3.

Вы также можете использовать:

gaussFilter = fspecial('gaussian',[1 7],sigma)

РЕДАКТИРОВАТЬ: Ознакомьтесь с решением Amro полный код и объяснение, почему support = -3*sigma:3*sigma, а не support = -3*sigma:sigma:3*sigma

person Jacob    schedule 02.12.2009
comment
Большое спасибо, но я не хочу подавать заявку на петлю. Вместо этого я хотел бы использовать вектор (поддержку). Пожалуйста, не могли бы вы сказать мне, как это сделать. - person Hani; 02.12.2009
comment
То, что вы написали, верно для сигмы = 1, но 3 * сигма: сигма: 3 * сигма даст мне шесть элементов с сигмой между каждыми двумя. Спасибо за специальный совет, но я не хочу использовать встроенный. Но даже с поддержкой =-3:3 результаты будут такими же, не так ли? - person Hani; 02.12.2009
comment
Результаты изменятся относительно сигмы. support должен быть независим от sigma, он должен зависеть только от размера окна, которое в вашем случае кажется вектором 1x7. - person Jacob; 02.12.2009
comment
Прошу прощения за мои тяжелые вопросы, но не могли бы вы исправить мой код и дать мне полный правильный код в зависимости от моего кода.. Мне еще раз очень жаль. - person Hani; 02.12.2009
comment
Есть еще вопросы? - person Jacob; 05.12.2009