Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading *.mhd/*.raw format in python

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

like image 841
Avijit Dasgupta Avatar asked May 18 '16 04:05

Avijit Dasgupta


People also ask

What is MHD format?

MHD filename suffix is mostly used for Fallout 3 files. Bethesda Softworks LLC defined the Fallout 3 format standard. MHD file format is compatible with software that can be installed on Windows system platform. MHD file belongs to the Game Files category just like 1509 other filename extensions listed in our database.


3 Answers

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 
like image 160
savfod Avatar answered Sep 20 '22 11:09

savfod


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.

like image 26
pietz Avatar answered Sep 17 '22 11:09

pietz


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

like image 22
Sandipan Dey Avatar answered Sep 17 '22 11:09

Sandipan Dey