градиент и производная

Я пытаюсь найти первую производную гауссова для изображения (используя Matlab), и я пробовал два способа. Один с использованием градиента, а другой с вычислением производной, но результаты отличаются друг от друга.

  Method 1
  k=7,s=3% kernel,st.dev
  f = fspecial('gaussian', [k k], s)
  [Gx,Gy] = gradient(f)

  Method 2
  k=7,s=3% kernel,st.dev
  [x,y] = meshgrid(-floor(k/2):floor(k/2), -floor(k/2):floor(k/2))
  G = exp(-(x.^2+y.^2)/(2*s^2))/(2*pi*(s^2))
  Gn=G/sum(G(:))
  Gx = -x.*Gn/(s^2)
  Gy = -y.*Gn/(s^2)

Gx и Gy должны быть одинаковыми для двух методов, но есть разница в значениях. Кто-нибудь знает, почему это так? Я ожидал, что они будут одинаковыми. Есть ли предпочтительный способ вычисления производной? Спасибо.

Изменить: изменено определение G по предложению Конрада, но проблема не устранена.


person AL B    schedule 03.06.2015    source источник


Ответы (2)


Это выглядит неправильно:

 G = exp(-(x.^2+y.^2)/(2*s^2))/(2*pi*s);

Предполагая, что это предполагается для нормальной плотности для (X, Y), где X и Y являются независимыми нулевым средним RV с равными SD = s, это должно быть:

G = exp(-(x.^2+y.^2)/(2*s^2))/(2*pi*(s^2));

(Срок перед экспонентой в каждом компоненте равен 1/(sqrt(2*pi)*s), и у вас есть это дважды, что дает 1/(2*pi*s^2) )

person Conrad Turner    schedule 04.06.2015
comment
:Благодарю за ваш ответ. Я отредактировал свой пост, чтобы отразить изменение в G, как вы предложили, но результаты все еще не совпадают. Любые предложения о том, что может быть проблемой? - person AL B; 04.06.2015

Согласно документам fspecial: http://www.mathworks.com/help/images/ref/fspecial.html

введите здесь описание изображения

поэтому кажется, что вы должны изменить G на:

G = exp(-(x.^2+y.^2)/(2*s^2));
person zenpoy    schedule 04.06.2015
comment
спасибо зенпой. Я попытался изменить G, как вы предложили, но результаты, похоже, не изменились, оба метода показывают разные Gx, Gy друг от друга. - person AL B; 04.06.2015