PACS系统中dicom文件在mysql 8.0 数据库中的存储和读取 (pydicom 库使用)
前言
突然对 PACS系统 dicom 文件存储 感兴趣, 主要是这个很有趣dicom 文件会包含 患者的年龄,名字等。
在百度百科查到如下 :
PACS(picture archiving and communication system)意为影像归档和通信系统。它是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声,各种X光机,各种红外仪、显微仪等设备产生的图像)通过各种接口(模拟,DICOM,网络)以数字化的方式海量保存起来,当需要的时候在一定的授权下能够很快的调回使用,同时增加一些辅助诊断管理功能。它在各种影像设备间传输数据和组织存储数据具有重要作用。
那个Dicom 又是什么
在百度百科查到如下 :
DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052)。它定义了质量能满足临床需要的可用于数据交换的医学图像格式。
DICOM被广泛应用于放射医疗,心血管成像以及放射诊疗诊断设备(X射线,CT,核磁共振,超声等),并且在眼科和牙科等其它医学领域得到越来越深入广泛的应用。在数以万计的在用医学成像设备中,DICOM是部署最为广泛的医疗信息标准之一。当前大约有百亿级符合DICOM标准的医学图像用于临床使用。
自从1985年DICOM标准第一版发布以来,DICOM给放射学实践带来了革命性的改变,X光胶片被全数字化的工作流程所代替。就像Internet成为信息传播应用的全新平台,DICOM使“改变临床医学面貌”的高级医学图像应用成为可能。比如在急诊科中,心脏负荷测试,乳腺癌的检查,DICOM为医生和病人服务,是医学成像有效工作的标准。
一、前期准备
本文不适合初学者
请先安装 python 3.8 以上版本
请先安装 mysql8.0 数据库
pip install pydicom pip install matplotlib pip install pymysql
二、使用步骤
1.找到 .dcm 的文件
当你安装好 pydicom 库后,会有一些dcm文件提供你测试
如果是默认安装的话 具体在
C:\Users\kc\AppData\Roaming\Python\Python38\site-packages\pydicom\data\test_filess kc 就是你的windows 用户名
可以看到 dcm 文件很多,大家可以用于测试
J2K_pixelrep_mismatch.dcm
2.python 将 dcm文件 存入数据库
建表 ,注意这里使用的是 longblob 这个类型 主要用于存2进制文件
CREATE TABLE `dicom_files` ( `id` int NOT NULL AUTO_INCREMENT, `file_name` varchar(255) DEFAULT NULL, `file_data` longblob, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
使用 python 将 DICOM 文件存入数据库
import pydicom from pydicom import dcmread, dcmwrite from pydicom.data import get_testdata_file from pydicom.filebase import DicomFileLike from io import BytesIO import pymysql #转换为 2进制 def write_dataset_to_bytes(dataset): # create a buffer with BytesIO() as buffer: # create a DicomFileLike object that has some properties of DataSet memory_dataset = DicomFileLike(buffer) # write the dataset to the DicomFileLike object dcmwrite(memory_dataset, dataset) # to read from the object, you have to rewind it memory_dataset.seek(0) # read the contents as bytes return memory_dataset.read() #找到 filename_mismatch = get_testdata_file('J2K_pixelrep_mismatch.dcm') dataset1 = dcmread(filename_mismatch) file_name1 = dataset1.SOPInstanceUID ds_bytes1 = write_dataset_to_bytes(dataset1) # 连接到MySQL数据库 conn = pymysql.connect( host='localhost', user='root', password = "123456", db='test', ) cursor = conn.cursor() insert_query = "INSERT INTO dicom_files (file_name, file_data) VALUES (%s, %s)" cursor.execute(insert_query, (file_name1, ds_bytes1)) conn.commit() cursor.close() conn.close()
在数据库中图示
3.将 dcm文件 从数据库中读取并显示·
# 连接到MySQL数据库 cursor = conn.cursor() cursor.execute("select file_data from dicom_files ") result = cursor.fetchone() blob_data = result[0] dataset = dcmread(BytesIO(blob_data)) image_data = dataset.pixel_array # 显示DICOM图像 plt.imshow(image_data, cmap=plt.cm.gray) plt.show() cursor.close() conn.close()
4.运行
最后运行程序
py dicom.py
总结
以上是 PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取, 虽然没有真正接触过生产中的PACS系统,但是存储在数据库的中的基本都是2进制的。希望对小伙伴有帮忙。谢谢!