基于PyRadiomics的医疗影像纹理获取原型系统集成
2020-07-26董建民刘建新
董建民 刘建新
摘 要:针对计算机辅助诊断中医学影像纹理计算相对复杂、商业分析软件功能相对固定和成本较高等问题,以目前主流的Python语言为开发工具,将其对应的PyRadiomics模块、SimpleITK模块与Pydicom模块相结合,给出了符合Dicom 3.0格式的医疗影像数据纹理分析软件设计流程,开发了纹理计算过程和数据可视化原型系统。系统集成为影像医师诊断提供了一种低成本、交互友好的纹理特征数据获取与分析手段,为医学影像中的人工智能、深度学习应用打下了基础。
关键词:PyRadiomics;医疗影像;纹理获取
DOI:10. 11907/rjdk. 201074 开放科学(资源服务)标识码(OSID):
中图分类号:TP317.4 文献标识码:A 文章编号:1672-7800(2020)007-0223-04
Integration of Medical Image Texture Acquisition Prototype System
Based on PyRadiomics
DONG Jian-min,LIU Jian-xin
(School of Information Engineering,Xizang Minzu University, Xianyang 712082,China)
Abstract:In order to solve the problems of relatively complex texture calculation, relatively fixed function and high cost of commercial analysis software in computer-aided diagnosis through medical image,after the design flow of texture analysis of medical image data been given, a prototype system of texture calculation is integrated by Python with its corresponding pyradiomics module, simpleITK module and pydicom module. The system could process all DICOM (digital imaging and communications in medicine) 3.0 format files of medicine images and texture calculation and visualization model are developed and a low-cost, interactive and friendly method of texture feature data display and analysis for imaging doctors diagnosis is provided. It lays a solid foundation for the fields of artificial intelligence and deep learning based on medical image.
Key Words:PyRadiomics;medical imaging;texture acquisition
0 引言
随着医疗设备数字化的不断深入,从数据管理技术上看,以影像归档和通信系统(Picture Archiving and Communication Systems,PACS)为依托,将计算机断层(Computed Tomography,CT)、核磁共振(Magnetic Resonance Imaging,MRI)、超声(Ultrasound,US)成像等各种医疗影像设备形成以Dicom(Digital Imaging and Communications in Medicine) 3.0为标准的医疗影像数据标准,目前已经基本实现了统一的数据交换和管理模式[1]。从已有医疗影像采集设备看,图像质量从空间上越来越精细,采集所需时间越来越短,图像重建速度也越来越快,并且整个过程对被检查对象几乎没有任何损害,这为医疗影像应用从传统个案诊断走向海量数据分析打下了坚实的物质基础,正逐渐为当前医疗人工智能分析、特征深度学习等研究提供应用前提和可能[2-3]。从临床诊断角度看,医疗影像纹理分析是影响诊断结论的重要方面,根据已有的纹理信息诊断应用可知,对医疗影像中感兴趣区域(Region of Interest,ROI )的纹理分析包括如下方面:一阶距、形状特征、以灰度共生矩阵为基础的度量、以灰度游程矩阵为基础的度量,以及灰度区域大小矩阵等,共包含100多个特征数值[4-9],获取这些数值对于影像分析意义重大。Python语言程序由于具有开源的特点以及程序设计入门相对容易等优点,目前已被广泛应用于各特定的图像处理领域[10-16]。PyRadiomics[17]是一个开源的Python[18]软件包,用于从医学成像中提取放射组学特征。其模块已经集成了目前所有的影像纹理分析算法,可便捷地为临床影像诊断医师提供各种纹理数据。同时,鉴于目前医疗均采用Dicom3.0标准,因此需要对此类格式的影像数据,利用特定专业的开源模块,对数据文件进行解码和數据获取。
然而,从临床医疗影像纹理分析应用看,已有的纹理分析理论涉及较为复杂的数值计算与统计学理论,不利于影像诊断医师集中精力进行诊断判定,同时也不利于大量医疗影像数据的自动处理和分析。目前,商业医疗影像分析软件由于涉及诸多专利和数据授权等问题,其高昂的商业成本不仅限制了其进一步推广和应用,而且阻碍了非医科等其他工程技术人员与一线医疗影像诊断医师的合作。这样,要实现医疗影像数据纹理分析的大范围应用,首先必须避免医疗影像诊断师陷入复杂纹理分析的数学理论和数值计算,其次采用一切手段降低数据处理难度和成本,最终形成功能相对齐全、界面友好、交互简单的纹理数据获取、显示与数据导出系统。本文正是针对上述要求,将运行于Windows 7系统上的Python3.6作为开发工具,以符合Dicom3.0标准的医疗影像数据作为数据输入,利用与之对应的SimpleITK模块快速处理数据,通过Pydicom模块解码Dicom文件数据,用于人工或者系统自动标定影像数据的ROI,然后将前两者数据处理结果作为数据分析基础,结合PyRadiomics强大的纹理数据获取功能,得到对应的纹理数据后,利用可视化方式加以显示。同时,为促进纹理数据的进一步应用,本文也设计了纹理数据的导出功能,从而为纹理数据的科学研究与分析奠定基础。
1 系统开发流程
在系统开发之前,首先需要正确安装开发工具Python 语言解释器以及对应版本的PyRadiomics、Pydicom、SimpleITK、Numpy等主要模块,并经过测试确保各模块可正常使用。参照如图1所示流程设计各模块功能。
2 纹理计算功能实现
2.1 数据准备
由于Pyradiomics模块在构架时,其接收的影像分析数据和标记数据输入为nrrd格式,而这种格式的数据需要对已有的Dicom3.0数据进行提取和标记后生成,因此首先需要设计并生成待处理数据,这由Python对应的SimpleITK完成。需要注意的是,符合Dicom3.0标准的医疗影像数据,在利用探测到的信号重建图像时,采用不同的序列实例,而这些实例采用不同的重建参数而得到的纹理数据必然不同。因此在开发软件时,必须利用Dicom文件的头信息分别依次解析,按照不同实例序列依次处理。因此,数据準备模块分为待分析影像的nrrd格式数据生成和标记数据生成,标记数据最简单的方式就是利用掩模将图像的ROI标识为1、其它标识为0。待分析数据关键代码如下:设file_path为待分析的符合Dicom3.0的数据路径,sitk为simpleITK模块的简写,DicomNrrdData是初始为空的列表,代码结束后保存不同序列nrrd格式的待分析数据。
series_IDs = sitk.ImageSeriesReader.GetGDCMSeriesIDs(file_path)#获取不同的序列标识
for ss in series_IDs:
series_file_names= sitk.ImageSeriesReader.GetGDCMSeriesFileNames(file_path,ss)
#上面语句获取属于不同序列的文件列表
series_reader = sitk.ImageSeriesReader()#实例化一个读取序列
series_reader.SetFileNames(series_file_names)#设置读取文件组名
D = series_reader.Execute()#读取该序列文件得到nrrd格式数据
DicomNrrdData.append(D)#将不同的序列的nrrd格式数据保存于列表
标记数据通常需要通过人工交互完成图像掩模而确定。取图像中间部分作为感兴趣区域,这里取图像128~196行、128~196列的矩形区域作为测试,分别用变量hh0、hh1、ww0、ww1代替,即hh0=128、hh1=196、ww0=128、ww1=196。为了更好地利用已有代码,只需将每个序列的图像数据重新修改后保存,再利用上述代码即可。设pydicom模块简写为dcm,变量kk为记录标识不同的Dicom文件,初始值为0,series_file_names为不同序列的文件名,OutPath为标记数据要保存的路径。sitk在读取数据时,自动将读取到的数据利用式(1)集成到nrrd格式的数据中。
其中,S为数据斜率,一般取值为1,R为对应的截距,通常为负值,在诸多情况下R的取值为-1024,d为文件直接读取到的数值。因此,为了保证最终标记数据仍为1,在修改对应的标记Dicom文件时,数据项不能直接赋值为1,也即要使最终的v=1,修改数据可以按照式(2)确定。
这里,v=1,S=1,因此修改的数据项d=1-R。关键代码如下:
for FileName in series_file_names:
dcminfo_data=dcm.dcmread(FileName)#读取dicom图像数据结构
R= dcminfo_data.RescaleIntercept #得到图像数据的截距
Rows=dcminfo_data.Rows #获取图像的行
Columns=dcminfo_data.Columns #获取图像的列
newArray = np.zeros([Rows, Columns]) #创建新的元素全为0的标记矩阵
newArray[hh0:hh1,ww0:ww1]=1-R #将图像对应的掩模赋值为截距相反数加1
NewDcmdata16 = np.int16(newArray) #将数据转化为16位整数
dcminfo_data.PixelData=NewDcmdata16.tobytes() #将数据转化为对应的字节数
Path=OutPath+ks+‘.dcm #增加了标识的新文件的保存路径
dcminfo_data.save_as(Path) #保存文件
kk=kk+1 #标识符增加1
标记图像处理完成后,将保存路径利用关键代码获取对应nrrd格式的标记文件。
2.2 纹理特征获取计算
实现PyRadiomics纹理分析的数据准备后,通过在Python开发平台下使用PyRadiomics模块,从而完成系统纹理特征数据获取。Python开发平台下使用PyRadiomics模块时,除了要将待分析数据与标记数据对应的nrrd格式数据作为参数输入外,还需要利用一个yaml文件作为纹理获取计算参数,内容主要包括输入数据位数、标记数据信息以及需要计算的纹理数据类别等。该文件可以用普通文本编辑器打开进行设置,具体使用可以参考PyRadiomics模块的使用说明,最终纹理数据由PyRadiomics对应的特征提取函数的返回值得到。设Pa_Path为对应的yaml参数文件所在路径,其关键代码如下:
import radiomics #导入radiomics模块
import radiomics.featureextractor as F #导入纹理提取模块,并简写为F
ext = F.RadiomicsFeatureExtractor(Pa_Path) #设置纹理提取参数
r= ext.executeData(D,DL)#将带分析数据D与对应的标记数据DL传入到纹理函数
实际上,原来模块的execute()函数是利用sitk读取对应的nrrd数据和标记数据,效率偏低。在纹理分析函数ext.execute()基础上,将其中调用自身的成员函数读取数据部分直接更换为输入数据即可完成,最后r向量保存的是纹理数据的字典类型数据。可利用如下代码分别输出形状、一阶距,以及由灰度游程矩阵、灰度区域大小矩阵、灰度共生矩阵、灰度差距共生矩阵所导出的纹理数据。
for key, value in r.items():
if key.find(‘shape)>=0:
Shapef.append(value)
if key.find(‘firstorder)>=0:
Firstorder.append(value)
if key.find(‘glrlm)>=0:
Glrlm.append(value)
if key.find(‘glszm)>=0:
Glszm.append(value)
if key.find(‘glcm)>=0:
Glcm.append(value)
if key.find(‘gldm)>=0:
Gldm.append(value)
2.3 特征數据可视化
获取到的医学影像纹理数据通常具有至少3个以上数值,要在电脑上将其可视化,需要采用高维数据显示方法[19]。本文系统采用常见的平行坐标方法进行数据可视化,系统输入测试一套数据(含25张CT图像)后,纹理数据可视化结果如图2所示。系统输入32个不同序列影像数据后得到的纹理数据可视化结果如图3所示,该数据含有Dicom 3.0的5 108张影像。
2.4 纹理特征数据导出
成功获取医学影像纹理数据后,为保证数据后续使用,系统设计了数据导出模块,导出为用逗号隔开的数据文件,这里使用csv格式的导出数据。设TextureFeatureCsvFileName为导出纹理数据文件路径,SeriesTexture为保存各图像序列的纹理数据列表,导入Python对应的读写csv模块后,其关键代码如下:
csvFileSave=open(TextureFeatureCsvFileName,“a+”, newline=‘ )#已追加写方式打开文件
writer = csv.writer(csvFileSave)
for TextureIndex in range(len(SeriesTexture)):#对所有列表数据进行处理
OneLineDataList=[]
ImageTexture=SeriesTexture[TextureIndex] #获取一个序列的纹理数据
for data in ImageTexture:
OneLineDataList.append(data) #将纹理数据利用列表合并为一行
writer.writerow(OneLineDataList) #写入csv一行数据
csvFileSave.close() #数据写入完成后关闭文件
3 结语
本文利用Python及对应的开源模块,开发了一个医疗影像纹理数据计算软件原型系统平台,为诊断医师进行医疗影像纹理数据获取提供了一个低成本的简易软件,同时可为其它领域的特征数据获取、数据挖掘,以及影像辅助诊断中的人工智能、深度学习应用等研究提供借鉴。系统中对医疗影像ROI的选取仅仅采用矩形区域的简单方法,以此进行系统功能验证,但在医疗诊断或者其它应用领域,ROI的选取方式一般丰富多样,包括手动绘制多边形、圆形区域、分割线等,而对于这些本文系统均未设计对应的实现模块,后续研究中需进一步完善。
参考文献:
[1] PECK D. Digital imaging and communications in medicine: a practical introduction and survival guide[M]. New York: Springer,2008.
[2] 张巧丽,赵地,迟学斌. 基于深度学习的医学影像诊断综述[J]. 计算机科学,2017,44(S2):1-7.
[3] 张永刚,陈军. 基于模型法的医学影像图像纹理分析研究[J]. 工业仪表与自动化装置,2018(3):101-103,106.
[4] 高岩. 基于CT图像的肾脏肿瘤纹理特征提取[J]. 中国数字医学,2019,14(4):66-68.
[5] 马书新. 乳腺影像案例多模检索技术探究[J]. 世界最新医学信息文摘,2018,18(46):171-172.
[6] 高静雅,张荣国,赵健,等. 融合纹理特征与形状特征的病灶CT图像识别[J]. 太原科技大学学报,2018,39(3):165-170.
[7] 张剑华,盖铖,陈胜勇. 基于目标形状特征和纹理特征的迭代配准方法在颈动脉血管中的应用[J]. 浙江工业大学学报,2018,46(1):33-37.
[8] 李亮,尹小童,李梦烁,等. 基于多特征融合的甲状腺结节良恶性识别[J]. 软件导刊,2017,16(12):137-140.
[9] 王昕,李亮,尹小童,等. 甲状腺结节超声图像多特征融合及识别[J]. 吉林大学学报(信息科学版),2017,35(6):650-655.
[10] 魏杰,曹旭阳,陈后金,等. 乳腺X线图像肿块分类方法研究[J]. 北京交通大学学报,2017,41(5):73-78
[11] INATI S J,NAEGELE J D,ZWART N R,et al.ISMRM raw data format: a proposed standard for MRI raw datasets[J]. Magnetic Resonance in Medicine,2017,77(1):411-421.
[12] VAN DER W S,SCHONBERGER J L,NUNEZ I J. Scikit-image: image processing in Python[J]. PeerJ,2014,2:e453.
[13] YANIV Z,LOWEKAMP B C,JOHNSON H J,et al. SimpleI TK image-analysis notebooks: a collaborative environment for education and reproducible research[J]. Journal of Digital Imaging,2018,31(3):290-303.
[14] 韓晓冬,王浩森,王硕,等. Python在图像处理中的应用[J]. 北京测绘,2018,32(3):312-317.
[15] DANIIL K,VALERY P,SRIKANTH N,et al. TomoPhantom,a software package to generate 2D-4D analytical phantoms for CT image reconstruction algorithm benchmarks[J]. SoftwareX,2018,7:150-155.
[16] GOUILLART E,NUNEZ L J,VAN DER W S. Analyzing microtomography data with Python and the Scikit-image library[J]. Advanced structural and chemical imaging,2017,2(1):1-5.
[17] VAN G,FEDOROV J J M,PARMAR A C,et al.Computational radiomics system to decode the radiographic phenotype[J]. Cancer Research,2017,77(21):e104-e107.
[18] 董付国. Python程序设计[M]. 第1版. 北京:清华大学出版社,2015.
[19] 陈为,沈泽潜,陶煜波. 数据可视化[M]. 第2版. 北京:电子工业出版社,2019.
(责任编辑:孙 娟)