DICOM介绍

DICOM3.0图像,由医学影像设备产生标准医学影像图像,DICOM被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和牙科等其它医学领域得到越来越深入广泛的应用。在数以万计的在用医学成像设备中,DICOM是部署最为广泛的医疗信息标准之一。当前大约有百亿级符合DICOM标准的医学图像用于临床使用。

看似神秘的图像文件,究竟是如何读取呢?网上随便 一搜,都有很多方法,但缺乏比较系统的使用方法,下文综合百度资料,结合python2.7,讲解如何读取及使用DICOM图像。

读取DICOM图像,需要以下几个库:pydicom、CV2、numpy、matplotlib。pydicom专门处理dicom图像的python专用包,numpy高效处理科学计算的包,依据数据绘图的库。

安装:

pip install matplotlib

pip install opencv-python #opencv的安装,小度上基本都是要下载包,安装包后把包复制到某个文件夹下,

#后来我在https://pypi.python.org/pypi/opencv-python找到这种pip的安装方法,亲测可用

pip install pydicom

pip install numpy

如果没有记错,安装pydicom时,也会自动把numpy安装上。

安装好这些库后,就可以对dicom文件操作。

具体看下面代码:

#-*-coding:utf-8-*-

import cv2

import numpy

import dicom

from matplotlib import pyplot as plt

dcm = dicom.read_file("AT0001_100225002.DCM")

dcm.image = dcm.pixel_array * dcm.RescaleSlope + dcm.RescaleIntercept

slices = []

slices.append(dcm)

img = slices[ int(len(slices)/2) ].image.copy()

ret,img = cv2.threshold(img,90,3071,cv2.THRESH_BINARY)

img = numpy.uint8(img)

im2,contours,_ = cv2.findContours(img,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

mask = numpy.zeros(img.shape,numpy.uint8)

for contour in contours:

cv2.fillPoly(mask,[contour],255)

img[(mask > 0)] = 255

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2,2))

img = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)

img2 = slices[ int(len(slices)/2) ].image.copy()

img2[(img == 0)] = -2000

plt.figure(figsize=(12,12))

plt.subplot(131)

plt.imshow(slices[int(len(slices) / 2)].image,'gray')

plt.title('Original')

plt.subplot(132)

plt.imshow(img,'gray')

plt.title('Mask')

plt.subplot(133)

plt.imshow(img2,'gray')

plt.title('Result')

plt.show()

在DICOM图像里,包含了患者的相关信息的字典,我们可以通过dir查看DICOM文件有什么信息,可以通过字典返回相关的值。

import dicom

import json

def loadFileInformation(filename):

information = {}

ds = dicom.read_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

print dir(ds)

print type(information)

return information

a=loadFileInformation('AT0001_100225002.DCM')

print a

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。

python dicom 测量_python对DICOM图像的读取方法详解相关推荐

  1. python支持向量机回归_Python中支持向量机SVM的使用方法详解

    除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类.因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm. 一.导 ...

  2. python求乘积_Python实现求笛卡尔乘积方法详解

    这篇文章主要介绍了Python实现求笛卡尔乘积的方法,结合实例形式分析了Python计算笛卡尔乘积的原理与实现技巧,需要的朋友可以参考下 本文实例讲述了Python实现求笛卡尔乘积的方法.分享给大家供 ...

  3. 朴素贝叶斯python实现预测_Python实现朴素贝叶斯分类器的方法详解

    本文实例讲述了Python实现朴素贝叶斯分类器的方法.分享给大家供大家参考,具体如下: 贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位. 先 ...

  4. python zipfile教程_Python模块zipfile原理及使用方法详解

    zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的 zipfile里有两个非常重要的class, 分别是ZipFile和Zi ...

  5. python优先级排序_Python实现优先级队列结构的方法详解

    最简单的实现一个队列至少满足2个方法,put和get. 借助最小堆来实现. 这里按"值越大优先级越高"的顺序. #coding=utf-8 from heapq import he ...

  6. [转载] 朴素贝叶斯python实现预测_Python实现朴素贝叶斯分类器的方法详解

    参考链接: Python朴素贝叶斯分类器 本文实例讲述了Python实现朴素贝叶斯分类器的方法.分享给大家供大家参考,具体如下: 贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进 ...

  7. python统计csv行数_对Python 多线程统计所有csv文件的行数方法详解

    如下所示: #统计某文件夹下的所有csv文件的行数(多线程) import threading import csv import os class MyThreadLine(threading.Th ...

  8. python 读取图片转换为一维向量_对Python中一维向量和一维向量转置相乘的方法详解...

    对Python中一维向量和一维向量转置相乘的方法详解 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况.但是在pyth ...

  9. pythonprint字节按照16进制输出_对python以16进制打印字节数组的方法详解

    对python以16进制打印字节数组的方法详解 一.问题描述 如果直接用print打印bytes的话,有时候会直接显示ascii对应的字符,看起来很蛋疼. 二.运行效果 上面一行是直接用print打印 ...

最新文章

  1. C#部署安装,将用户安装路径记录下写入注册表,并启动
  2. kubernetes(k8s)之yaml文件详解
  3. ITK:将静态密集2D级别集可视化为高程图
  4. 物联网技术泡沫多 期望与现实不匹配
  5. 蒙特卡洛法求圆周率 c语言,c++蒙特卡洛法求圆周率
  6. 使用-辗转相除法-求最大公约数
  7. clob mybatis_spring + mybatis 存取clob
  8. 【洛谷】NOIP2018原创模拟赛DAY1解题报告
  9. Tricks(三十)—— 获取高维向量邻域的方法
  10. QGroundControl源码编译安装
  11. 艾默生Ovation DCS OPC服务分析
  12. vtk 实现mimics软件中的Split/Merge算法
  13. SQL Server 安全篇——安全元数据(2)——安全对象(Securable)元数据
  14. WiFi基础知识解析
  15. 2021年广东省安全员C证(专职安全生产管理人员)找解析及广东省安全员C证(专职安全生产管理人员)模拟考试题
  16. 行业案例 | AR+工业互联网,智慧园区的全新服务模式
  17. iwatch可以用计算机吗,千万不要买AppleWatch的5个原因!
  18. 蓝桥杯JAVA-4.常用数据类型
  19. [玩转编程] C语言+模拟器制作简单脚本
  20. 100Mhz秒脉冲发生器 vivado

热门文章

  1. kotlin的loop和Range、list和map
  2. Spring使用内存数据库
  3. 使用javascript实现在页面打印的效果的三种方式
  4. 【中级02】Java Class字节码文件底层逻辑详解
  5. Emacs Lisp基本语法(六)
  6. C++之lock_guard和unique_lock自动加解锁区别
  7. Android强指针sp和弱指针wp区别
  8. 你没有变强,是因为你一直很舒服
  9. AudioUnitRender -10876
  10. C#之double网络字节序