hessianScalar

Below is a demonstration of the features of the hessianScalar function See also: gradient,|hessian|,|jacobian|,|cellEig|.

Contents

clear; close all; clc;

Syntax

H=hessianScalar(M,voxelSize,cellOpt);

Description

This function computes the Hessian matrix of the scalar function U for each point in U. U may be a vector, a 2D matrix or a 3D matrix. The vector v denotes the points spacing between the data entries in U. If v is not supplied the spacing is assumed to be homogeneous and unity. If the input is n dimensional array consisting of m entries then the output is a matrix (if cellOpt==0) the size of mx(n^2) (whereby the colum entries define the entries in a Hessian matrix and row entries relate to elements in the input array). If cellOpt==1 then the output is reformed into a cell array that matches the size of the input aray. Each cell entry then contains the nxn Hessian matrix.

Examples

Plot settings

faceAlpha1=1;
faceAlpha2=0.3;
fontSize=10;
markerSize=25;
edgeWidth=1;
edgeColor='k';
cMap=gray(250);

1D Hessian on vector

%A random vector
M=randn(10,1)

%Compute Hessian
H=hessianScalar(M,[],0)
M =

   -1.0290
    0.2065
    1.3411
    1.3327
   -1.2849
    1.6184
    0.6616
    0.2273
   -0.2256
   -0.9660


H =

   -0.0505
   -0.3362
   -1.2490
   -0.2101
    1.1431
   -0.4192
   -0.7084
    0.0494
   -0.1484
   -0.1437

2D Hessian on a matrix (e.g. an image)

Below an example is shown for the Hessian of an image.

Load example image

%Set main folder
defaultFolder = fileparts(fileparts(mfilename('fullpath')));
pathName=fullfile(defaultFolder,'data','PICT');
loadName=fullfile(pathName,'leaf1.jpg'); %Load name
M=mean(double(importdata(loadName)),3); %Import and conver to grayscale
n=4;
M=M(1:n:end,1:n:end);

Computing the Hessian of the image

voxelSize=[1 1];
cellOpt=0;
H=hessianScalar(M,voxelSize,cellOpt);

In the above example the third input, cellOpt, was set to zero this leads to a m x (n^2) array whereby the colum entries define the entries in a Hessian matrix and row entries relate to elements in the input array. In this case a Hessian trace image can be computed as:

Mh_trace=reshape(H(:,1)+H(:,end),size(M)); %Compute trace for visualization

Visualize results

cFigure;

subplot(1,2,1); hold on;
title('Original image','fontSize',fontSize);
imagesc(M);
axis equal; axis tight; axis ij;
colormap(cMap); colorbar;

subplot(1,2,2); hold on;
title('Hessian trace','fontSize',fontSize);
imagesc(Mh_trace);
axis equal; axis tight; axis ij;
colormap(cMap); colorbar;

drawnow;

The cell output option

Alternatively if cellOpt==1 then the output is reformed into a cell array that matches the size of the input aray. Each cell entry then contains the nxn Hessian matrix. However this requires a matrix to cell and reshape operation making this approach slower than when cellOpt==0. However after conversion to cell form each cell contains a Hessian matrix and computations on these matrices can be performed using the syntax: [B]=cellfun(@my_func,H,'UniformOutput',0); Where my_func is a suitable function for the Hessian matrices. For instance to computer a trace image one can use: [B]=cellfun(@trace,A,'UniformOutput',0); This form has also been created as a function, namely cellTrace, see below.

Computing the Hessian of the image

voxelSize=[1 1];
cellOpt=1;
H=hessianScalar(M,voxelSize,cellOpt);

Each cell contains a Hessian matrix, for example:

H{1,1}
ans =

   -0.6667   -6.6667
   -6.6667    3.0000

Compute a trace image using cellTrace function:

Mh_trace=cellTrace(H);

Computing eigenvalues using cellEig function:

[Mh_V,Mh_D]=cellEig(H);

%Get first and second eigenvalues
[Mh_D1]=cell2mat(cellfun(@(x) x(1,1) ,Mh_D,'UniformOutput',0));
[Mh_D2]=cell2mat(cellfun(@(x) x(2,2) ,Mh_D,'UniformOutput',0));

Visualize results

cFigure;

subplot(1,2,1); hold on;
title('Hessian 1st eigenvalue','fontSize',fontSize);
imagesc(Mh_D1);
axis equal; axis tight; axis ij;
colormap(cMap); colorbar;

subplot(1,2,2); hold on;
title('Hessian 2nd eigenvalue','fontSize',fontSize);
imagesc(Mh_D2);
axis equal; axis tight; axis ij;
colormap(cMap); colorbar;

drawnow;

GIBBON www.gibboncode.org

Kevin Mattheus Moerman, [email protected]

GIBBON footer text

License: https://github.com/gibbonCode/GIBBON/blob/master/LICENSE

GIBBON: The Geometry and Image-based Bioengineering add-On. A toolbox for image segmentation, image-based modeling, meshing, and finite element analysis.

Copyright (C) 2019 Kevin Mattheus Moerman

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.