Как да измервам градиент и матрица на Хесен в matlab над градиент?

От wikipedia http://en.wikipedia.org/wiki/Hessian_matrix се определя като квадратната матрица на частна производна от втори порядък на функция.

Може ли някой да ми каже дали е правилно?

[i,j]=gradient(im);
filt1=(1./2).*[1,0,-1;0,0,0;1,0,-1];
filt2=(1./2).*[-1,0,-1;0,0,0;1,0,1];
ii=(conv2(filt1,i));
jj=(conv2(filt2,j));

Gx=conv2(ii,im); % Gradient of the image in x-axis
Gy=conv2(jj,im); % Gradient of the image in y-axis


dif_Gx = conv2(f_x,a); % Gradient differentiation of the image in x-axis
dif_Gy = conv2(f_y,a); % Gradient differentiation of the image in y-axis

% Calculate second derivative
Gxx = Gx.^2;
Gyy = Gy.^2;
Gxy = Gx.*Gy;

person user3269865    schedule 05.02.2014    source източник


Отговори (2)


Опитах метода на @Matt J, предложен по-горе, и изглежда, че кодът има проблем с несъвпадение на размери. Модифицирах 3-ти и 4-ти ред като

Hxx(2:m-1,1:end) = diff(im,2,1);
Hyy(1:end,2:n-1) = diff(im,2,2);

И сега работи.

person SimaGuanxing    schedule 16.02.2015

Хесианът на всеки пиксел ще бъде матрица 2 x 2 във формата [Hxx, Hxy; Hyx, Hyy]. Можете да изчислите тези стойности на данните по векторизиран начин във всички пиксели, като направите:

[m,n]=size(im);

[Hxx,Hyy,Hxy,Hyx]=deal(zeros(m,n));

Hxx(2:m-1,2:n-1) = diff(im,2,1);
Hyy(2:m-1,2:n-1) = diff(im,2,2);

tmp = diff(diff(im,1,1),1,2);    
Hxy(2:m-1,2:n-1) = tmp(2:end,2:end);

tmp = diff(diff(im,1,2),1,1);    
Hyx(2:m-1,2:n-1) = tmp(2:end,2:end);

Тези изчисления предполагат, че сте доволни от едностранните разлики. Можете също така да конволирате im с центрирано диференциално ядро, напр. k = [1 0 -1] за приближаване на първите производни и след това втори път за получаване на втори производни.

person Matt J    schedule 05.02.2014