脚本如何批量转换医学影像格式

wen 实用脚本 6

脚本自动化实战指南

📖 目录导读

  1. 为什么需要批量转换医学影像格式?
  2. 主流医学影像格式解析(DICOM/NIfTI/PNG)
  3. 脚本转换的核心原理与工具选择
  4. Python脚本实战:DICOM转NIfTI批量处理
  5. Shell脚本方案:快速批量转换DICOM为PNG
  6. 常见问题与优化技巧
  7. 总结与最佳实践

为什么需要批量转换医学影像格式?

医学影像数据通常以DICOM格式存储,但深度学习模型或可视化工具往往需要NIfTI、PNG、JPEG等格式,手动逐张转换几百甚至上千个病例的影像数据,不仅效率低下,还容易出错。

脚本如何批量转换医学影像格式

关键场景包括:

  • 医院PACS系统导出数据后,需转为NIfTI用于AI训练
  • 科研人员需要将CT/MRI序列批量转换为PNG切片做标注
  • 跨平台展示时需将DICOM转为通用图像格式

选择脚本批量处理的优势:

  • 一次性处理数百GB数据
  • 保证转换参数一致性
  • 支持定时任务与自动化流水线

主流医学影像格式解析

格式 特点 典型应用
DICOM 元数据丰富,包含患者信息、扫描参数 影像科原始存储、PACS传输
NIfTI 单文件存储3D/4D体积,医学AI标准格式 深度学习分割、fMRI分析
PNG/JPEG 2D图像,压缩后体积小 可视化报告、Web展示
MHD/RAW 开源格式,常结合ITK使用 算法开发、跨平台传输

脚本转换的核心原理与工具选择

核心流程:

  1. 解析源格式:读取DICOM头部元数据、像素数据
  2. 重建体积:将2D切片堆叠为3D体积(针对CT/MRI)
  3. 格式编码:按目标格式规范进行数据重写
  4. 元数据映射:保留必要的DICOM标签到NIfTI头文件

推荐工具链:

工具 适用场景 优点
DCMTK DICOM解析与转换 工业级稳定,支持命令行批量
ITK-SNAP 可视化+批量转换 界面友好,支持NIfTI导出
Python+pydicom+nibabel 自定义脚本 灵活度高,可深度定制
dcm2niix DICOM→NIfTI专用 速度快,自动处理方向校正

Python脚本实战:DICOM转NIfTI批量处理

import os
import pydicom
import nibabel as nib
import numpy as np
from glob import glob
def dicom_to_nifti(input_dir, output_file):
    """
    批量将DICOM序列转换为NIfTI格式
    """
    # 获取所有DICOM文件
    dicom_files = sorted(glob(os.path.join(input_dir, "*.dcm")))
    if not dicom_files:
        print(f"未找到DICOM文件: {input_dir}")
        return
    # 读取第一个文件获取元数据
    ref_ds = pydicom.dcmread(dicom_files[0])
    # 构建3D像素数组
    slices = []
    for f in dicom_files:
        ds = pydicom.dcmread(f)
        slices.append(ds.pixel_array)
    volume = np.stack(slices, axis=-1)  # 假设切片轴为z
    # 提取仿射矩阵(位置信息)
    # 简化版:假设像素间距一致
    affine = np.eye(4)
    if hasattr(ref_ds, 'PixelSpacing'):
        affine[0,0] = ref_ds.PixelSpacing[0]
        affine[1,1] = ref_ds.PixelSpacing[1]
    if hasattr(ref_ds, 'SliceThickness'):
        affine[2,2] = ref_ds.SliceThickness
    # 创建NIfTI图像并保存
    nifti_img = nib.Nifti1Image(volume, affine)
    nib.save(nifti_img, output_file)
    print(f"已保存: {output_file}")
# 批量处理所有子文件夹
base_input = "C:/DICOM_patients/"
base_output = "C:/NIfTI_patients/"
for patient_folder in os.listdir(base_input):
    input_path = os.path.join(base_input, patient_folder)
    output_path = os.path.join(base_output, f"{patient_folder}.nii.gz")
    dicom_to_nifti(input_path, output_path)

运行效果
假设有100个病例文件夹,每个包含300张DICOM切片,脚本可在2-5分钟内完成全部转换。


Shell脚本方案:快速批量转换DICOM为PNG

适合需要在服务器端快速预览的场景,使用开源的dcm2png工具:

#!/bin/bash
# 批量转换DICOM到PNG
INPUT_DIR="/data/DICOM_raw"
OUTPUT_DIR="/data/PNG_slices"
# 确保输出目录存在
mkdir -p "$OUTPUT_DIR"
# 遍历所有子目录
for series_dir in "$INPUT_DIR"/*/; do
    series_name=$(basename "$series_dir")
    echo "处理: $series_name"
    # 使用dcm2png转换(需预先安装)
    /usr/local/bin/dcm2png "$series_dir" "$OUTPUT_DIR/$series_name"
    # 如果遇到错误,打印警告
    if [ $? -ne 0 ]; then
        echo "警告: $series_name 转换失败,跳过"
    fi
done
echo "所有转换完成!输出目录: $OUTPUT_DIR"

优化建议

  • 增加parallel命令实现多线程处理
  • 添加日志记录功能

常见问题与优化技巧

Q1: 转换后的NIfTI方向不对怎么办?

A: 使用dcm2niix时,添加-p y参数启用Philips方向校正;或用Python读取DICOM的ImageOrientationPatient标签手动重建仿射矩阵。

Q2: 内存不足如何处理大体积CT?

A: 采用分块读取策略:

chunk_size = 100  # 每次读取100张切片
for i in range(0, len(dicom_files), chunk_size):
    chunk = [pydicom.dcmread(f) for f in dicom_files[i:i+chunk_size]]
    # 处理并逐步写入

Q3: 脚本转换后患者ID丢失?

A: 在保存NIfTI时显式添加元数据:

nifti_img.header['descrip'] = ref_ds.PatientID.encode()

Q4: 如何监控转换进度?

A: 集成tqdm进度条库:

from tqdm import tqdm
for f in tqdm(dicom_files, desc="转换进度"):
    # 处理单张

总结与最佳实践

  1. 优先使用专业工具dcm2niix已处理90%的标准转换场景,无需重复造轮子
  2. 制定命名规范:使用PatientID_StudyDate_Modality.nii.gz格式
  3. 添加校验步骤:转换后检查文件大小、维度、像素范围
  4. 日志与错误处理:记录失败的病例,便于排查
  5. 并行化提升效率:利用multiprocessing库加速批量任务

推荐组合方案

  • 日常批量转换:dcm2niix + Shell脚本
  • 需要深度定制:pydicom + nibabel + Python
  • 生产环境集成:Docker容器化部署+定时任务

按此流程,您可在15分钟内搭建完成支持千级病例的影像格式自动转换流水线。

抱歉,评论功能暂时关闭!