跳到主要内容DICOM 标准详解:文件解析、Java/Python 库与 AI 应用 | 极客日志编程语言AIjava算法
DICOM 标准详解:文件解析、Java/Python 库与 AI 应用
DICOM 是医学影像存储传输国际标准,包含图像数据与元数据。内容涵盖 DICOM 标准结构、数据字典及文件格式解析方法。介绍 Java 端 dcm4che 与 DCMTK 库的使用示例,以及 Python 端 PyDicom 的读取与处理流程。探讨医疗 AI 领域框架 MONAI 和微软开源模型 MedImageInsight 的应用场景,包括分类预测与嵌入向量生成接口调用,为医学影像数字化处理提供技术参考。
萤火微光4 浏览 概述
Digital Imaging and Communications in Medicine,医学数字成像和通信,简称 DICOM,一种用于存储和传输如 X 光、CT、MRI、超声等医学影像数据的国际标准。
主要特点是标准化,确保不同医疗设备和系统间可以相互兼容、共享和解读医学影像。关键特征:
- 内容丰富:包含图像数据和丰富的元数据。
- 广泛应用:放射科、心血管科、眼科、牙科等领域。
- 标准制定:由美国国家电气制造商协会(NEMA)开发。
标准
自从 1985 年首次发布以来,标准已经历多次修订和扩展,以适应不断发展的医学影像技术和需求。
[图片]
当前最新版本为 2026a。
数据字典
DICOM 数据字典,定义 DICOM 文件中使用的上千个数据元素及其属性,分成四类:
- DICOM Data Elements
- DICOM File Meta Elements
- DICOM Directory Structuring Elements
- 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) | 名称 | 关键字 | VR | VM | 说明 (Description) |
|---|
| (0010,0010) | Patient's Name | | PN | 1 | 患者姓名 |
| (0010,0020) | Patient ID | | LO | 1 | 患者标识 |
| (0008,0060) | Modality | | CS | 1 | 检查模态(如 CT、MR、US 等) |
| (0028,0010) | Rows | | US | 1 | 图像的行数 |
| (0028,0011) | Columns | | US | 1 | 图像的列数 |
| (0028,0030) | Pixel Spacing | | DS | 2 | 像素间距(行间距和列间距,单位为毫米) |
| (0028,1050) | Window Center | | DS | 1-n | 窗口中心值 |
| (0028,1051) | Window Width | | DS | 1-n | 窗口宽度值 |
| (0028,0008) | Number of Frames |
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- 加密/解密文本
使用加密算法(如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
文件
普通图像查看器通常打不开它,需要使用专业的 DICOM 查看软件,如 MicroDicom、RadiAnt 或 GIMP 等,来打开、查看和转换成 JPG 等格式。
- 专用软件:如 RadiAnt DICOM Viewer、MicroDicom 或 3DICOM Viewer 免费或付费 DICOM 浏览器。
- 图像处理软件:GIMP(支持多平台) 也能打开部分 DCM 文件。
- 在线工具:一些在线服务也提供 DCM 转 JPG 等功能,但可能受文件大小或数量限制。
转换 DCM 文件:使用上述专用软件,在 File 菜单下找到 Export 或 Save As 选项,将其转换为 JPEG、PNG 等常用格式。
库
简单汇总介绍几个 Java 和 Python 库:
dcm4che
广泛使用的开源 Java 库,GitHub,专为处理 DICOM 文件而设计,提供丰富的 API,支持读取、解析、修改、显示、存储、传输 DICOM 文件。
<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);
}
}
}
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 自动生成的接口文档:
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
参考