PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)

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



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
49 15
|
4天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
8天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
9天前
|
存储 Oracle 关系型数据库
服务器数据恢复—华为S5300存储Oracle数据库恢复案例
服务器存储数据恢复环境: 华为S5300存储中有12块FC硬盘,其中11块硬盘作为数据盘组建了一组RAID5阵列,剩下的1块硬盘作为热备盘使用。基于RAID的LUN分配给linux操作系统使用,存放的数据主要是Oracle数据库。 服务器存储故障: RAID5阵列中1块硬盘出现故障离线,热备盘自动激活开始同步数据,在同步数据的过程中又一块硬盘离线,RAID5阵列瘫痪,上层LUN无法使用。
|
SQL Java 数据库连接
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
194 0
MySQL---数据库从入门走向大神系列(十五)-Apache的DBUtils框架使用
|
SQL 关系型数据库 MySQL
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
142 0
MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)
|
存储 SQL 关系型数据库
MySQL---数据库从入门走向大神系列(五)-存储过程
MySQL---数据库从入门走向大神系列(五)-存储过程
142 0
MySQL---数据库从入门走向大神系列(五)-存储过程
|
数据库
MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系(3)
MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系
204 0
MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系(3)
|
SQL 关系型数据库 MySQL
MySQL---数据库从入门走向大神系列(二)-用Java对MySQL进行增删改查
MySQL---数据库从入门走向大神系列(二)-用Java对MySQL进行增删改查
214 0
MySQL---数据库从入门走向大神系列(二)-用Java对MySQL进行增删改查
|
数据库
MySQL---数据库从入门走向大神系列(一)-基础入门(2)
MySQL---数据库从入门走向大神系列(一)-基础入门(2)
128 0
MySQL---数据库从入门走向大神系列(一)-基础入门(2)