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进制的。希望对小伙伴有帮忙。谢谢!

相关推荐
明月_清风6 分钟前
干了 6 年前端,我是怎么一步步转型到 AI 的?
前端·后端·ai编程
L@ncor7 分钟前
第六章可能出现的问题:依赖冲突与成本乘法
python·依赖管理·langgraph·agentscope·避坑
AC赳赳老秦7 分钟前
财报附注表格精准提取:OpenClaw 从 PDF 年报附注挖掘隐藏明细,补齐财务分析维度
java·汇编·c++·python·青少年编程·deepseek·openclaw
顽疲10 分钟前
Java vue 养老系统源码详解:楼宇床位 care_space 与房态图 Spring Boot 实践
后端
小小张说故事11 分钟前
CatBoost 入门指南:类别特征为什么不用 One-Hot?Python 实战与 5 个坑
python·机器学习
Lyy16 分钟前
DevOps平台 — 第十三篇:规划的设计与实现
后端·devops
今天不在线28 分钟前
旧 Java 项目接入 AI 实战系列(一):四层递进,从基础对话到流式输出
后端
卷无止境33 分钟前
WebGIS生态全景丨从浏览器里的地图到背后的空间数据库
后端·python
Y38153266239 分钟前
竞品上新监控:用搜索 API 盯住对手发布了什么新功能
python·搜索引擎
benchmark_cc39 分钟前
如何设计一个 Python 实时行情获取程序?从轮询、数据处理到量化策略接入
python·数据分析·pandas·量化交易·股票数据·quantdash