zoukankan      html  css  js  c++  java
  • pydicom和SimpleITK分别解析医学影像中dicom文件

    首先,无论是pydicom还是SimpleITK都是需要事先导入到python中的库,如果使用的是pycharm IDE,可以先创建python3的虚拟环境,然后在虚拟环境下通过file-setting-Project interpreter ,在添加模块里面直接搜上述两个库的名称,点击安装即可。

    pydicom提取单张dicom图像

      

     1 import pydicom
     2 from matplotlib import pyplot
     3 
     4 ds = pydicom.read_file('C:/Users/****/Desktop/CT000000.dcm')# DICOM文件的位置
     5 print(ds.dir()) # 打印所有 DICOM TAG 名
     6 print(ds.dir('Pixe')) # 打印包含 'pat' 的 DICOM TAG
     7 print(ds.PatientName, ds.PatientSex, ds.PatientID, ds.PatientBirthDate, ds.PatientAge) # 打印 DICOM TAG 相应的属性值
     8 print(ds.data_element('PatientName')) # 打印一个完整的数据元素,包括 DICOMTAG编码值(Group, Element), VR, Value
     9 print(ds.data_element('PatientID').VR, ds.data_element('PatientID').value)
    10 pixel_bytes = ds.PixelData # 原始二进制文件
    11 
    12 pix = ds.pixel_array       # 像素值矩阵
    13 print(pix.shape) # 打印矩阵维度
    14 pyplot.imshow(pix, cmap=pylab.cm.bone)
    15 pyplot.show() # cmap 表示 colormap,可以是设置成不同值获得不同显示效果,打印dicom图片

    注意,此时可能会报错,报错的地方是ds.pixel_array,原因是某些格式的dicom文件不能用pydicom提取,参考解答

    pydicom提取序列dicom图像

     1 import pydicom
     2 import numpy
     3 from matplotlib import pyplot
     4 
     5 # 用lstFilesDCM作为存放DICOM files的列表
     6 PathDicom = "D:/dicom_image/V"  # 与python文件同一个目录下的文件夹
     7 lstFilesDCM = []
     8 
     9 # 将所有dicom文件读入
    10 for diName, subdirList, fileList in os.walk(PathDicom):
    11     for filename in fileList:
    12         if ".dcm" in filename.lower():  # 判断文件是否为dicom文件
    13             print(filename)
    14             lstFilesDCM.append(os.path.join(diName, filename))  # 加入到列表中
    15 
    16 ## 将第一张图片作为参考图
    17 RefDs = pydicom.read_file(lstFilesDCM[10])  # 读取第一张dicom图片
    18 # print(RefDs)
    19 # print(RefDs.pixel_array)
    20 # print(RefDs.PatientPosition)
    21 pyplot.imshow(RefDs.pixel_array, cmap=pyplot.cm.bone)
    22 pyplot.show()
    23 
    24 # 建立三维数组,分别记录长、宽、层数(也就是dicom数据个数)
    25 ConstPixelDims = (int(RefDs.Rows), int(RefDs.Columns), len(lstFilesDCM))
    26 print(ConstPixelDims)
    27 
    28 # 得到spacing值 (mm为单位)
    29 # PixelSpacing - 每个像素点实际的长度与宽度,单位(mm)
    30 # SliceThickness - 每层切片的厚度,单位(mm)
    31 ConstPixelSpacing = (float(RefDs.PixelSpacing[0]), float(RefDs.PixelSpacing[1]), float(RefDs.SliceThickness))
    32 
    33 # 三维数据
    34 x = numpy.arange(0.0, (ConstPixelDims[0] + 1) * ConstPixelSpacing[0], ConstPixelSpacing[0])  # 0到(第一个维数加一*像素间的间隔),步长为constpixelSpacing
    35 y = numpy.arange(0.0, (ConstPixelDims[1] + 1) * ConstPixelSpacing[1], ConstPixelSpacing[1])  #
    36 z = numpy.arange(0.0, (ConstPixelDims[2] + 1) * ConstPixelSpacing[2], ConstPixelSpacing[2])  #
    37 print(len(x),"xxxx")
    38 
    39 ArrayDicom = numpy.zeros(ConstPixelDims, dtype=RefDs.pixel_array.dtype)
    40 
    41 # 遍历所有的dicom文件,读取图像数据,存放在numpy数组中
    42 for filenameDCM in lstFilesDCM:
    43     ds = pydicom.read_file(filenameDCM)
    44     ArrayDicom[:, :, lstFilesDCM.index(filenameDCM)] = ds.pixel_array
    45 
    46 
    47 # 轴状面显示
    48 # dpi是指每英寸的像素数,dpi越大,表示打印出来的图片越清晰。不是指图片的大小.
    49 # 像素用在显示领域 分辨率用在打印领域 也就是你的图像是用来打印的时候才去考虑分辨率的问题
    50 pyplot.figure(dpi=1000)
    51 # 将坐标轴都变为同等长度
    52 # pyplot.axes().set_aspect('equal', 'datalim')
    53 pyplot.axes().set_aspect('equal')
    54 # 将图片变为gray颜色
    55 pyplot.set_cmap(pyplot.gray())
    56 
    57 pyplot.imshow(ArrayDicom[:, :, 360])# 第三个维度表示现在展示的是第几层 
    58 pyplot.show() 
    59 56 # 冠状面显示 
    60 pyplot.figure(dpi=100) 
    61 pyplot.axes().set_aspect('equal', 'datalim') 
    62 pyplot.set_cmap(pyplot.gray()) 
    63 pyplot.imshow(ArrayDicom[:, 90, :])
    64 pyplot.show()

    SimpleITK打开单张dicom图像

      

     1 import SimpleITK as sitk
     2 import numpy as np
     3 from matplotlib import pyplot
     4 
     5 file = sitk.ReadImage('C:/Users/****/Desktop/CT1227429.dcm')
     6 print(file.GetSize())
     7 print(file.GetOrigin()) # 坐标原点
     8 print(file.GetSpacing()) # 像素间距
     9 print(file.GetDirection()) # 方向
    10 pixel_array = sitk.GetArrayFromImage(file) # 像素矩阵
    11 print(pixel_array.shape) # 打印矩阵维度
    12 image_array = np.squeeze(pixel_array)
    13 print(image_array.shape) #
    14 pyplot.imshow(image_array)
    15 pyplot.show()

    SimpleITK打开多张dicom图像

     1 reader = sitk.ImageSeriesReader()
     2 reader.MetaDataDictionaryArrayUpdateOn()#这一步是加载公开的元信息
     3 reader.LoadPrivateTagsOn()#这一步是加载私有的元信息
     4 series_IDs = sitk.ImageSeriesReader.GetGDCMSeriesIDs(directorypath)#根据文件夹获取序列ID,一个文件夹里面通常是一个病人的所有切片,会分为好几个序列
     5 dicom_names = reader.GetGDCMSeriesFileNames( directorypath,series_ID)#选取其中一个序列ID,获得该序列的若干文件名
     6 reader.SetFileNames(dicom_names)#设置文件名
     7 image3D = reader.Execute()#读取dicom序列
     8 # 通过切片的索引来读取属于该切片的键,然后通过切片索引与键获取相应的值
     9 reader.GetMetaDataKeys(slice_index)
    10 reader.GetMetaData(slice_index,key)
  • 相关阅读:
    zabbix-agent报错记录
    远程执行命令恢复
    触发器例子
    自定义监控项
    监控项更新间隔
    python paramiko登陆设备
    python爬取某站磁力链
    python网络编程
    并发爬取网站图片
    Pandas Series和DataFrame的基本概念
  • 原文地址:https://www.cnblogs.com/jxblog/p/12010354.html
Copyright © 2011-2022 走看看