Comprehensive Python library for diffusion MRI analysis including tensor imaging, tractography, and visualization
—
Image registration algorithms for aligning diffusion data, including affine and non-linear registration methods, motion correction, and streamline registration. DIPY provides high-level registration functions that handle common alignment tasks.
Symmetric diffeomorphic registration for non-linear alignment between images.
def syn_registration(moving, static, *, moving_affine=None, static_affine=None, step_length=0.25, metric="CC", dim=3, level_iters=None, prealign=None, **metric_kwargs):
"""
Symmetric diffeomorphic registration between 2D/3D images.
Parameters:
moving (array/str): moving image data or file path
static (array/str): static (target) image data or file path
moving_affine (array): 4x4 affine for moving image
static_affine (array): 4x4 affine for static image
step_length (float): optimization step length
metric (str): similarity metric ('CC', 'EM', 'SSD')
dim (int): image dimensions (2 or 3)
level_iters (list): iterations at each pyramid level
prealign (array): initial transformation matrix
Returns:
tuple: (warped_moving, mapping) - registered image and transformation
"""
def register_dwi_to_template(dwi, gtab, *, dwi_affine=None, template=None, template_affine=None, reg_method="syn", **reg_kwargs):
"""
Register DWI data to template through B0 volumes.
Parameters:
dwi (array/str): DWI data or file path
gtab (GradientTable): diffusion gradient table
dwi_affine (array): 4x4 affine for DWI data
template (array/str): template image or file path
template_affine (array): 4x4 affine for template
reg_method (str): registration method ('syn' or 'aff')
Returns:
tuple: (warped_b0, mapping) - registered B0 and transformation
"""Multi-step affine registration with gradual transformation fitting.
def affine_registration(moving, static, *, moving_affine=None, static_affine=None, pipeline=None, starting_affine=None, metric="MI", level_iters=None, sigmas=None, factors=None, ret_metric=False, moving_mask=None, static_mask=None, **metric_kwargs):
"""
Multi-step affine registration pipeline.
Parameters:
moving (array/str): moving image
static (array/str): static image
moving_affine (array): 4x4 affine for moving image
static_affine (array): 4x4 affine for static image
pipeline (list): transformation sequence (['center_of_mass', 'translation', 'rigid', 'affine'])
starting_affine (array): initial transformation
metric (str): similarity metric ('MI')
level_iters (list): iterations at each scale level
sigmas (list): smoothing parameters for scale space
factors (list): scale factors for pyramid
ret_metric (bool): return optimization metrics
moving_mask (array): mask for moving image
static_mask (array): mask for static image
Returns:
tuple: (resampled, final_affine) or (resampled, final_affine, xopt, fopt)
"""
def center_of_mass(moving, static, **kwargs):
"""Center of mass alignment transform."""
def translation(moving, static, **kwargs):
"""Translation-only transform."""
def rigid(moving, static, **kwargs):
"""Rigid transform (translation + rotation)."""
def rigid_isoscaling(moving, static, **kwargs):
"""Rigid transform with isometric scaling."""
def rigid_scaling(moving, static, **kwargs):
"""Rigid transform with anisotropic scaling."""
def affine(moving, static, **kwargs):
"""Full affine transform (12 degrees of freedom)."""Registration of 4D image series and DWI datasets for motion correction.
def register_series(series, ref, *, pipeline=None, series_affine=None, ref_affine=None, static_mask=None):
"""
Register 4D image series to reference volume.
Parameters:
series (array/str): 4D image series
ref (int/array/str): reference volume index or image
pipeline (list): transformation sequence
series_affine (array): 4x4 affine for series
ref_affine (array): 4x4 affine for reference
static_mask (array): mask for reference image
Returns:
tuple: (xformed, affines) - registered series and transformation matrices
"""
def register_dwi_series(data, gtab, *, affine=None, b0_ref=0, pipeline=None, static_mask=None):
"""
Register DWI series to mean B0 (motion correction).
Parameters:
data (array/str): 4D DWI data
gtab (GradientTable): gradient table
affine (array): 4x4 affine transformation
b0_ref (int): reference B0 volume index
pipeline (list): transformation sequence
static_mask (array): mask for reference
Returns:
tuple: (xform_img, affine_array) - registered data and transformations
"""
def motion_correction(data, gtab, **kwargs):
"""
Motion correction for DWI datasets.
Alias for register_dwi_series with standard pipeline.
"""Registration of streamline bundles to align tractography results.
def streamline_registration(moving, static, *, n_points=100, native_resampled=False):
"""
Register streamline bundles to each other.
Parameters:
moving (list/str): moving streamlines or file path
static (list/str): static streamlines or file path
n_points (int): number of points for resampling
native_resampled (bool): return in original space but resampled
Returns:
tuple: (aligned, matrix) - aligned streamlines and 4x4 transformation
"""Utilities for resampling images between different spaces and managing transformations.
def resample(moving, static, *, moving_affine=None, static_affine=None, between_affine=None):
"""
Resample image from one space to another.
Parameters:
moving (array/str): moving image
static (array/str): target image defining output space
moving_affine (array): 4x4 affine for moving image
static_affine (array): 4x4 affine for static image
between_affine (array): additional transformation between spaces
Returns:
Nifti1Image: resampled image in target space
"""
def write_mapping(mapping, fname):
"""
Save registration mapping to nifti file.
Parameters:
mapping (DiffeomorphicMap): registration mapping
fname (str): output file path
"""
def read_mapping(disp, domain_img, codomain_img, *, prealign=None):
"""
Load registration mapping from nifti file.
Parameters:
disp (str/array): displacement field file or data
domain_img (str/array): domain image
codomain_img (str/array): codomain image
prealign (array): pre-alignment transformation
Returns:
DiffeomorphicMap: loaded registration mapping
"""# Basic non-linear registration
from dipy.align import syn_registration
from dipy.data import read_stanford_hardi
import numpy as np
# Load example data
img, _ = read_stanford_hardi()
data = img.get_fdata()
# Use first and last volumes as moving and static
moving = data[..., 0]
static = data[..., -1]
# Perform symmetric diffeomorphic registration
warped, mapping = syn_registration(moving, static, metric='CC')
print(f"Original shape: {moving.shape}")
print(f"Warped shape: {warped.shape}")
# Motion correction for DWI series
from dipy.align import motion_correction
# Load full DWI data
img, gtab = read_stanford_hardi()
data = img.get_fdata()
# Apply motion correction
corrected_img, transforms = motion_correction(data, gtab)
print(f"Applied {transforms.shape[-1]} transformations")
# Affine registration with custom pipeline
from dipy.align import affine_registration
# Register with rigid transformation only
result, affine_matrix = affine_registration(
moving, static,
pipeline=['center_of_mass', 'translation', 'rigid']
)
print(f"Final affine transformation:\n{affine_matrix}")
# Streamline bundle registration
from dipy.align import streamline_registration
from dipy.data import read_bundles_2_subjects
# Load example streamline bundles
streamlines1, streamlines2 = read_bundles_2_subjects()
# Register bundles
aligned_streamlines, transform_matrix = streamline_registration(
streamlines1, streamlines2, n_points=20
)
print(f"Registered {len(aligned_streamlines)} streamlines")
print(f"Transform matrix shape: {transform_matrix.shape}")
# Resampling between spaces
from dipy.align import resample
# Resample moving image to static image space
resampled_img = resample(moving, static)
print(f"Resampled image type: {type(resampled_img)}")Install with Tessl CLI
npx tessl i tessl/pypi-dipy