PACS系统中dicom文件在mysql 8.0 数据库中的存储和读取

前言

突然对 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 数据库

powershell 复制代码
pip install pydicom 
pip install matplotlib
pip install pymysql

二、使用步骤

1.找到 .dcm 的文件

当你安装好 pydicom 库后,会有一些dcm文件提供你测试

如果是默认安装的话 具体在

powershell 复制代码
C:\Users\kc\AppData\Roaming\Python\Python38\site-packages\pydicom\data\test_files
kc 就是你的windows 用户名

可以看到 dcm 文件很多,大家可以用于测试

J2K_pixelrep_mismatch.dcm

2.python 将 dcm文件 存入数据库

建表 ,注意这里使用的是 longblob 这个类型 主要用于存2进制文件

sql 复制代码
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 文件存入数据库

python 复制代码
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文件 从数据库中读取并显示·

python 复制代码
    # 连接到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.运行

最后运行程序

python 复制代码
py dicom.py

总结

以上是 PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取, 虽然没有真正接触过生产中的PACS系统,但是存储在数据库的中的基本都是2进制的。希望对小伙伴有帮忙。谢谢!

相关推荐
chicpopoo8 分钟前
Python打卡DAY25
开发语言·python
crazyme_61 小时前
深入掌握 Python 切片操作:解锁数据处理的高效密码
开发语言·python
tan180°1 小时前
Linux进程信号处理(26)
linux·c++·vscode·后端·信号处理
有梦想的攻城狮2 小时前
spring中的@MapperScan注解详解
java·后端·spring·mapperscan
Code_流苏2 小时前
《Python星球日记》 第69天:生成式模型(GPT 系列)
python·gpt·深度学习·机器学习·自然语言处理·transformer·生成式模型
柚个朵朵3 小时前
Spring的Validation,这是一套基于注解的权限校验框架
java·后端·spring
于壮士hoho3 小时前
Python | Dashboard制作
开发语言·python
掘金-我是哪吒3 小时前
分布式微服务系统架构第131集:fastapi-python
分布式·python·微服务·系统架构·fastapi
小猪快跑爱摄影3 小时前
【Folium】使用离线地图
python
keke103 小时前
Java【10_1】用户注册登录(面向过程与面向对象)
java·python·intellij-idea