前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >医学图像处理教程(二)——医学图像读取,存储和不同对象互相转换

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

作者头像
医学处理分析专家
发布2020-06-29 15:04:09
4.6K2
发布2020-06-29 15:04:09
举报

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

1、读取dicom序列文件

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

代码语言:javascript
复制
# 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格式的文件名就可以读取图像。

代码语言:javascript
复制
# read image
image = sitk.ReadImage("srcdicom.mha")

3、输出图像信息

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

代码语言:javascript
复制
# 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()函数来完成图像写到磁盘,函数只需要输入图像,输出文件名字。

代码语言:javascript
复制
# write dicom image
sitk.WriteImage(image, "srcdicom.mha")

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

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

代码语言:javascript
复制
# 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三个方向的大小,大家在这个地方一定要注意索引位置。

代码语言:javascript
复制
# 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图像保存成文件。

代码语言:javascript
复制
# numpy data to sitk image
sitk_image = sitk.GetImageFromArray(np_array)
sitk_image.SetOrigin(origin)
sitk_image.SetSpacing(spacing)
sitk_image.SetDirection(direction)

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

代码语言:javascript
复制
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")
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 最新医学影像技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档