当前位置:首页>python>Python医学图像处理——DICOM读写与元数据修改

Python医学图像处理——DICOM读写与元数据修改

  • 2026-09-02 20:25:22
Python医学图像处理——DICOM读写与元数据修改

科研图像处理

在医学影像处理中,DICOM 是最常见、最重要的文件格式之一。

DICOM 的全称是Digital Imaging and Communications in Medicine,它不仅仅是一种“图像格式”,更准确地说,它是一套医学图像存储与交换的标准。

与普通的 JPG、PNG 不同,DICOM 文件通常不仅保存图像像素数据,还包含大量与检查相关的元信息,例如:

  • 患者信息:姓名、性别、年龄、ID
  • 检查信息:检查日期、设备型号、医院名称
  • 图像信息:图像尺寸、像素间距、层厚
  • 扫描参数:模态类型(CT、MR等)、窗宽窗位、采集条件

因此,DICOM 文件可以理解为:

图像数据 + 医学元数据(Metadata)

这也是 DICOM 在临床和科研中被广泛使用的原因。

这篇文章会介绍怎样利用Python对DICOM文件进行读写,以及对元数据(Metadata)进行修改。


一、DICOM元数据解析

DICOM 规定了一套“全世界通用的医学影像字段字典”,每个字段都有固定编号、名字、数据类型和使用规则,并由DICOM 标准委员会定义和维护:

https://www.dicomlibrary.com/dicom/dicom-tags/

这些信息在 DICOM 中都以Data Element(数据元素)的形式存在。而每个数据元素都有一个唯一编号,这个编号就是我们常说的Tag(标签)。例如:

  • (0010,0010):Patient's Name,患者姓名
  • (0010,0020):Patient ID,患者编号
  • (0008,0060):Modality,成像模态
  • (0028,0010):Rows,图像行数
  • (0028,0011):Columns,图像列数

DICOM 的 tag 由两个 16 位十六进制数组成(group, element):

例如(0010,0010)可以拆成:

  • 0010:group
  • 0010:element

Tag的前半部分表示“属于哪一大类” ,后半部分表示“这类里的具体哪一项”比如:

  • (0010,xxxx)
     常常和患者信息有关
  • (0008,xxxx)
     常常和检查/序列/设备基础信息有关
  • (0028,xxxx)
     常常和图像显示属性有关

虽然核心标准是统一的,但不同厂商设备在实际写文件时,有些 tag 会省略,有些会增加私有tag。


二、DICOM读写与元数据修改

1、安装pydicom

可以新建一个conda环境,然后安装相关的包:

conda create -n dicom_env python=3.10conda activate dicom_envpip install pydicom matplotlib ipykernelpython -m ipykernel install --user --name dicom_env --display-name "Python (dicom_env)"

2、DICOM读写

这里选择pydicom自带的数据集:

from pydicom import examplesimport pydicom# Load example CT datasetds = examples.ct# save dicom fileoutput_path = "ct_example.dcm"ds.save_as(output_path)# load saved dicom filepath = "ct_example.dcm"ds = pydicom.dcmread(path)

3、DICOM Tag读取与修改

把DICOM读取成为data structure后,可以通过名称或者tag number,对元数据进行读取:

elem = ds["PatientName"]# Access the same element by its tag number# elem = ds[(0x0010, 0x0010)]print("Keyword:", elem.keyword)print("Tag:", elem.tag)print("Name:", elem.name)print("VR:", elem.VR)print("Value:", elem.value)

同样的,可以对Tag进行修改:

# Modify the tagds.PatientName = "Demo Patient"

如果某个Tag缺失,也可以增加一个Tag:

# Add a standard new tag: PatientAgeds.add_new((0x0010, 0x1010), "AS", "035Y")

另一种比较方便可以查看DICOM Metadata的方式,可以在ImageJ中打开DICOM文件。然后ImageJ -> Show info:

希望对大家有帮助~

往期推荐

◆ ImageJ | 荧光共标细胞计数

◆ ImageJ | 图像标注

◆ ImageJ | 图像去卷积

◆ ImageJ | 自动图片拼接

◆ ImageJ | 图像自动配准

◆ ImageJ | 重新认识你的图像

◆ ImageJ | 荧光比率图

点赞在看哦~

最新文章

随机文章