""" ============================================== Reconstruct with Constant Solid Angle (Q-Ball) ============================================== We show how to apply a Constant Solid Angle ODF (Q-Ball) model from Aganj et al. [Aganj2010]_ to your datasets. First import the necessary modules: """ import numpy as np from dipy.core.gradients import gradient_table from dipy.data import get_fnames, default_sphere from dipy.io.gradients import read_bvals_bvecs from dipy.io.image import load_nifti from dipy.reconst.shm import CsaOdfModel from dipy.direction import peaks_from_model from dipy.segment.mask import median_otsu ############################################################################### # Download and read the data for this tutorial and load the raw diffusion data # and the affine. hardi_fname, hardi_bval_fname, hardi_bvec_fname = get_fnames('stanford_hardi') data, affine = load_nifti(hardi_fname) bvals, bvecs = read_bvals_bvecs(hardi_bval_fname, hardi_bvec_fname) gtab = gradient_table(bvals, bvecs) ############################################################################### # img contains a nibabel Nifti1Image object (data) and gtab contains a # GradientTable object (gradient information e.g. b-values). For example to # read the b-values it is possible to write print(gtab.bvals). print('data.shape (%d, %d, %d, %d)' % data.shape) ############################################################################### # data.shape ``(81, 106, 76, 160)`` # # Remove most of the background using DIPY's mask module. maskdata, mask = median_otsu(data, vol_idx=range(10, 50), median_radius=3, numpass=1, autocrop=True, dilate=2) ############################################################################### # We instantiate our CSA model with spherical harmonic order of 4 csamodel = CsaOdfModel(gtab, 4) ############################################################################### # `Peaks_from_model` is used to calculate properties of the ODFs (Orientation # Distribution Function) and return for # example the peaks and their indices, or GFA which is similar to FA but for ODF # based models. This function mainly needs a reconstruction model, the data and a # sphere as input. The sphere is an object that represents the spherical discrete # grid where the ODF values will be evaluated. csapeaks = peaks_from_model(model=csamodel, data=maskdata, sphere=default_sphere, relative_peak_threshold=.5, min_separation_angle=25, mask=mask, return_odf=False, normalize_peaks=True) GFA = csapeaks.gfa print('GFA.shape (%d, %d, %d)' % GFA.shape) ############################################################################### # GFA.shape ``(81, 106, 76)`` # # Apart from GFA, csapeaks also has the attributes peak_values, peak_indices and # ODF. peak_values shows the maxima values of the ODF and peak_indices gives us # their position on the discrete sphere that was used to do the reconstruction of # the ODF. In order to obtain the full ODF, return_odf should be True. Before # enabling this option, make sure that you have enough memory. # # Let's visualize the ODFs of a small rectangular area in an axial slice of the # splenium of the corpus callosum (CC). data_small = maskdata[13:43, 44:74, 28:29] from dipy.viz import window, actor # Enables/disables interactive visualization interactive = False scene = window.Scene() csaodfs = csamodel.fit(data_small).odf(default_sphere) ############################################################################### # It is common with CSA ODFs to produce negative values, we can remove those # using ``np.clip`` csaodfs = np.clip(csaodfs, 0, np.max(csaodfs, -1)[..., None]) csa_odfs_actor = actor.odf_slicer(csaodfs, sphere=default_sphere, colormap='plasma', scale=0.4) csa_odfs_actor.display(z=0) scene.add(csa_odfs_actor) print('Saving illustration as csa_odfs.png') window.record(scene, n_frames=1, out_path='csa_odfs.png', size=(600, 600)) if interactive: window.show(scene) ############################################################################### # .. figure:: csa_odfs.png # :align: center # # Constant Solid Angle ODFs. # # .. include:: ../links_names.inc # # References # ---------- # # .. [Aganj2010] Aganj I, Lenglet C, Sapiro G, Yacoub E, Ugurbil K, Harel N. # "Reconstruction of the orientation distribution function in single- and # multiple-shell q-ball imaging within constant solid angle", Magnetic # Resonance in Medicine. 2010 Aug;64(2):554-66. doi: 10.1002/mrm.22365 # #