123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455 |
- function varargout = spm_diffeo(varargin)
- % Mex function called for image registration stuff
- %
- %_______________________________________________________________________
- %
- % FORMAT u = spm_diffeo('vel2mom', v, param)
- % v - velocity (flow) field n1*n2*n3*3.
- % param - 8 parameters (settings)
- % - [1][2][3] Voxel sizes
- % - [4][5][6][7][8] Regularisation parameters
- % - [4] Absolute displacements need to be penalised by a tiny
- % amount. The first element encodes the amount of
- % penalty on these. Ideally, absolute displacements
- % should not be penalised, but it is usually necessary
- % for technical reasons.
- % - [5] The `membrane energy' of the deformation is penalised,
- % usually by a relatively small amount. This penalises
- % the sum of squares of the derivatives of the velocity
- % field (ie the sum of squares of the elements of the
- % Jacobian tensors).
- % - [6] The `bending energy' is penalised (3rd element). This
- % penalises the sum of squares of the 2nd derivatives of
- % the velocity.
- % - [7][8] Linear elasticity regularisation is also included.
- % The first parameter (mu) is similar to that for
- % linear elasticity, except it penalises the sum of
- % squares of the Jacobian tensors after they have been
- % made symmetric (by averaging with the transpose).
- % This term essentially penalises length changes,
- % without penalising rotations.
- % The final term also relates to linear elasticity,
- % and is the weight that denotes how much to penalise
- % changes to the divergence of the velocities (lambda).
- % This divergence is a measure of the rate of volumetric
- % expansion or contraction.
- % u - `momentum' field n1*n2*n3*3.
- %
- % Convert a velocity field to a momentum field by u = A*v, where
- % A is the large sparse matrix encoding some form of regularisation.
- % v and m are single precision floating point.
- %
- %_______________________________________________________________________
- %
- % FORMAT v = spm_diffeo('mom2vel',g, param)
- % v - the solution n1*n2*n3*3
- % g - parameterisation of first derivatives
- % param - 10 parameters (settings)
- % - [1][2][3] Voxel sizes
- % - [4][5][6][7][8] Regularisation settings (see vel2mom).
- % - [9] Number of Full Multigrid cycles.
- % - [10] Number of relaxation iterations per cycle.
- %
- % Solve equations using a Full Multigrid method. See Press et al
- % for more information.
- % v = inv(A)*g
- % g and v are both single precision floating point.
- %
- %_______________________________________________________________________
- %
- % FORMAT v = spm_diffeo('fmg',H, g, param)
- % v - the solution n1*n2*n3*3
- % H - parameterisation of 2nd derivatives
- % g - parameterisation of first derivatives
- % param - 10 parameters (settings)
- % - [1][2][3] Voxel sizes
- % - [4][5][6][7][8] Regularisation settings (see vel2mom).
- % - [9] Number of Full Multigrid cycles.
- % - [10] Number of relaxation iterations per cycle.
- %
- % Solve equations using a Full Multigrid method, but using Hessian of
- % the matching term. See Press et al for more information.
- % v = inv(A+H)*g
- % H, g and v are all single precision floating point.
- %
- %_______________________________________________________________________
- %
- % FORMAT v = spm_diffeo('cgs',H, g, param)
- % v - the solution
- % H - parameterisation of 2nd derivatives
- % g - parameterisation of first derivatives
- % param - 10 parameters (settings)
- % - [1][2][3] Voxel sizes
- % - [4][5][6][7][8] Regularisation settings (see vel2mom).
- % - [9] Tolerance. Indicates required degree of accuracy.
- % - [10] Maximum number of iterations.
- %
- % This is for solving a set of equations using a conjugate gradient
- % solver. This method is less efficient than the Full Multigrid, and
- % is included for illustrative purposes.
- % v = inv(A+H)*g
- % H, g and v are all single precision floating point.
- %
- %_______________________________________________________________________
- %
- % FORMAT F = spm_diffeo('kernel',d,prm)
- % d - image dimensions
- % prm - 8 parameters (settings).
- % These are described above (for 'vel2mom').
- % F - The differential operator encoded as an image (or images).
- % Convolving a velocity field by this will give the momentum.
- %
- % Note that a smaller (3D) kernel is obtained when the linear
- % elasticity settings are all zero. If any of the linear
- % elasticity settings are non-zero, the resulting kernel is
- % represented by a 5D array. For the 3D form, the voxel sizes
- % need to be incorporated as an additional scaling of the kernel.
- % See the code in spm_shoot_greens.m for an illustration.
- %
- %_______________________________________________________________________
- %
- % FORMAT y3 = spm_diffeo('comp',y1,y2)
- % y1, y2 - deformation fields n1*n2*n3*3.
- % y3 - deformation field field n1*n2*n3*3.
- %
- % Composition of two deformations y3 = y1(y2)
- % y1, y2 and y3 are single precision floating point.
- %
- %
- % FORMAT [y3,J3] = spm_diffeo('comp', y1, y2, J1, J2)
- % y1, y2 - deformation fields n1*n2*n3*3.
- % y3 - deformation field n1*n2*n3*3.
- % J1, J2 - Jacobian tensor fields n1*n2*n3*3*3.
- % J3 - Jacobian tensor field n1*n2*n3*3*3.
- %
- % Composition of two deformations, with their Jacobian fields.
- % All fields are single precision floating point.
- %
- %_______________________________________________________________________
- %
- % FORMAT iy = spm_diffeo('invdef',y,d,M1,M2);
- %
- % iy - inverted deformation field of size d(1)*d(2)*d(3)*3.
- % y - original deformation field.
- % M1 - An affine mapping from mm to voxels in the co-ordinate
- % system of the inverse deformation field.
- % M2 - An affine mapping from voxels to mm in the co-ordinate
- % system of the forward deformation field.
- %
- % Inversion of a deformation field.
- %
- % The field is assumed to consist of a piecewise affine transformations,
- % whereby each cube jointing 8 neighbouring voxels contains eight
- % tetrahedra. The mapping within each tetrahedron is assumed to be
- % affine.
- %
- % Reference:
- % J. Ashburner, J. Andersson and K. J. Friston (2000).
- % "Image Registration using a Symmetric Prior - in Three-Dimensions".
- % Human Brain Mapping 9(4):212-225 (appendix).
- %_______________________________________________________________________
- %
- % FORMAT [f,dfx,dfy,dfz] = spm_diffeo('bsplins', c, y,d)
- % c - input image(s) of B-spline coefficients n1*n2*n3*n4
- % - see 'bsplinc'
- % y - points to sample n1*n2*n3*3
- % d(1:3) - degree of B-spline (from 0 to 7) along different dimensions
- % - these must be same as used by 'bsplinc'
- % d(4:6) - 1/0 to indicate wrapping along the dimensions
- %
- % f - output image n1*n2*n3*n4
- % dfx,dfy,dfz - sampled first derivatives
- %
- % c, f and y are single precision floating point.
- %
- % This function takes B-spline basis coefficients from spm_bsplinc,
- % and re-convolves them with B-splines centred at the new sample points.
- %
- % Note that nearest neighbour interpolation is used instead of 0th
- % degree B-splines, and the derivatives of trilinear interpolation are
- % returned insted of those of 1st degree B-splines. The difference is
- % extremely subtle.
- %
- % c, f and y are single precision floating point.
- %
- % References:
- % M. Unser, A. Aldroubi and M. Eden.
- % "B-Spline Signal Processing: Part I-Theory,"
- % IEEE Transactions on Signal Processing 41(2):821-832 (1993).
- %
- % M. Unser, A. Aldroubi and M. Eden.
- % "B-Spline Signal Processing: Part II-Efficient Design and
- % Applications,"
- % IEEE Transactions on Signal Processing 41(2):834-848 (1993).
- %
- % M. Unser.
- % "Splines: A Perfect Fit for Signal and Image Processing,"
- % IEEE Signal Processing Magazine, 16(6):22-38 (1999)
- %
- % P. Thevenaz and T. Blu and M. Unser.
- % "Interpolation Revisited"
- % IEEE Transactions on Medical Imaging 19(7):739-758 (2000).
- %
- %_______________________________________________________________________
- %
- % FORMAT c = spm_diffeo('bsplinc',f,d)
- % f - an image
- % d(1:3) - degree of B-spline (from 0 to 7) along different dimensions
- % d(4:6) - 1/0 to indicate wrapping along the dimensions
- % c - returned volume of B-spline coefficients
- %
- % This function deconvolves B-splines from f, returning
- % coefficients, c. These coefficients are then passed to 'bsplins'
- % in order to sample the data using B-spline interpolation.
- %
- %_______________________________________________________________________
- %
- % FORMAT f2 = spm_diffeo('samp', f1, y)
- % f1 - input image(s) n1*n2*n3*n4
- % y - points to sample n1*n2*n3*3
- % f2 - output image n1*n2*n3*n4
- %
- % Sample a function according to a deformation using trilinear interp.
- % f2 = f1(y)
- % f1, f2 and y are single precision floating point.
- % Uses boundary condiditions that wrap around (circulant - identical to
- % the 'pullc' option - but retained for backward compatibility).
- %
- %_______________________________________________________________________
- %
- % FORMAT f2 = spm_diffeo('pull', f1, y)
- % f1 - input image(s) n1*n2*n3*n4
- % y - points to sample n1*n2*n3*3
- % f2 - output image n1*n2*n3*n4
- %
- % Sample a function according to a deformation using trilinear interp.
- % f2 = f1(y)
- % f1, f2 and y are single precision floating point.
- % Values sampled outside the field of view of f1 are assigned a value
- % of NaN.
- %
- %_______________________________________________________________________
- %
- % FORMAT f2 = spm_diffeo('pullc', f1, y)
- % f1 - input image(s) n1*n2*n3*n4
- % y - points to sample n1*n2*n3*3
- % f2 - output image n1*n2*n3*n4
- %
- % Sample a function according to a deformation using trilinear interp.
- % f2 = f1(y)
- % f1, f2 and y are single precision floating point.
- % Uses boundary condiditions that wrap around (circulant - identical to
- % the 'samp' option).
- %
- %_______________________________________________________________________
- %
- % FORMAT f2 = spm_diffeo('push', f1, y)
- % f1 - input image(s) n1*n2*n3*n4
- % y - points to sample n1*n2*n3*3
- % f2 - output image n1*n2*n3*n4
- %
- % Push values of a function according to a deformation. Note that the
- % deformation should be the inverse of the one used with 'samp' or
- % 'bsplins'. f1, f2 and y are single precision floating point.
- % Voxels in f1 that would be pushed outside the field of view of f2
- % are ignored.
- %
- %_______________________________________________________________________
- %
- % FORMAT f2 = spm_diffeo('pushc', f1, y)
- % f1 - input image(s) n1*n2*n3*n4
- % y - points to sample n1*n2*n3*3
- % f2 - output image n1*n2*n3*n4
- %
- % Push values of a function according to a deformation, but using
- % circulant boundary conditions. Data wraps around (circulant).
- % f1, f2 and y are single precision floating point.
- %
- %_______________________________________________________________________
- %
- % FORMAT ut = spm_diffeo('pushg', u0, y)
- % u0 - input momentum n1*n2*n3*3
- % y - points to sample n1*n2*n3*3
- % ut - output momentum n1*n2*n3*3
- %
- % FORMAT ut = spm_diffeo('pushg', u0, y)
- % u0 - input momentum n1*n2*n3*3
- % y - points to sample n1*n2*n3*3
- % J - Jacobian tensor field of y n1*n2*n3*3*3
- % ut - output momentum n1*n2*n3*3
- %
- % Push values of a momentum field according to a deformation using
- % circulant boundary conditions. This essentially computes
- % (Ad_y)^* u = |det dy| (dy)^T u(y), which is a key to the
- % EPdiff equations used for geodesic shooting.
- % u0, ut and y are single precision floating point.
- %
- %_______________________________________________________________________
- %
- % FORMAT f2 = spm_diffeo('resize', f1, dim)
- % f1 - input fields n1*n2*n3*n4
- % f2 - output field dim1*dim2*dim3*n4
- % dim - output dimensions
- %
- % Resize a field according to dimensions dim. This is a component of
- % the multigrid approach, and is used for prolongation.
- %
- %_______________________________________________________________________
- %
- % FORMAT v2 = spm_diffeo('restrict', v1)
- % v1 - input fields n1*n2*n3*n4
- % v2 - output field dim1*dim2*dim3*n4
- %
- % Restricts a field such that its dimensions are approximately half
- % their original. This is a component of the multigrid approach.
- %
- %_______________________________________________________________________
- %
- % FORMAT J = spm_diffeo('def2jac',y)
- % y - Deformation field
- % J - Jacobian tensor field of y
- %
- % Compute Jacobian tensors from a deformation.
- %
- %_______________________________________________________________________
- %
- % FORMAT J = spm_diffeo('def2det',y)
- % y - Deformation field
- % j - Jacobian determinant field of y
- %
- % Compute Jacobian determinants from a deformation.
- %
- %_______________________________________________________________________
- %
- % FORMAT j = spm_diffeo('det',J)
- % J - Jacobian tensor field
- % j - Jacobian determinant field
- %
- % Compute determinants of Jacobian tensors.
- %
- %_______________________________________________________________________
- %
- % FORMAT dv = spm_diffeo('div',v)
- % v - velocity field
- % dv - divergences of velocity field
- %
- % Computes divergence from velocity field. This is indicative of rates
- % of volumetric expansion/contraction.
- %
- %_______________________________________________________________________
- %
- % FORMAT [y,J] = spm_diffeo('smalldef',v,s)
- % v - velocity field
- % s - scaling factor
- % y - small deformation
- % J - approximate Jacobian tensors of small deformation (computed via
- % a matrix exponsntial of the Jacobians of the velocity field).
- %
- % This function is used for each time step of geodesic shooting. It may
- % change in future to use some form of Pade approximation of the
- % small deformation.
- %
- %_______________________________________________________________________
- %
- % FORMAT v3 = spm_diffeo('brc', v1, v2)
- % v1, v2, v3 - flow fields n1*n2*n3*3
- %
- % Lie Bracket. Useful for many things
- % e.g. Baker-Campbell-Haussdorf series expansion.
- % The Lie bracket is denoted by
- % v3 = [v1,v2]
- % and on scalar fields, is computed by
- % v3 = J1*v2 - J2*v1, where J1 and J2 are the Jacobian
- % tensor fields. For matrices, the Lie bracket is simply
- % [A,B] = A*B-B*A
- %
- %_______________________________________________________________________
- %
- % FORMAT t = spm_diffeo('trapprox',H, param)
- % v - the solution n1*n2*n3*3
- % H - parameterisation of 2nd derivatives
- % param - 10 parameters (settings)
- % - [1][2][3] Voxel sizes
- % - [4][5][6][7][8] Regularisation settings (see vel2mom).
- % t - approximation of [trace((L+H)\L) trace((L+H)\H)];
- %
- % Generate an approximation of Trace((L+H)\L) and Trace((L+H)\H) for
- % to give a ball-park figure for the "degrees of freedom" in Laplace
- % approximations. L is the regulariser in sparse matrix form. The
- % approximation is a poor one, which assumes all the off-diagonals of L
- % are 0.
- % H is single precision floating point.
- %
- %_______________________________________________________________________
- %
- % FORMAT v = spm_diffeo('dartel',v,g,f,param)
- % v - flow field n1*n2*n3*3 (single precision float)
- % g - first image n1*n2*n3*n4 (single precision float)
- % f - second image n1*n2*n3*n4 (single precision float)
- % param - 9 parameters (settings)
- % - [1] Regularisation type, can take values of
- % - 0 Linear elasticity
- % - 1 Membrane energy
- % - 2 Bending energy
- % - [2][3][4] Regularisation parameters
- % - For "membrane energy", the parameters are
- % lambda, unused and id.
- % - For "linear elasticity", the parameters are
- % mu, lambda, and id
- % - For "bending energy", the parameters are
- % lambda, id1 and id2, such that regularisation is by
- % (-lambda*\grad^2 + id1)^2 + id2
- % - [5] Levenberg-Marquardt regularisation
- % - [6] Number of Full Multigrid cycles
- % - [7] Number of relaxation iterations per cycle
- % - [8] K, such that 2^K time points are used to
- % generate the deformations. A value of zero
- % indicates a small deformation model.
- % - [9] code of 0, 1 or 2.
- % 0 - asymmetric sums of squares objective function.
- % 1 - symmetric sums of squares objective function.
- % 2 - assumes multinomial distribution, where template
- % encodes the means and interpolation of template
- % done using logs and softmax function.
- %
- % This is for performing a single iteration of the Dartel optimisation.
- % All velocity fields and images are represented by single precision floating
- % point values. Images can be scalar fields, in which case the objective
- % function is the sum of squares difference. Alternatively, images can be
- % vector fields, in which case the objective function is the sum of squares
- % difference between each scalar field + the sum of squares difference
- % between one minus the sum of the scalar fields.
- %
- %_______________________________________________________________________
- %
- % FORMAT [y,J] = spm_diffeo('Exp', v, param)
- % v - flow field
- % J - Jacobian. Usually a tensor field of Jacobian matrices, but can
- % be a field of Jacobian determinants.
- % param - 2 (or 3) parameters.
- % [1] K, the number of recursions (squaring steps), such
- % that exponentiation is done using an Euler-like
- % integration with 2^K time steps.
- % [2] a scaling parameter.
- % If there is a third parameter, and it is set to 1, then
- % the J will be the Jacobian determinants.
- %
- % A flow field is "exponentiated" to generate a deformation field
- % using a scaling and squaring approach. See the work of Arsigny
- % et al, or Cleve Moler's "19 Dubious Ways" papers.
- %
- %_______________________________________________________________________
- %
- % Note that the boundary conditions are circulant throughout.
- % Interpolation is trilinear, except for the resize function
- % which uses a 2nd degree B-spline (without first deconvolving).
- %
- %_______________________________________________________________________
- % Copyright (C) 2012 Wellcome Trust Centre for Neuroimaging
- % John Ashburner
- % $Id: spm_diffeo.m 7460 2018-10-29 15:55:12Z john $
- %-This is merely the help file for the compiled routine
- error('spm_diffeo.c not compiled - see Makefile')
|