Reading *.mhd/*.raw format in python
The easiest way is to use SimpleITK (MedPy uses ITK for .mhd/.raw files too). Command
pip install SimpleITK
works for many python versions. For reading .mhd/.raw you can use this code from kaggle
import SimpleITK as sitkimport numpy as np'''This funciton reads a '.mhd' file using SimpleITK and return the image array, origin and spacing of the image.'''def load_itk(filename): # Reads the image using SimpleITK itkimage = sitk.ReadImage(filename) # Convert the image to a numpy array first and then shuffle the dimensions to get axis in the order z,y,x ct_scan = sitk.GetArrayFromImage(itkimage) # Read the origin of the ct_scan, will be used to convert the coordinates from world to voxel and vice versa. origin = np.array(list(reversed(itkimage.GetOrigin()))) # Read the spacing along each dimension spacing = np.array(list(reversed(itkimage.GetSpacing()))) return ct_scan, origin, spacing
Using skimage may be even easier after you installed SimpleITK
import skimage.io as ioimg = io.imread('file.mhd', plugin='simpleitk')
This will give you a numpy array with z,y,x sorting.
Adding on the above posts, you can start with a CT-Scan .mhd file downloaded from the here and display / save 29 images with the following code (assuming that you have both the header and the raw files downloaded in the current directory):
import SimpleITK as sitkimport matplotlib.pylab as pltct_scans = sitk.GetArrayFromImage(sitk.ReadImage("training_001_ct.mhd", sitk.sitkFloat32))plt.figure(figsize=(20,16))plt.gray()plt.subplots_adjust(0,0,1,1,0.01,0.01)for i in range(ct_scans.shape[0]): plt.subplot(5,6,i+1), plt.imshow(ct_scans[i]), plt.axis('off') # use plt.savefig(...) here if you want to save the images as .jpg, e.g.,plt.show()
Here is the same CT-scan .mhd file that is read with SimpleITK
and animated: