2014-02-05 197 views
1

來自維基百科http://en.wikipedia.org/wiki/Hessian_matrix,它被定義爲函數的二階偏導數的方陣。如何在梯度上測量matlab中的梯度和Hessian矩陣?

有人可以告訴我它是否正確嗎?

[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; 

回答

0

在每個像素處的Hessian矩陣將是形式[Hxx, Hxy; Hyx, Hyy]的一個2×2矩陣。你可以通過做所有像素矢量化的方式來計算這些數據值:

[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]來近似一階導數,然後第二次得到二階導數。

1

我嘗試了@Matt J的上面提出的方法,它似乎代碼有維度不匹配問題。我修改了第3行和第4行爲

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

現在它正在工作。