今天将给大家分享医学图像读取,包括dicom图像和非dicom图像,图像的存储以及修改图像信息后产生的变化结果,最后再介绍如何将SimpleITK的图像数据与Numpy的数据进行互相转换。
1、读取dicom序列文件
这里采用ImageSeriesReader()来读取dicom序列图像,只需要输入dicom的目录路径就可以读取图像。
# read dicom series image
dicom_input_dir = "E:\Data\other\LIDC_nodul"
print("Reading Dicom directory:", dicom_input_dir)
reader = sitk.ImageSeriesReader()
dicom_names = reader.GetGDCMSeriesFileNames(dicom_input_dir)
reader.SetFileNames(dicom_names)
image = reader.Execute()
2、读取非dicom格式文件
这里采用ReadImage()来去读非dicom格式的图像,只需要输入非dicom格式的文件名就可以读取图像。
# read image
image = sitk.ReadImage("srcdicom.mha")
3、输出图像信息
图像除了像素信息外,还有图像大小,图像spacing信息,图像方向信息,图像原点信息。
# show dicom series image message
size = image.GetSize()
print("Image size:", size)
spacing = image.GetSpacing()
print("Image spacing:", spacing)
direction = image.GetDirection()
print("Image direction:", direction)
origin = image.GetOrigin()
print("Image origin:", origin)
4、写成非dicom格式文件
这里我们采用简单的文件写入函数WriteImage()函数来完成图像写到磁盘,函数只需要输入图像,输出文件名字。
# write dicom image
sitk.WriteImage(image, "srcdicom.mha")
5、修改图像方向信息就会改变图像的方向
这里我们做个信息修改来看一下是如何影像图像的。采用SetDirection()手动来改变相对世界坐标的方向矩阵值,将x和y方向换个位置,其它信息都不改动,输出图像如下所示。可以看到修改direction后图像的发生了旋转。在实际使用时要小心使用,不能随便修改。我们直接使用默认图像的direction方向信息即可,无需额外做处理操作。
# modify dicom image direction
image.SetDirection((0, 1, 0, 1, 0, 0, 0, 0, 1))
sitk.WriteImage(image, "newdirection.mha")
print(" modify dicom image direction")
size = image.GetSize()
print("Image size:", size)
spacing = image.GetSpacing()
print("Image spacing:", spacing)
direction = image.GetDirection()
print("Image direction:", direction)
origin = image.GetOrigin()
print("Image origin:", origin)
6、SimpleITK图像数据转成Numpy矩阵数据
我们用函数GetArrayFromImage()函数,可以将sitk的图像矩阵转换成我们熟悉的numpy格式的多维矩阵,也就跟常规的RGB图像一样的矩阵形式。我们输出矩阵的大小,发现矩阵大小与sitk图像大小不一样,sitk图像大小顺序是x,y,z三个方向的大小,而numpy矩阵的大小顺序是z,y,x三个方向的大小,大家在这个地方一定要注意索引位置。
# sitk image to numpy data
np_array = sitk.GetArrayFromImage(image)
print("np_array size:", np_array.shape)
7、Numpy矩阵数据转成SimpleITK图像数据
我们用函数GetImageFromArray()函数,可以将numpy格式的多维矩阵转换成sitk的图像格式,当然了前面也说到过sitk图像不仅仅有像素信息,还有origin,spacing和direction的信息,所以这里我们需要对该sitk图像对象的这些信息进行显示的赋值处理才可以,通过SetOrigin(),SetSpacing(),SetDirection()来完成相应赋值。最后我们通过前面介绍的图像输出函数将生成的sitk图像保存成文件。
# numpy data to sitk image
sitk_image = sitk.GetImageFromArray(np_array)
sitk_image.SetOrigin(origin)
sitk_image.SetSpacing(spacing)
sitk_image.SetDirection(direction)
如果有任何问题,随时给我留言我会及时回复的。本节所有代码如下所示。
import SimpleITK as sitk
# read dicom series image
dicom_input_dir = "E:\Data\other\LIDC_nodul"
print("Reading Dicom directory:", dicom_input_dir)
reader = sitk.ImageSeriesReader()
dicom_names = reader.GetGDCMSeriesFileNames(dicom_input_dir)
reader.SetFileNames(dicom_names)
image = reader.Execute()
# read image
# image = sitk.ReadImage("srcdicom.mha")
# show dicom series image message
size = image.GetSize()
print("Image size:", size)
spacing = image.GetSpacing()
print("Image spacing:", spacing)
direction = image.GetDirection()
print("Image direction:", direction)
origin = image.GetOrigin()
print("Image origin:", origin)
# write dicom image
sitk.WriteImage(image, "srcdicom.mha")
# modify dicom image direction
image.SetDirection((0, 1, 0, 1, 0, 0, 0, 0, 1))
sitk.WriteImage(image, "newdirection.mha")
print(" modify dicom image direction")
size = image.GetSize()
print("Image size:", size)
spacing = image.GetSpacing()
print("Image spacing:", spacing)
direction = image.GetDirection()
print("Image direction:", direction)
origin = image.GetOrigin()
print("Image origin:", origin)
# sitk image to numpy data
np_array = sitk.GetArrayFromImage(image)
print("np_array size:", np_array.shape)
# numpy data to sitk image
sitk_image = sitk.GetImageFromArray(np_array)
sitk_image.SetOrigin(origin)
sitk_image.SetSpacing(spacing)
sitk_image.SetDirection(direction)
sitk.WriteImage(sitk_image, "sitk_image.mha")