Advertisement

医学图像处理_医学图像处理教程(二)——医学图像读取,存储和不同对象互相转换...

阅读量:

今天将给大家分享医学图像读取,包括dicom图像和非dicom图像,图像的存储以及修改图像信息后产生的变化结果,最后再介绍如何将SimpleITK的图像数据与Numpy的数据进行互相转换。

1、读取dicom序列文件

这里采用ImageSeriesReader()来读取dicom序列图像,只需要输入dicom的目录路径就可以读取图像。

复制代码
    # read dicom series imagedicom_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 imageimage = sitk.ReadImage("srcdicom.mha")

3、输出图像信息

图像除了像素信息外,还有图像大小,图像spacing信息,图像方向信息,图像原点信息。

复制代码
    # show dicom series image messagesize = 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)

3d0b93b73a0d19f21524b2f5de009fe9.png 4、写成非dicom格式文件

这里我们采用简单的文件写入函数WriteImage()函数来完成图像写到磁盘,函数只需要输入图像,输出文件名字。

复制代码
    # write dicom imagesitk.WriteImage(image, "srcdicom.mha")

5、修改图像方向信息就会改变图像的方向

这里我们做个信息修改来看一下是如何影像图像的。采用SetDirection()手动来改变相对世界坐标的方向矩阵值,将x和y方向换个位置,其它信息都不改动,输出图像如下所示。可以看到修改direction后图像的发生了旋转。在实际使用时要小心使用,不能随便修改。我们直接使用默认图像的direction方向信息即可,无需额外做处理操作。

复制代码
    # modify dicom image directionimage.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)

f70f6a126516f34e022ebbfe97337a31.png 6、SimpleITK图像数据转成Numpy矩阵数据

我们用函数GetArrayFromImage()函数,可以将sitk的图像矩阵转换成我们熟悉的numpy格式的多维矩阵,也就跟常规的RGB图像一样的矩阵形式。我们输出矩阵的大小,发现矩阵大小与sitk图像大小不一样,sitk图像大小顺序是x,y,z三个方向的大小,而numpy矩阵的大小顺序是z,y,x三个方向的大小,大家在这个地方一定要注意索引位置。

复制代码
    # sitk image to numpy datanp_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 imagesitk_image = sitk.GetImageFromArray(np_array)sitk_image.SetOrigin(origin)sitk_image.SetSpacing(spacing)sitk_image.SetDirection(direction)

aa0547d00346a59f9e742e63c5cb41fa.png 如果有任何问题,随时给我留言我会及时回复的。本节所有代码如下所示。

复制代码
    import SimpleITK as sitk# read dicom series imagedicom_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 messagesize = 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 imagesitk.WriteImage(image, "srcdicom.mha")# modify dicom image directionimage.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 datanp_array = sitk.GetArrayFromImage(image)print("np_array size:", np_array.shape)# numpy data to sitk imagesitk_image = sitk.GetImageFromArray(np_array)sitk_image.SetOrigin(origin)sitk_image.SetSpacing(spacing)sitk_image.SetDirection(direction)sitk.WriteImage(sitk_image, "sitk_image.mha")

给朋友打个广告,感兴趣的可以扫码关注一下。
c462d04e893a18437fe46476eeb716f5.png

全部评论 (0)

还没有任何评论哟~