将医学图像表示为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_toolsrepos的一部分逐渐适应了我的需要,在一个新的作业中,我将它移植到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")

images用一个表示文件位置的字符串设置,其中文件扩展名表示文件类型。如果找不到已知的扩展名,则假定您提供的是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模块。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JavaFX触控事件未触发Ubuntu 20.04触控笔记本电脑   java如何在AWT中关闭窗口?   java Dagger 2:注入具有构造函数参数的成员   创建对象的Java调用类   对象我想在A.java中添加两个数字,并在B.java中打印结果(如何?)   java如何使用AWS SDK for Android从数字海洋空间下载图像?   java Facebook sdk 4.0.1无法使用Android studio获取某些字段   4分钟后web应用程序(Angular 8和Rest API)中的java自动会话超时   在Eclipse for Java EE developers edition中禁用HTML警告   java按字母顺序排列字符串我错过了什么明显的东西吗?   java在Jshell中println和printf有什么不同