目录

1.准备工作

 2.创建工程

3.导入dicom图像数据

4.获取dicom图像数据元

5.将dicom格式图像转换为jpg格式图像

6.输出结果



1.准备工作

1)下载python

2)下载pycharm

3)将python目录下的.script文件路径配置到系统环境PATH中,重启,就可以使用pip命令了

4)用anaconda包管理工具,安装simpleITK,cv2,pydiocm(5老师告诉我:用conda的pip随便装一个包,是自动从官网下最新的,俺也可以指定版本号)

E:\>CD conda
E:\conda>pip install opencv-python
E:\conda>pip install simoleITK
E:\conda>pip install pydicom

 5)如果直接用pip安装失败,可以更换镜像

6)使用pip命令安装清华镜像源:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pydicom

 

 

 2.创建工程

1)进入pycharm,新建项目PY01,目录在E:\pythontrain\py01,

2)新建hello2.py文件,在hello2.py文件内输入代码即可:

3.导入dicom图像数据

在该项目文件夹下导入一张需要处理的dicom图像,我这里导入的是15092560.dcm

4.获取dicom图像数据元

在hello2.py文件输入以下代码,目的是为了读入图像,并获取导入dicom图像的数据元信息:

import pydicom
import os

info = {}
# 读取dicom文件
dcm = pydicom.read_file("15092560.dcm")
# 通过字典关键字来获取图像的数据元信息(当然也可以根据TAG号)
# 这里获取几种常用信息
info["PatientID"] = dcm.PatientID               # 患者ID
info["PatientName"] = dcm.PatientName           # 患者姓名
info["PatientAge"] = dcm.PatientAge             # 患者年龄
info['PatientSex'] = dcm.PatientSex             # 患者性别
info['StudyID'] = dcm.StudyID                   # 检查ID
info['StudyDate'] = dcm.StudyDate               # 检查日期
info['StudyTime'] = dcm.StudyTime               # 检查时间
info['InstitutionName'] = dcm.InstitutionName   # 机构名称
info['Manufacturer'] = dcm.Manufacturer         # 设备制造商
info['StudyDescription']=dcm.StudyDescription   # 检查项目描述

print(info)

运行代码,结果如下,将病人ID、姓名、年龄等数据元读出:

C:\Users\Administrator\AppData\Local\Programs\Python\Python38\python.exe E:/pythontrain/py01/hello2.py
{'PatientID': 'MCS10002', 'PatientName': 'S400_典型儿童体部', 'PatientAge': '016Y', 'PatientSex': 'M', 'StudyID': 'P101123', 'StudyDate': '20200119', 'StudyTime': '095310', 'InstitutionName': '安科影像中心', 'Manufacturer': 'Anke', 'StudyDescription': 'S400典型_儿科_体部(Child)'}

Process finished with exit code 0

备注:

数据位存储(BitsStored)、数据位分配(BitsAllocated)、数据符号类型(PixelRepresentation)、灰度偏移(RescaleIntercept) 和数据值(PixelData)本身的关系:

(1)、BitsAllocated是给每个像素分配的字节数对应的位数,如单字节就是8,两字节就是16.......,把dicom数据读出来存到计算机内存最好就用相应的BitsAllocated数据类型,如BitsAllocated=16的时候,用short或者unsigned short类型

(2)、PixelRepresentation:是数据的存储类型,0代表无符号存储,1代表有符号存储;

(3)、BitsStored:在dicom文件里,BitsStored是BitsAllocated中的有效存储位。如果PixelRepresentation=1(有符号存储),那么BitsStored的HighBit位为符号位,比如BitsStored=12并且HighBit=11的时候,表示有效存储位(BitsStored)中的最高位为符号位,此时数据表示范围为-2048(即2^11) ~ 2043(即2^11-1);

(4)、RescaleIntercept:用于得到输出灰度值,也就是每个像素的PixelData值加上RescaleIntercept得到的结果。如一张图像上一个像素点灰度为1024,偏移RescaleIntercept=-1024,那么该像素对应输出1024+(-1024)=0;

(5)、由(3)和(4)可知,图像存储的有符号或者无符号不能决定图像的输出灰度的正负,而是由RescaleIntercept与PixelData的相加的结果决定。比如无符号存储的图像,某一像素灰度为255,但是偏移RescaleIntercept=-1024,那么输出灰度=255-1024=-769;

(6)、由(3)和(4)可知图像的输出灰度的数据类型与分配的位宽不一定一致,比如BitsAllocated=8,最大表示灰度255, 如果偏移为-2048,那么输出灰度为1793,必须要用short类型才能保存。


5.将dicom格式图像转换为jpg格式图像

import pydicom
import matplotlib.pyplot as plt
import numpy as np
import os

filename = "test.dcm"
jpgname = "test.jpg"
# 读取dicom文件
dcm = pydicom.read_file("15092560.dcm")
# 获取图像唯一标识符UID
uid = dcm.SOPInstanceUID
# 获取像素矩阵
img_arr = dcm.pixel_array
# 打印矩阵大小
print(img_arr.shape)
# 获取像素点个数
lens = img_arr.shape[0]*img_arr.shape[1]
# 获取像素点的最大值和最小值
arr_temp = np.reshape(img_arr,(lens,))
max_val = max(arr_temp)
min_val = min(arr_temp)
# 图像归一化
img_arr = (img_arr-min_val)/(max_val-min_val)
# 绘制图像并保存
plt.figure(figsize=(12,12),dpi=250) # 图像大小可以根据文件不同进行设置
plt.imshow(img_arr,cmap=plt.cm.bone)
plt.title("UID:{}".format(uid))
plt.savefig(jpgname)
plt.close()

运行代码,结果如下,输出了.dcm图像矩阵的大小,以及将dicom格式的图像转换成了jpg格式的图像:

6.输出结果

9.解析jpg图像,用cv库处理

import cv2
from PIL import Image
import numpy as np
from skimage.io import  imread

filepath = 'test.jpg'

cv2_im = cv2.imread(filepath)
print('cv2_im shape ',cv2_im.shape) # (height, width, ch)

im = Image.open(filepath)
print('PIL image size', im.size) # (width, height, ch)
pil_im = np.asarray(im)
print('pil_im shape ',pil_im.shape) # (height, width, ch)

sk_im = imread(filepath)
print('sk_im shape', sk_im.shape) # (height, width, ch)

运行结果,输出.jpg的输出:(对应信息:frame_num, width, height)帧参数:frame_num,代表CT扫描层数注意:img_array对应的是图像的矩阵信息

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐