tpsreg
creates an object encapsulating a thin plate spine
transform mapping a paired landmark set.
xformpoints.tpsreg
enables xform
and
friends to transform 3d vertices (or more complex objects containing 3d
vertices) using a thin plate spline mapping stored in a tpsreg
object.
tpsreg(sample, reference, ...)
# S3 method for tpsreg
xformpoints(reg, points, swap = NULL, ...)
Matrices defining the sample (or floating) and reference (desired target after transformation) spaces. See details.
additional arguments passed to xformpoints.tpsreg
The tpsreg
registration object
The 3D points to transform
Whether to change the direction of registration (default of
NULL
checks if reg has a attr('swap'=TRUE)
) otherwise
Note that we use the nat convention for naming the
sample/reference space arguments but these actually clash with the
nomenclature in the underlying Morpho::tps3d
function.
refmat (Morpho3d) == sample (nat)
tarmat (Morpho3d) == reference (nat)
if (FALSE) {
## A full worked example of using landmarks based registration to construct
## a mirroring registration from one side of the brain to the other.
# read in set of landmarks defined in FAFB CATMAID
library('catmaid')
emlandmarks=catmaid::read.neurons.catmaid('annotation:^GJLandmark')
# Match up L and R pairs
library('stringr')
emlandmarks[,'side']=stringr::str_match(emlandmarks[,'name'], "([LR]) Landmark")[,2]
emlandmarks[,'shortname']=stringr::str_match(emlandmarks[,'name'], "(.*)([LR]) Landmark.*")[,2]
emlandmarks[,'shortname']=sub("[_ ]+$", "", emlandmarks[,'shortname'])
library('dplyr')
lmpairs=dplyr::inner_join(
dplyr::filter(emlandmarks[,], side=="L"),
dplyr::filter(emlandmarks[,], side=="R"),
by='shortname', suffix=c(".L",".R"))
# find mean xyz position of each landmark (they are drawn as a little cross)
lmxyz=t(sapply(emlandmarks, function(x) colMeans(xyzmatrix(x))))
# construct thin plate splines registration (here mapping the right side neurons to left side)
mirror_reg=tpsreg(
lmxyz[as.character(lmpairs$skid.R),],
lmxyz[as.character(lmpairs$skid.L),]
)
# map RHS DA2 PNs onto left and compare with LHS neurons
da2pns.R=catmaid::read.neurons.catmaid('glomerulus DA2 right')
da2pns.L=catmaid::read.neurons.catmaid('glomerulus DA2 left')
da2pns.R.L=xform(da2pns.R, reg = mirror_reg)
plot(da2pns.L, col='red')
plot(da2pns.R.L, col='blue', add=TRUE)
}