将医学图像表示为numpy数组。支持:.mhd(r/w)、.xdr(r/w)、dicom(r)。纯蟒蛇。
medimage的Python项目详细描述
介质图像
此库支持r/w元图像(mhd,itk)和r/w avsfield(.xdr)图像,包括nki压缩图像(只读,用于处理elekta图像)。image
类是类型化numpy数组对象(成员imdata
)的薄包装,这样您就可以轻松地处理这些数据格式的图像。切片,投影,数学运算,掩蔽,像这样的东西用numpy很容易,所以你可以很容易地扩展到你需要的东西。
包括一些基本的数学运算、一些掩蔽函数以及裁剪和重采样函数。特别感兴趣的可能是dvh分析函数和距离一致性计算(完全基于pymedphys中的gamma
组件)。不过,这一计算相当缓慢。对于NKI decompression我提供64位linux和windows库,如果您需要对其他平台的支持,可以在image/nki_decomp
中自己编译该函数。此组件由其自己的许可证管理。
动机
这个项目是在我分析大量Gate图像输出时开始的。ITK的Python绑定(SimeLeTk)不是可压缩的或易于使用的,并且我发现使用图像数据作为NUMPY数组远比使用ITK作为自定义C++程序中的库更快,这是我需要编译和重新编译的。matplotlib毕竟只是python。
我想在numpy
周围有一个薄而纯的python包装器,它允许我读入和写出图像数据。幸运的是,(未压缩的)元图像磁盘格式非常简单,甚至我都能理解它,它的性能甚至令人吃惊。这个image
类作为我的phd_tools
和更高版本的postdoc_tools
repos的一部分逐渐适应了我的需要,在一个新的作业中,我将它移植到python 3并为avsfields和dicom映像添加了文件支持。其思想是,您可以获取image
目录,将其放入任何项目中,并能够将医学图像作为numpy数组使用。它现在是我分析的一个核心组成部分,也许对你也有用。
安装
你现在可以使用pip了!
$ pip(3) install medimage (--user)
或者克隆/下载此repo并使用以下命令手动安装:
$ python(3) setup.py install (--user)
目前,pymedphys
组件没有自动安装,这是使用compute_gamma
方法时所必需的。这是因为它是一个相当大的软件包,而且处于不断发展之中。
用法
安装后,您应该能够打开并保存这样的图像:
from medimage import image
myfirstimage = image("somefile.xdr")
myfirstimage.saveas("somefile.mhd")
image
s用一个表示文件位置的字符串设置,其中文件扩展名表示文件类型。如果找不到已知的扩展名,则假定您提供的是dicom映像或dicom目录(映像)。
或者,您可以创建一个新的调零图像,由30×40×50个体素组成,每个维度间隔2毫米,以零为中心,如下所示:
from medimage import image
myblankimage = image(DimSize=[30,40,50],ElementSpacing=[2,2,2],Offset=[0,0,0])
myblackimage.saveas("empty.mhd")
一些DVH参数
假设你有一个剂量计算,你想要一些dvh指标(比如,dmax,d2,d50,d98,dmean)。假设您想要ptv区域中的dvh度量,并且您有一个ptv作为掩码图像。medimage
怎么能为你这么做?
from medimage import image
import argparse
from os import path
parser = argparse.ArgumentParser(description='Supply an image and a mask or percentage for isodose contour in which to compute the DVH.')
parser.add_argument('inputimage')
parser.add_argument('--maskimage',default=None)
parser.add_argument('--maskregion',default=None,type=float)
opt = parser.parse_args()
im = image.image(path.abspath(opt.inputimage))
maskim = None
if opt.maskregion == None and path.isfile(path.abspath(opt.maskimage)):
print('Using',opt.maskimage,'as region for DVH analysis.')
maskim = image.image(path.abspath(opt.maskimage))
elif opt.maskregion != None:
assert 0 < opt.maskregion < 100
print('Using isodose contour at',opt.maskregion,'percent of maximum dose as region for DVH analysis.')
maskim = im.copy()
maskim.tomask_atthreshold((opt.maskregion/100.)*maskim.max())
else:
print('No mask or maskregion specified; using whole volume for DVH analysis.')
if maskim != None:
im.applymask(maskim)
# note: array is sorted in reverse for DVHs, i.e. compute 100-n%
D2,D50,D98 = im.percentiles([98,50,2])
print("Dmax,D2,D50,D98,Dmean")
print(im.imdata.max(),D2,D50,D98,im.mean())
依赖关系
- 努比
- Pydicom
- 可选:pymedphys
变更日志
- 2019-08-28:v1.0.0:将
image
类分离为自己的medimage
模块。