fetal whole-heart 4d reconstruction using motion-corrected multi-planar real-time MRI
Fetal whole-heart 4D imaging using motion-corrected multi-planar real-time MRI.
Joshua FP van Amerom, David FA Lloyd, Maria Deprez, Anthony N Price, Shaihan J Malik, Kuberan Pushparajah, Milou PM van Poppel, Mary A Rutherford, Reza Razavi, Joseph V Hajnal.
13 Apr 2019. Magnetic Resonance in Medicine. 2019. doi: 10.1002/mrm.27798 (accepted, peer-reviewed+revised)
05 Dec 2018. arXiv: 1812.02249 (preprint)
4drecon - preprocessing and 4D reconstruction scripts
cardsync - cardiac synchronisation
eval - summarise and evaluate results
irtk_cardiac4d - 4D reconstruction submodule linked to github.com/jfpva/irtk_cardiac4d, built on the Image Registration Toolkit (IRTK) v2.0.
ktrecon - k-t sense reconstruction submodule linked to github.com/jfpva/ktrecon
Build instructions for irtk can be found at sites.google.com/site/mariakuklisovamurgasova/software.
ReconFrame - software platform providing the tools and the functionality to develop and execute a complete image reconstruction of Philips MR data (gyrotools.com/gt/index.php/products/reconframe)
Framework for 4D cine reconstruction, consists of:
- acquisition and reconstruction of multi-planar dynamic2DMRI;
- an initial motion correction stage to achieve rough spatial alignment of the fetal heart using temporal mean (i.e., static) images for stack-stack registration followed by slice-volume registration interleaved with static volume (3D) reconstruction;
- cardiac synchronisation, including heart rate estimation and slice-slice cardiac cycle alignment; and
- further motion-correction using dynamic image frames interleaved with 4D reconstruction; and
- a final 4D cine reconstruction, including outlier rejection.
User-specified ROIs, and identification of a target stack for stack-stack registration are the only manual preparations required for reconstruction.
Setup
create working directories,
e.g., in shell:
RECONDIR=~/path/to/recon/directory
mkdir $RECONDIR
mkdir $RECONDIR/data
mkdir $RECONDIR/ktrecon
mkdir $RECONDIR/mask
mkdir $RECONDIR/cardsync
- MRI
- acquire 2D multi-planar real-time MRI data
- reconstruct images using
ktrecon
,
e.g., for each stack, in Matlab:reconDirPath = '~/path/to/recon/directory'; seriesNo = 0; rawDataFilePath = '~/path/to/rawdata.lab'; senseRefFilePath = '~/path/to/senserefscan.lab'; coilSurveyFilePath = '~/path/to/coilsurveyscan.lab'; outputDirPath = fullfile( reconDirPath, 'ktrecon' ); outputStr = sprintf( 's%02i', seriesNo ); reconOpts = { 'GeometryCorrection', 'Yes' }; mrecon_kt( rawDataFilePath, ... 'senseref', senseRefFilePath, ... 'coilsurvey', coilSurveyFilePath, ... 'outputdir', outputDirPath, ... 'outputname', outputStr, ... 'patchversion', patchVersion,... 'reconoptionpairs', reconOpts )
- further processsing
- copy/move all magnitude-valued DC (s*_dc_ab.nii.gz) and real-time (s*_rlt_ab.nii.gz) files from 'ktrecon' directory to 'data' directory
e.g., in shell:cp ktrecon/s*_dc_ab.nii.gz data; cp ktrecon/s*_rlt_ab.nii.gz data;
- manually draw fetal heart masks for each
sXX_dc_ab.nii.gz
file (e.g., using the Medical Imaging ToolKit (MITK) Workbench)- draw ROI containing fetal heart and great vessels for each slice
- save segmentation as
sXX_mask_heart.nii.gz
segmentation in 'mask' directory
- run
preproc
in Matlab,reconDir = '~/path/to/recon/directory'; S = preproc( reconDir ); save( fullfile( reconDir, 'data', 'results.mat' ), 'S', '-v7.3' );
- optionally, manually specify
- target stack by changing value in 'data/tgt_stack_no.txt' (stacks are index 1,2,...)
- excluded stacks/slices/frames by specifying in 'data/force_exclude_*.txt' (stacks/slices/frames are zero-indexed)
- copy/move all magnitude-valued DC (s*_dc_ab.nii.gz) and real-time (s*_rlt_ab.nii.gz) files from 'ktrecon' directory to 'data' directory
- Motion-Correction (static)
- create 3D mask of fetal chest
- recon reference volume,
e.g., in shell:
RECONDIR=~/path/to/recon/directory ./recon_ref_vol.bash $RECONDIR ref_vol
- draw fetal chest ROI using 'ref_vol.nii.gz' as a reference (e.g., using MITK)
- save segmentation to 'mask' directory as 'mask_chest.nii.gz'
- note: the orientation of all later 3D/4D reconstructions is determined by this mask file; the orientation can be changed by applying a transformation to 'mask_chest.nii.gz' prior to further reconstructions
- recon reference volume,
- static (slice-wise) motion-correction,
e.g., in shell:RECONDIR=~/path/to/recon/directory˜ ./recon_dc_vol.bash $RECONDIR dc_vol
- create 3D mask of fetal chest
- Cardiac Synchronisation
- heart-rate estimation
- run
cardsync_intraslice
, in Matlab:reconDir = '~/path/to/recon/directory'; dataDir = fullfile( reconDir, 'data' ); cardsyncDir = fullfile( reconDir, 'cardsync' ); M = matfile( fullfile( dataDir, 'results.mat' ) ); S = cardsync_intraslice( M.S, 'resultsDir', cardsyncDir, 'verbose', true );
- run
- slice-slice synchronisation
- recon cine volume for each slice,
e.g., in shell:RECONDIR=~/path/to/recon/directory ./recon_slice_cine.bash $RECONDIR
- optionally, specify target slice by creating file 'data/tgt_slice_no.txt' containing target slice number (indexed starting at 1)
- run
cardsync_interslice
, in Matlab:% setup reconDir = '~/path/to/recon/directory'; dataDir = fullfile( reconDir, 'data' ); cardsyncDir = fullfile( reconDir, 'cardsync' ); cineDir = fullfile( reconDir, 'slice_cine_vol' ); M = matfile( fullfile( cardsyncDir, 'results_cardsync_intraslice.mat' ) ); % target slice tgtLoc = NaN; tgtLocFile = fullfile( dataDir, 'tgt_slice_no.txt' ); if exist( tgtLocFile , 'file' ) fid = fopen( tgtLocFile, 'r' ); tgtLoc = fscanf( fid, '%f' ); fclose( fid ); end % excluded slices excludeSlice = []; excludeSliceFile = fullfile( dataDir, 'force_exclude_slice.txt' ); if exist( excludeSliceFile , 'file' ) fid = fopen( excludeSliceFile, 'r' ); excludeSlice = fscanf( fid, '%f' ) + 1; % NOTE: slice locations in input file are zero-indexed fclose( fid ); end % slice-slice cardiac synchronisation S = cardsync_interslice( M.S, 'recondir', cineDir, 'resultsdir', cardsyncDir, 'tgtloc', tgtLoc, 'excludeloc', excludeSlice );
- recon cine volume for each slice,
- heart-rate estimation
- Motion-Correction (dynamic)
- performed interleaved with 4D Reconstruction
- 4D Volumetric Reconstruction
- recon 4D (cine) volume,
e.g., in shell:
RECONDIR=~/path/to/recon/directory ./recon_cine_vol.bash $RECONDIR cine_vol
- recon 4D (cine) volume,
Summarise
e.g., in Matlab:
S = summarise_recon( '~/path/to/recon/directory/cine_vol', '~/path/to/recon/directory/cardsync', 'verbose', true );
I = plot_info( '~/path/to/recon/directory/cine_vol/info.tsv');