27

Can anyone please tell me the way I can read a dataset containing .mhd/.raw files in python?

Sandipan Dey
  • 21,482
  • 2
  • 51
  • 63
Avijit Dasgupta
  • 2,055
  • 3
  • 22
  • 36

4 Answers4

24

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 sitk
import 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
savfod
  • 549
  • 6
  • 9
  • 1
    BTW, [this](http://stackoverflow.com/questions/37989196/how-do-i-open-mhd-file-corresponding-to-a-raw-file-in-blender-3d-tool) question is same. Can someone merge them? – savfod Mar 04 '17 at 10:37
  • 1
    no but you can mark as duplicate if you think they are duplicates – Monica Heddneck Nov 07 '18 at 22:13
  • Just a note for anyone using this solution: The numpy array returned by `sitk.GetArrayFromImage(itkimage)` has its coordinates in backwards order, flipping x and z. You would index it like this: `ct_scan[z,y,x]`. Very important! – Jamie Aug 23 '23 at 21:10
12

Using skimage may be even easier after you installed SimpleITK

import skimage.io as io
img = io.imread('file.mhd', plugin='simpleitk')

This will give you a numpy array with z,y,x sorting.

pietz
  • 2,093
  • 1
  • 21
  • 23
6

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 sitk
import matplotlib.pylab as plt
ct_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()

enter image description here

Here is the same CT-scan .mhd file that is read with SimpleITK and animated: enter image description here

Sandipan Dey
  • 21,482
  • 2
  • 51
  • 63
1

You can try to use MedPy or this mhd_utils script

johngull
  • 819
  • 6
  • 22