批量将DICOM文件转换为JPG图像(多进程、高效率)

本文详细介绍使用pydicom库批量转换DICOM医学影像至JPG格式,涵盖图像读取、信息提取、图像处理及多进程高效转换流程。
#pydicom 安装与使用
安装
conda install -c conda-forge pydicom
使用
使用示例

import pydicom
filename = 'path_to_dicom'
ds = pydicom.dcmread(filename)
ds.dir()  # 查看病人所有信息字典keys
print(ds.PatientName)  # 查看病人名字
print(ds) # 查看病人所有信息字典, 如果出现某key对应值编码错误,先暂时跳过该key

############ 查看dicom对应图片值 #####################
print(ds.pixel_array.shape)  
print(ds.pixel_array)
##读取显示图片  
pylab.imshow(ds.pixel_array, cmap=pylab.cm.bone)  
pylab.show()  

##修改图片中的元素,不能直接使用data_array,需要转换成PixelData  
for n,val in enumerate(ds.pixel_array.flat): # example: zero anything < 300  
    if val < 300:  
        ds.pixel_array.flat[n]=0  
ds.PixelData = ds.pixel_array.tostring()  
ds.save_as('newfilename.dcm')  

详细使用教程:pydicom

环境
ubuntu 16.04
conda 4.3.30






# coding  : utf-8
# DICOM文件读取及JPG格式图片展示
# @Author : huang
# @Time   : 2020.08.18
"""

import pydicom
import matplotlib.pyplot as plt
import numpy as np
import os
import multiprocessing
import threading
import time

def extractDicomFileInfo(filename):
	"""
	提取Dicom文件的tag信息
	input :文件名
	output:相关信息
	"""
	info = {}
	dcm = pydicom.read_file(filename)
	info["PatientID"] = dcm.PatientID               # 患者ID
	info["PatientName"] = dcm.PatientName           # 患者姓名
	info["PatientBirthData"] = dcm.PatientBirthData # 患者出生日期
	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   # 检查项目描述
	return info

def saveAsJPGImage(img_array,jpg_path,uid,lens):
	"""
	格式转换函数
	input : 像素矩阵,图片保存路径,uid,lens
	output: 
	"""
	plt.figure(figsize=(12,6),dpi=80)                 # 绘制画板
	arr_temp = np.reshape(img_array,(lens,))
	max_val = max(arr_temp)                           # 获取像素极大值
	min_val = min(arr_temp)                           # 获取像素极小值
	img_array = (img_array-min_val)/(max_val-min_val) # 像素值归一化
	plt.imshow(img_array,cmap=plt.cm.bone)
	plt.title("UID:{}".format(uid))
	# print("saving image:{}".format(jpg_path.split('JPG图像/')[1]))
	plt.savefig(jpg_path)
	plt.close()

def getDicomFile(dicom_dir,jpg_dir):
	"""
	获取dicom文件的参数信息
	input : dicom_dir,jpg_dir
	output: args_list
	"""
	# 定位绝对路径
	all_file_list = os.listdir(dicom_dir)
	# 初始化args_list
	args_list = []
	for f in all_file_list:
		dicom_file_path = os.path.join(dicom_dir,f)
		# dicom_info = extractDicomFileInfo(dicom_file_path) # 提取tag信息备用
		jpg_name = jpg_dir+f.split('.d')[0]+'.jpg'           # 新建jpg文件名
		# print(jpg_name)
		dcm = pydicom.read_file(dicom_file_path)             # 读取dicom文件
		img_array = dcm.pixel_array                          # 获取图像像素矩阵
		lens = img_array.shape[0]*img_array.shape[1]         # 获取像素矩阵大小
		uid = dcm.SOPInstanceUID                             # 获取图像uid
		args_tuple = (img_array,jpg_name,uid,lens)           # 添加参数tuple
		args_list.append(args_tuple)
	return args_list

def main():
	"""
	main function
	"""
    # 存放DICOM文件的文件夹
	dicom_dir = "../dicom数据集/DICOM/"
    # 存放转换后的JPG图片的文件夹
	jpg_dir = "../dicom数据集/JPG图像/"
	begin_time = time.time()                      # 开始时间
	pool = multiprocessing.Pool(processes=5)      # 创建进程池
	args_list = getDicomFile(dicom_dir,jpg_dir)   # 获取参数list
	pool.starmap(saveAsJPGImage,args_list)        # 多进程保存jpg文件
	pool.close()                                  # 关闭进程
	end_time = time.time()                        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值