I have abandoned the idea of writing OO registration tools.
Instead, I have split the code into basic functions that I have tried to make as generic as possible, to ease their use by others.
Core functions (in folder /core/) perform basic tasks with not too many inputs (line search, log-likelihood, gradient and hessian, warping and pushing, affine/velocity exponentiation and reconstruction)
Script functions (in folder /script/) perform more advanced tasks, i.e. actual registration (initialisation, gauss newton iterations, etc). They take an "option structure" as input.
Most core functions have options to enable/disable looping on components or slices (to save memory) and enable/disable parallelisation.
There are currently 5 script functions:
affine registration
diffeomorphic registration (the classical one)
principal geodesic (PG) registration (when a principal subspace is provided)
PG + residual field
PG + residual field + affine
I have tested them on a couple of 2D images (both MNIST and IXI), they seem to work but need further validation. (In particular, I have sign issues when computing the GN direction).
I have abandoned the idea of writing OO registration tools. Instead, I have split the code into basic functions that I have tried to make as generic as possible, to ease their use by others.
Most core functions have options to enable/disable looping on components or slices (to save memory) and enable/disable parallelisation.
There are currently 5 script functions:
I have tested them on a couple of 2D images (both MNIST and IXI), they seem to work but need further validation. (In particular, I have sign issues when computing the GN direction).