Skip to main content

RigidParams

Struct RigidParams 

Source
pub struct RigidParams {
    pub levels: usize,
    pub max_samples: usize,
    pub max_iterations: usize,
    pub max_evaluations: usize,
    pub tolerance: f64,
    pub rotation_step_deg: f64,
    pub translation_step_mm: f64,
    pub min_overlap: f64,
    pub initial: Option<[f64; 6]>,
}
Expand description

Registration parameters.

Fields§

§levels: usize

Pyramid levels, finest included. 5 means the volume is registered at 1/16, then 1/8, 1/4, 1/2 and full resolution. Levels that would shrink any axis below 8 voxels are dropped, so a small volume quietly gets fewer and nothing has to be tuned for it.

This is the capture range, and it is the one parameter not to lower. The search starts from the identity, so for identically prescribed slabs it begins with the whole head rotation as the error to find — and 1 - NCC is not a single bowl. A brain is roughly symmetric and full of repeating structure, so the cost falls, rises as one gyrus lines up with its neighbour, and falls again; past some misalignment the coarsest level has a competing minimum of its own and the search converges into it, reporting success.

Measured on the in-vivo-sized test phantom (test_multiorient_register_capture_range), sweeping an oblique-axis rotation:

levelsconverges up to
340°, then fails hard — 92° out, NCC 0.19
5the whole swept range to 70°, to 0.01°

3 was the original default and is not enough: STI wants orientations spread widely over the sphere, so 45° of repositioning is ordinary and would have landed in the failure. The two extra levels cost about twice the metric evaluations but very little wall clock, because the coarse levels hold a few thousand samples each against the cap below.

§max_samples: usize

Upper bound on fixed voxels sampled per metric evaluation, per level.

This, not the volume size, sets the cost of a registration: a 256³ and a 700³ volume take the same time. 6 parameters are vastly over-determined by 10⁵ samples, so lowering this buys speed long before it costs accuracy.

§max_iterations: usize

Maximum Powell cycles (one pass over all six directions) per level.

§max_evaluations: usize

Total metric evaluations across all levels, as a hard stop. Reached only on a cost surface that will not converge; the best parameters so far are returned either way.

§tolerance: f64

Relative cost improvement per Powell cycle below which a level is considered converged.

§rotation_step_deg: f64

Initial line-search step for the three rotations, at the finest level, in degrees. Coarser levels scale it up with the level’s decimation factor.

§translation_step_mm: f64

Initial line-search step for the three translations, at the finest level, in mm. Coarser levels scale it up with the level’s decimation factor.

§min_overlap: f64

Smallest fraction of sampled fixed voxels that must still land inside the moving volume.

NCC over a shrinking overlap is gameable — slide the volumes apart until only one well-correlated patch is left and the correlation goes up. Candidates below this floor are costed worse than any real match, with a gradient that pushes back into the valid region. Keep it low enough for a legitimately partial overlap (a thin slab against a whole head).

§initial: Option<[f64; 6]>

Starting parameters, in the convention of RigidTransform::params. None starts from the identity, i.e. it trusts the two affines to place the volumes in a common world — correct both for separately prescribed slabs (where the affines differ and are truthful) and for identically prescribed ones (where they agree and only the anatomy moved).

Seed it when a previous answer is a good prior and the pyramid’s coarse search is wasted work: registering a time series to one reference, for instance, where each volume starts from where the last one landed. The parameters are defined about the fixed volume’s world centre, so they carry between pairs that share a fixed volume without conversion.

Trait Implementations§

Source§

impl Clone for RigidParams

Source§

fn clone(&self) -> RigidParams

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for RigidParams

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for RigidParams

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Serialize for RigidParams

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneAny for T
where T: Any + Clone,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSend for T
where T: Any + Send,

§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync> ⓘ

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DynClone for T
where T: Clone,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Serialize for T
where T: Serialize + ?Sized,

Source§

fn erased_serialize(&self, serializer: &mut dyn Serializer) -> Result<(), Error>

Source§

fn do_erased_serialize( &self, serializer: &mut dyn Serializer, ) -> Result<(), ErrorImpl>

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.