python下dicom格式图像转化为jpg格式图像

目录

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对应的是图像的矩阵信息

要将 Python 中的 JPG 图像换为 DICOM 格式,您需要使用 PyDICOM 库。以下是一个示例代码: ```python import os import pydicom from PIL import Image # 原始 JPG 图像文件路径 jpg_path = "path/to/image.jpg" # 读取 JPG 图像换为灰度图像 image = Image.open(jpg_path).convert('L') # 创建 DICOM 文件 dataset = pydicom.dataset.FileDataset(os.path.splitext(jpg_path)[0] + ".dcm", {}, file_meta=pydicom.dataset.FileMetaDataset()) # 设置 DICOM 文件元数据 dataset.PatientName = "Test^Patient" dataset.PatientID = "123456" dataset.Modality = "CT" dataset.StudyDescription = "Test Study" dataset.SeriesDescription = "Test Series" # 设置像素数据 dataset.PixelData = image.tobytes() # 设置其他 DICOM 标签 dataset.Rows = image.height dataset.Columns = image.width dataset.BitsAllocated = 8 dataset.BitsStored = 8 dataset.HighBit = 7 dataset.SamplesPerPixel = 1 dataset.PhotometricInterpretation = "MONOCHROME2" dataset.PixelRepresentation = 0 # 保存 DICOM 文件 pydicom.filewriter.dcmwrite(dataset.filename, dataset) ``` 在上面的代码中,我们首先使用 PIL 库打开 JPG 图像,并将其换为灰度图像。然后,我们使用 PyDICOM 库创建一个新的 DICOM 文件,并设置文件的元数据和像素数据。最后,我们将 DICOM 文件保存到磁盘上。 请注意,这只是一个简单的示例,您可能需要根据您的具体情况进行更改。另外,这种换可能会导致一些信息的丢失,因此请确保您已了解您的应用程序对 DICOM 文件中的哪些信息是必需的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值