如何在matlab中测量梯度和Hessian矩阵?

如何在matlab中测量梯度和Hessian矩阵?,matlab,matrix,hessian-matrix,Matlab,Matrix,Hessian Matrix,wikipedia将其定义为函数二阶偏导数的平方矩阵 有人能告诉我这是否正确吗 [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); % Gra

wikipedia将其定义为函数二阶偏导数的平方矩阵

有人能告诉我这是否正确吗

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

每个像素处的Hessian将是一个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=[10-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);
现在它开始工作了