python在医学中的应⽤_如何应⽤Python处理医学影像学中的
DICOM信息
DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052)。它定义了质量能满⾜临床需要的可⽤于数据交换的医学图像格式,可⽤于处理、存储、打印和传输医学影像信息。DICOM可以便捷地交换于两个满⾜DICOM格式协议的⼯作站之间。⽬前该协议标准不仅⼴泛应⽤于⼤型医院,⽽且已成为⼩型诊所和⽛科诊所医⽣办公室的标准影像阅读格式。
DICOM被⼴泛应⽤于放射医疗、⼼⾎管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和⽛科等其它医学领域得到越来越深⼊⼴泛的应⽤。在数以万计的在⽤医学成像设备中,DICOM是部署最为⼴泛的医疗信息标准之⼀。当前⼤约有百亿级符合DICOM标准的医学图像⽤于临床使⽤。
⽬前,越来越多的DICOM应⽤程序和分析软件被运⽤于临床医学,促使越来越多的编程语⾔开发出⽀持DICOM API的框架。今天就让我来介绍⼀下Python语⾔下⽀持的DICOM模块,以及如何完成基本DICOM信息分析和处理的编程⽅法。
南京宜家[Pydicom]
Pydicom是⼀个处理DICOM⽂件的纯Python软件包。它可以通过⾮常容易的“Pythonic”的⽅式来提取和修改DICOM数据,修改后的数据还会借此⽣成新的DICOM⽂件。作为⼀个纯Python包,Pydicom可以在Python解释器下任何平台运⾏,除了必须预先安装Numpy模块外,⼏乎⽆需其它任何配置要求。其局限性之⼀是⽆法处理压缩像素图像(如JPEG),其次是⽆法处理分帧动画图像(如造影电影)。
[SimpleITK]
Insight Segmentation and Registration Toolkit (ITK)是⼀个开源、跨平台的框架,可以提供给开发者增强功能的图像分析和处理套件。其中最为著名的就是SimpleITK,是⼀个简化版的、构建于ITK最顶层的模块。SimpleITK旨在易化图像处理流程和⽅法。
[PIL]奉若神明
Python Image Library (PIL) 是在Python环境下不可缺少的图像处理模块,⽀持多种格式,并提供强⼤的图形与图像处理功能,⽽且API 却⾮常简单易⽤。
[OpenCV]
OpenCV的全称是:Open Source Computer Vision Library。OpenCV是⼀个基于BSD许可(开源)发⾏的跨平台计算机视觉库,可以运⾏在Linux、Windows和Mac OS操作系统上。它轻量级⽽且⾼效——
由⼀系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语⾔的接⼝,实现了图像处理和计算机视觉⽅⾯的很多通⽤算法。
下⾯就让我以实际Python代码来演⽰如何编程处理⼼⾎管冠脉造影DICOM图像信息。
1. 导⼊主要框架:SimpleITK、pydicom、PIL、cv2和numpy
import SimpleITK as sitk
形容女人漂亮的词语from PIL import Image
import dicom
import numpy as np
import cv2
2. 应⽤SimpleITK框架来读取DICOM⽂件的矩阵信息。如果DICOM图像是三维螺旋CT图像,则帧参数则代表CT扫描层数;⽽如果是造影动态电影图像,则帧参数就是15帧/秒的电影图像帧数。
def loadFile(filename):
ds = sitk.ReadImage(filename)
img_array = sitk.GetArrayFromImage(ds)
frame_num, width, height = img_array.shape
return img_array, frame_num, width, height
3. 应⽤pydicom来提取患者信息。
def loadFileInformation(filename):
information = {}
ds = ad_file(filename)
information['PatientID'] = ds.PatientID情感世界
information['PatientName'] = ds.PatientName
information['PatientBirthDate'] = ds.PatientBirthDate
information['PatientSex'] = ds.PatientSex
information['StudyID'] = ds.StudyID
information['StudyDate'] = ds.StudyDate
information['StudyTime'] = ds.StudyTime王光杰
information['InstitutionName'] = ds.InstitutionName
information['Manufacturer'] = ds.Manufacturer
information['NumberOfFrames'] = ds.NumberOfFrames
return information
整式加减
4. 应⽤PIL来检查图像是否被提取。
def showImage(img_array, frame_num = 0):
img_bitmap = Image.fromarray(img_array[frame_num])
return img_bitmap
5. 采⽤CLAHE (Contrast Limited Adaptive Histogram Equalization)技术来优化图像。幼儿园体检
def limitedEqualize(img_array, limit = 4.0):
img_array_list = []
for img in img_array:
clahe = ateCLAHE(clipLimit = limit, tileGridSize = (8,8))
img_array_list.append(clahe.apply(img))
img_array_limited_equalized = np.array(img_array_list)
return img_array_limited_equalized
这⼀步对于整个图像处理起到很重要的作⽤,可以根据不同的原始DICOM图像的窗位和窗宽来进⾏动态调整,以达到最佳的识别效果。原始图像:
经过⾃动窗位窗宽调节,⽣成:
最后应⽤OpenCV的Python框架cv2把每帧图像组合在⼀起,⽣成通⽤视频格式。def writeVideo(img_array):
frame_num, width, height = img_array.shape
同学录毕业赠言
filename_output = filename.split('.')[0] + '.avi'
video = cv2.VideoWriter(filename_output, -1, 16, (width, height))
for img in img_array:
video.write(img)