跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言AIjava算法

DICOM 标准详解:文件解析、Java/Python 库与 AI 应用

DICOM 是医学影像存储传输国际标准,包含图像数据与元数据。内容涵盖 DICOM 标准结构、数据字典及文件格式解析方法。介绍 Java 端 dcm4che 与 DCMTK 库的使用示例,以及 Python 端 PyDicom 的读取与处理流程。探讨医疗 AI 领域框架 MONAI 和微软开源模型 MedImageInsight 的应用场景,包括分类预测与嵌入向量生成接口调用,为医学影像数字化处理提供技术参考。

萤火微光发布于 2026/3/16更新于 2026/6/530 浏览
DICOM 标准详解:文件解析、Java/Python 库与 AI 应用

概述

Digital Imaging and Communications in Medicine,医学数字成像和通信,简称 DICOM,一种用于存储和传输如 X 光、CT、MRI、超声等医学影像数据的国际标准。

主要特点是标准化,确保不同医疗设备和系统间可以相互兼容、共享和解读医学影像。关键特征:

  • 内容丰富:包含图像数据和丰富的元数据。
  • 广泛应用:放射科、心血管科、眼科、牙科等领域。
  • 标准制定:由美国国家电气制造商协会(NEMA)开发。

标准

自从 1985 年首次发布以来,标准已经历多次修订和扩展,以适应不断发展的医学影像技术和需求。

[图片]

当前最新版本为 2026a。

数据字典

DICOM 数据字典,定义 DICOM 文件中使用的上千个数据元素及其属性,分成四类:

  1. DICOM Data Elements
  2. DICOM File Meta Elements
  3. DICOM Directory Structuring Elements
  4. DICOM Dynamic RTP Payload Elements

数据字典格式:

  • Tag:标签,相当于唯一 ID,由两个十六进制数字组成,分别表示组号和元素号,标准数据元素的组号为偶数,私有数据元素组号为奇数。
  • Name:名称,描述该元素的含义。
  • Keyword:关键字,通常是名称的简写形式。
  • VR:Value Representation,值表示,定义该元素的数据类型,如:UL(Unsigned Long)、CS(Code String)、PN(Person Name)等。
  • VM:Value Multiplicity,值多重性,表示该元素可以包含多少个值(如单值、多值等)。
  • 说明,Description

部分常见数据元素

标签 (Tag)名称关键字VRVM说明 (Description)
(0010,0010)Patient's NamePN1患者姓名
(0010,0020)Patient IDLO1患者标识
(0008,0060)ModalityCS1检查模态(如 CT、MR、US 等)
(0028,0010)RowsUS1图像的行数
(0028,0011)ColumnsUS1图像的列数
(0028,0030)Pixel SpacingDS2像素间距(行间距和列间距,单位为毫米)
(0028,1050)Window CenterDS1-n窗口中心值
(0028,1051)Window WidthDS1-n窗口宽度值
(0028,0008)Number of Frames
IS
1
图像的帧数(对于多帧图像)

文件

普通图像查看器通常打不开它,需要使用专业的 DICOM 查看软件,如 MicroDicom、RadiAnt 或 GIMP 等,来打开、查看和转换成 JPG 等格式。

如何打开 DCM 文件:

  • 专用软件:如 RadiAnt DICOM Viewer、MicroDicom 或 3DICOM Viewer 免费或付费 DICOM 浏览器。
  • 图像处理软件:GIMP(支持多平台) 也能打开部分 DCM 文件。
  • 在线工具:一些在线服务也提供 DCM 转 JPG 等功能,但可能受文件大小或数量限制。

转换 DCM 文件:使用上述专用软件,在 File 菜单下找到 Export 或 Save As 选项,将其转换为 JPEG、PNG 等常用格式。

库

简单汇总介绍几个 Java 和 Python 库:

  • dcm4che
  • DCMTK
  • PyDicom

dcm4che

广泛使用的开源 Java 库,GitHub,专为处理 DICOM 文件而设计,提供丰富的 API,支持读取、解析、修改、显示、存储、传输 DICOM 文件。

Maven 项目引入依赖:

<dependency>
    <groupId>org.dcm4che</groupId>
    <artifactId>dcm4che-core</artifactId>
    <version>5.34.1</version>
    <scope>compile</scope>
</dependency>

示例程序:

private static final Set<String> ALLOWED_FILE_EXT = Sets.newHashSet("dcm", "dicom");
public static String parseDcm(MultipartFile img) {
    String suffix = FileUtil.getSuffix(img.getOriginalFilename());
    if (ALLOWED_FILE_EXT.contains(suffix)) {
        try (DicomInputStream dis = new DicomInputStream(img.getInputStream())) {
            Attributes attr = dis.readDataset(-1, -1);
            String patientId = attr.getString(Tag.PatientID);
            String patientName = attr.getString(Tag.PatientName);
            // logging
        }
    }
}

DCMTK

开源的医学影像处理 Java 库,提供丰富的功能,包括解析、读写和处理 DICOM 文件。

Gradle 项目引入依赖:implementation 'org.dcmtk:dcmtk:3.6.5'

示例:

import org.dcmtk.dcmdata.DcmFileFormat;
import org.dcmtk.dcmdata.DcmObject;
import org.dcmtk.dcmdata.Tag;
import org.dcmtk.dcmdata.TagPath;
import org.dcmtk.dcmdata.VR;

public class DicomParser {
    public static void main(String[] args) {
        String filePath = "/path/to/dicom/file.dcm";
        DcmFileFormat dcmFileFormat = new DcmFileFormat();
        if (dcmFileFormat.loadFile(filePath).good()) {
            // 获取数据集对象
            DcmObject dcmObject = dcmFileFormat.getDataset();
            String patientName = dcmObject.getString(Tag.PatientName);
            String patientID = dcmObject.getString(Tag.PatientID);
            // 获取图像宽度、高度
            int width = dcmObject.getInt(Tag.Columns, 0);
            int height = dcmObject.getInt(Tag.Rows, 0);
            // 获取像素数据类型
            VR pixelDataType = dcmObject.getVR(Tag.PixelData);
        } else {
            log.error("Failed to load DICOM file:{}.", filePath);
        }
    }
}

PyDicom

用于处理 DICOM 文件的开源 GitHub,Python 库。允许用户读取、修改和创建 DICOM 文件,支持大部分 DICOM 标准的数据元素和功能。

PyDicom 使用内置的数据字典来解释 DICOM 文件中的数据元素,包含 DICOM 标准中定义的(除 Dynamic RTP Payload Elements 外)所有数据元素及其属性,可在 _dicom_dict.py 文件中对照标准查看。

安装:pip install pydicom matplotlib

示例:

import matplotlib.pyplot as plt
import pydicom

file_name = '/P202601010001_肝穿刺_HE 染色_20250923_001.dcm'
ds = pydicom.dcmread(file_name)
print(f"{len(ds.file_meta.keys())} + {len(ds.keys())} Tags:")
for key in ds.file_meta.keys():
    print(f"{key}: {ds.file_meta.get(key)}")
for key in ds.keys():
    print(f"{key}: {ds.get(key)}")
print('\n---\n')
print(f"SOP 类..........: {ds.SOPClassUID} ({ds.SOPClassUID.name})")
print(f"患者姓名........: {ds.PatientName.family_comma_given()}")
print(f"检查模态........: {ds.Modality}")
print(f"图像尺寸........: {ds.get(0x00280010).value} x {ds[0x0028,0x0011].value}")
print(f"像素数组维度.....: {ds.pixel_array.ndim}")
print(f"像素数组形状.....: {ds.pixel_array.shape}")
print(f"图像帧数........: {ds.NumberOfFrames}")
print(f"协议名称........: {ds.get('ProtocolName','(缺失)')}")
print(f"检查部位........: {ds.get('BodyPartExamined','(缺失)')}")
print(f"切片位置........: {ds.get('SliceLocation','(缺失)')}")
if ds.pixel_array.ndim == 2:
    plt.imsave('./test.jpg', ds.pixel_array, cmap='gray')
else:
    for i in range(ds.pixel_array.shape[0]):
        png_file = f'./test/test_{i:03d}.jpg'
        plt.imsave(png_file, ds.pixel_array[i,:,:], cmap='gray')

AI

MONAI

官网,专门为医疗影像 AI 开发的开源 GitHub,7.9K Star,1.4K Fork 框架,基于 PyTorch,集成各种医学图像预处理、分割、分类工具。医生和开发者用它能快速开发肿瘤检测、器官分割等模型,不用再从零处理 DICOM 这类特殊格式。

核心特点:

  • 医疗专用:支持 DICOM 格式、3D 影像处理(CT/MRI 常用),贴合医疗场景;
  • 模型丰富:内置肿瘤分割、病灶检测等预训练模型,开箱即用;
  • 合规友好:遵循医疗数据隐私规范,适合医院、科研机构使用。

应用场景:医学影像辅助诊断(如 CT 肺结节检测)、病灶分割、医疗图像分析研究。

项目对比:和普通 CV 框架(如 PyTorch、Lightning)比,MONAI 胜在医疗专用工具多,不用自己写医学图像预处理代码。

MedImageInsight

论文,微软团队提出用于医学图像的开源嵌入模型 MedImageInsight,采用类似 CLIP 的双塔架构:图像编码器 + 文本编码器。

[图片]

在未经微调的情况下,即可在分类、图像检索、报告生成等多种医学图像任务中表现出色。

组织在 HF 开源模型权重,GitHub 在 HF 基础上通过 GitHub Actions 构建 Docker 镜像:

  • CPU 版本:alphahinex/medimageinsights:cpu
  • GPU 版本:alphahinex/medimageinsights:gpu

一行命令启动: docker run --privileged --name mi2 -p 8000:8000 alphahinex/medimageinsights:cpu

浏览器打开 http://localhost:8000/docs 即可看到 FastAPI 自动生成的接口文档:

[图片]

主要是预测分类接口 /predict。

使用示例

分类预测:

img1=$(base64 -i ultrasound.jpg | tr -d '\n')
img2=$(base64 -i computed-tomography.jpg | tr -d '\n')
img3=$(base64 -i x-ray.jpg | tr -d '\n')
curl -X POST -H "Content-Type: application/json" \
-d "{\"images\": [\"$img1\",\"$img2\",\"$img3\"], \"labels\":[\"X-Ray\",\"Magnetic Resonance Imaging\",\"Computed Tomography\",\"Ultrasound\",\"Dermoscopy\",\"Clinical Photography\",\"Optical Coherence Tomography\"]}" http://localhost:8000/predict

输出略,注意事项:

  • 训练数据均为英文标签,推理时也使用英文标签效果更好;
  • 输入的图像不能包含 alpha 通道,否则会报错:The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimension 0

/encode 接口用于生成(1024 维)嵌入向量,适用于文本和图片:

curl -X POST -H "Content-Type: application/json" \
-d "{\"images\": [\"$img1\"], \"texts\":[\"Ultrasound\"]}" http://localhost:8000/encode
curl -X POST -H "Content-Type: application/json" \
-d "{\"texts\":[\"Ultrasound\"]}" http://localhost:8000/encode

参考

目录

  1. 概述
  2. 标准
  3. 数据字典
  4. 文件
  5. 库
  6. dcm4che
  7. DCMTK
  8. PyDicom
  9. AI
  10. MONAI
  11. MedImageInsight
  12. 参考
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 前端开发中支持跨域的 HTML 标签、属性及缓存机制总结
  • 解决新机型 Copilot 键替代右 Ctrl 键问题
  • 基于 Claude Code、DeepSeek 与 OpenSpec 实现自动化代码生成教程
  • FastGithub 部署指南:智能 DNS 解析优化 GitHub 访问
  • C 语言文件加密实现与安全编程实践
  • Rust WebAssembly 与 Three.js 结合的 3D 数据可视化实战:高性能粒子系统
  • Dify 前后端分离开发:独立启动前端 Docker 容器方案
  • Android 面试经验复盘与核心知识点梳理
  • 数据库 SQL 防火墙:内核级防护与注入防御
  • DFS/BFS 专项练习:从海岛问题掌握图论基础(C++ 实现)
  • 基于腾讯云轻量应用服务器部署 OpenClaw 并接入 QQ 与飞书机器人
  • Python 核心应用实战:数据分析与自动化脚本开发指南
  • 基于 Stable Diffusion 的 AI 视频生成与背景替换教程
  • OpenClaw v2026.3.8 全平台部署与本地模型对接指南
  • 红黑树原理及在C++ map与set中的应用
  • MySQL 环境配置实战:CentOS 7 与 Ubuntu 双系统安装指南
  • 飞算 JavaAI:解决 AI 生成代码不可用与逻辑混乱问题
  • 自然语言处理在社交媒体分析中的应用与实战
  • Kafka 核心架构与分布式存储深度解析
  • 算法:快慢指针判断快乐数

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online