MedImage.jl
The filesystem and choice of metadata is loosly based on BIDS format [1]
This project was created to standardize data handling of 3D and 4D medical imaging. It is currently subject to change and I am open to suggestions that would improve the library in construction.
I’ve included below in categories what needs to be done and some basic ideas on How to approach it. I will post it for consultations with the community and then process to create test cases where Python SimpleItk (or other) methods will be treated as a reference.
- Designing data structure - requirements (need to explicitly specify the most important and the rest will be just in an additional dictionary)
- hold voxel data as a multidimensional array
- keep spatial metadata - origin, orientation, spacing
- type of the image - label/CT/MRI/PET (need to construct enum for this) - frequently will be needed to be supplied manually
- subtype of the image for example if MRI ADC/DWI/T2 etc. (need to construct enum for this)
- type of the voxel data (for example Float32)
- Date of saving
- Acquisition time
- Patient ID if present
- current device - (CPU, GPU)
- Study UID
- Patient UID
- Series UID
- Study Description
- Original file name
- Display data - set of colors for the labels; window value for CT scan - will provide set of defaults based on image type and I will modify MedEye3D for convenient visualizations.
- Clinical data dictionary - age, gender …
- Is contrast administered
- The rest of the metadata loaded from a file to store in a dictionary
- Data loading
- Nifti - start with Nifti.jl
- Dicom - Dicom.jl
- Mha - ?
- Modifying voxel data together with spacing data
- Modifying orientation of all images to single orientation - for example, RAS (we should select some default orientation) - TODO with AxisArrays.jl plus keep track of origin
- Changing spacing to a given spacing - TODO with AxisArrays.jl with Interpolations.jl plus keep track of origin; use nearest neighbor interpolator for the label; and for example b spline for others
- Resampling to another grid - for example, resample PET image to CT image based just on spatial metadata keeping track of changed metadata of the moving image TODO with AxisArrays.jl and Interpolations.jl
- Cropping and dilatating with adjusting of origin offset TODO with AxisArrays.jl, storing also positions of original image in metadata (some artifacts happen on the image edges)
- Adding persistency
- store the data as array in HDF5 and metadata as its attributes
- design efficient loading and saving irrespective of the device the array is on
- add the possibility to save back as nifty and dicom files for exporting
Point 3 is the trickiest one to do as there are a lot of corner cases
to look for https://github.com/haberdashPI/MetaArrays.jl
References
1)https://www.nature.com/articles/sdata201644