import globimport pydicom
import matplotlib.pyplot as plt
import numpy as np
import os
import multiprocessing
import threading
import timedef extractDicomFileInfo(filename):"""提取Dicom文件的tag信息input :文件名output:相关信息"""info = {}dcm = pydicom.read_file(filename)info["PatientID"] = dcm.PatientID               # 患者IDinfo["PatientName"] = dcm.PatientName           # 患者姓名info["PatientBirthData"] = dcm.PatientBirthData # 患者出生日期      info["PatientAge"] = dcm.PatientAge             # 患者年龄info['PatientSex'] = dcm.PatientSex             # 患者性别info['StudyID'] = dcm.StudyID                   # 检查IDinfo['StudyDate'] = dcm.StudyDate               # 检查日期info['StudyTime'] = dcm.StudyTime               # 检查时间info['InstitutionName'] = dcm.InstitutionName   # 机构名称info['Manufacturer'] = dcm.Manufacturer         # 设备制造商info['StudyDescription'] = dcm.StudyDescription   # 检查项目描述return infodef saveAsJPGImage(img_array, jpg_path, uid, lens):"""格式转换函数input : 像素矩阵,图片保存路径,uid,lensoutput:"""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_diroutput: args_list"""# 定位绝对路径all_file_list = os.listdir(dicom_dir)# 初始化args_listargs_list = []extension = 'dcm'for f in all_file_list:dcm_dir = os.path.join(dicom_dir, f, 'st01', '*.' + extension)dcm_files = glob.glob(dcm_dir)for i, d in enumerate(dcm_files):dicom_file_path = d# dicom_info = extractDicomFileInfo(dicom_file_path) # 提取tag信息备用dcm_name = os.path.basename(d)  # t2640000201al.dcm# jpg_name = jpg_dir + d# print(jpg_name)dcm = pydicom.read_file(dicom_file_path)             # 读取dicom文件if "PixelData" not in dcm:print(f"Dataset found with no Pixel Data: {d}")continueif len(dcm.pixel_array.shape) > 2:# 循环提取图片for index in range(int(dcm.pixel_array.shape[0])):# 根据dicom文件的BitAllocation显示1img = np.asarray(dcm.pixel_array[index], dtype='uint16')img_upload_path = os.path.join(jpg_dir, f, dcm_name.split('.d')[0], str(index) + ".png")if not os.path.exists(os.path.join(jpg_dir, f, dcm_name.split('.d')[0])):os.makedirs(os.path.join(jpg_dir, f, dcm_name.split('.d')[0]))# cmap参数是重点,选择plt.cm.bone,胸片显示才会正常plt.imsave(img_upload_path, img, cmap=plt.cm.bone)else:# 单图img = np.asarray(dcm.pixel_array, dtype='uint16')img_upload_path = os.path.join(jpg_dir, "x.png")plt.imsave(img_upload_path, img, cmap=plt.cm.bone)#         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)def main():"""main function"""# 存放DICOM文件的文件夹dicom_dir = "D:\papilla_detection\DICOM"# dicom_dir = r'E:\scripts\dicom2png'# 存放转换后的JPG图片的文件夹jpg_dir = "D:\papilla_detection\PNG"# jpg_dir = r'E:\scripts\dicom2png\png'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()                        # 结束时间print("耗时:{}s".format(round(end_time-begin_time, 4))) # 打印耗时if __name__ == '__main__':main()

DICOM文件读取及PNG格式图片展示相关推荐

  1. Dicom 文件 转成 JPG 格式(批量处理)

    需求:将 Dicom 文件转成 JPG 格式 PS:可以批量处理 1.下载软件 免费绿色的阅读软件 MicroDicom 链接为:http://www.microdicom.com/downloads ...

  2. 如何将CAD文件转换成GIF格式图片?

    如何将CAD文件转换成GIF格式图片?如何将CAD文件转换成GIF格式呢?在进行制图时我们可以保存时选择另存为的方法,可是面对大量的文件该怎么办呢? 1.首先我们启动迅捷CAD转换器.运行软件,进入文 ...

  3. 使用pydicom实现Dicom文件读取与CT图像窗宽窗位调整

    1. 前言 为了能够在Labelme上对Dicom图像进行编辑,这里对python环境下Dicom文件的读取进行了研究.在Dicom图像中CT的窗宽窗位是一个很重要的概念,但是找了半天在pydicom ...

  4. ISP【三】———— raw读取、不同格式图片差异

    part zero: 如何处理.raw格式数据,读取和转化 matlab读取raw图 (mark读取图片尺寸和位数均可设置,图片尺寸M,N,图片数据类型8bit,16bit改成uint16) clea ...

  5. [Python]小工具:将文件夹下多格式图片自动移动到指定位置

    不扯远,直接聊重点,目的:将一个存放乱七八糟格式文件的文件夹中找出所有格式的图片,并将这些图片移动到指定路径下去 准备: 1.[资源]:存放乱七八糟文件的文件夹 我们这从江湖上搜集了些乱七八糟的东东都 ...

  6. 怎么把PDF文件转换成jpg格式图片

    在发送PDF文件给他人查看时,如果想在任何设备上都能查看,又不想被别人轻易修改,那么可以将PDF文件的页面转换成一张张的图片,因为但是现在不管是手机还是电脑都是可以查看图片文件的,而且查看比较方便,也 ...

  7. ubuntu 下播放 yuv 格式的文件预览Raw格式图片

    1.ubuntu 下播放 yuv 格式的文件 1)使用ffplay sudo apt-get install ffmpeg 查看图片 ffplay -f rawvideo -video_size 64 ...

  8. 基于MuPDF库实现PDF文件转换成PNG格式图片

    背景 之所以会接触MuPDF是因为,有位群友在Q群里提问,如何将PDF保存为.PNG图片格式.我一看到这个问题,就蒙了,因为我没有接触过类似的项目或程序.但是,作为一群之主的我,还是要给初学者一个答复 ...

  9. matlab的seg是什么,地震数据文件读取——以SEG-Y格式为例

    1.引 言 地震勘探是利用地下介质弹性和密度的差异,通过观测和分析大地对人工激发地震波的响应,推断地下岩层的性质和形态的地球物理勘探方法,是钻探前勘测石油与天然气资源的重要手段,在煤田和工程地质勘查. ...

最新文章

  1. ISE下载到FPGA内的文件格式
  2. MySQL二进制日志文件过期天数设置说明
  3. chrome/edge插件备忘
  4. java基础 - file类(递归遍历目录)
  5. V模型的价值在于非常明确地标明了测试过程中存在的不同级别,并且清楚地描述了这些测试阶段和开发过程各阶段的对应关系。在V模型中,测试工作在编码之后才能进行,所以在软件开发早期各个阶段引入的错误不能及时被
  6. 以太网供电新标准POE+,IEEE802.3at解析
  7. 前端学习(1734):前端系列javascript之发行
  8. Linux dmidecode备忘
  9. linux中退格出现乱码,SSH中的SQL命令按退格键出现乱码的问题解决
  10. php preg_match正则匹配中文-有深意
  11. java两个数之间质数求法_Java程序显示两个间隔之间的质数
  12. Sigmoid函数求导过程
  13. js获取时间戳的几种方式
  14. 点阵字模生成原理与方法
  15. 【转载】FPGA配置方式
  16. D3.js 绘制地图
  17. pmv计算c语言软件,晨光暖通计算工具
  18. Newkirk effect and Morton effect
  19. java根据经纬度获取地址
  20. [编程语言的对比式学习] C++ vs C#

热门文章

  1. 容联孙昌勋:新通讯时代的造云者 | 保持愚钝和饥饿
  2. 为了女朋友转行了网络安全,我后悔了吗?
  3. C++ 设计模式-装饰模式
  4. .NetWeb前端-大三-零食系统-零食管理
  5. 安装、卸载TCP/IP协议
  6. turtle画画 画图形
  7. 2022卡塔尔世界杯黑科技--半自动越位技术
  8. 20.JDBC操作数据库
  9. java正则表达式匹配空格 tab空格 制表符
  10. Vue组件传值中加不加v-bind(:冒号)