图像预处理

本节介绍如何使用 HABIT 进行医学图像预处理。

概述

图像预处理是生境分析的第一步,目的是提高图像质量,统一图像格式和空间分辨率,为后续的生境分割和特征提取做好准备。

HABIT 提供了丰富的预处理方法,包括:

  • DICOM 转换: 将 DICOM 格式转换为 NIfTI 格式

  • N4 偏置场校正: 校正 MRI 图像的偏置场

  • 重采样: 统一图像的空间分辨率

  • 配准: 将多时相图像配准到同一空间

  • 标准化: 对图像强度进行标准化处理

  • 自适应直方图均衡化: 增强图像对比度

CLI 使用方法

基本语法:

habit preprocess --config <config_file>

参数说明:

  • --config, -c: 配置文件路径(必需)

使用示例:

habit preprocess --config ./demo_data/config_preprocessing.yaml

输出:

预处理后的图像将保存在配置文件中指定的输出目录。

Python API 使用方法

基本用法:

from habit.core.common.service_configurator import ServiceConfigurator
from habit.core.preprocessing.config_schemas import PreprocessingConfig

# 加载配置
config = PreprocessingConfig.from_file('./config_preprocessing.yaml')

# 创建配置器
configurator = ServiceConfigurator(config=config)

# 创建预处理器
processor = configurator.create_batch_processor()

# 运行预处理
processor.process_batch()

详细示例:

import logging
from habit.core.common.service_configurator import ServiceConfigurator
from habit.core.preprocessing.config_schemas import PreprocessingConfig
from habit.utils.log_utils import setup_logger
from pathlib import Path

# 设置日志
output_dir = Path('./preprocessed')
output_dir.mkdir(parents=True, exist_ok=True)
logger = setup_logger(
    name='preprocessing',
    output_dir=output_dir,
    log_filename='preprocessing.log',
    level=logging.INFO
)

# 加载配置
config = PreprocessingConfig.from_file('./config_preprocessing.yaml')

# 创建配置器
configurator = ServiceConfigurator(config=config, logger=logger, output_dir=str(output_dir))

# 创建预处理器
processor = configurator.create_batch_processor()

# 运行预处理
logger.info("开始图像预处理")
processor.process_batch()
logger.info("预处理完成!")

YAML 配置详解

配置文件结构:

# 数据路径
data_dir: ./files_preprocessing.yaml
out_dir: ./preprocessed

# 预处理设置
Preprocessing:
  dcm2nii:
    images: [delay2, delay3, delay5]
    dcm2niix_path: ./dcm2niix.exe
    compress: true
    anonymize: true

  n4_correction:
    images: [delay2, delay3, delay5]
    num_fitting_levels: 4

  resample:
    images: [delay2, delay3, delay5]
    target_spacing: [1.0, 1.0, 1.0]

  registration:
    images: [delay2, delay3, delay5]
    fixed_image: delay2
    moving_images: [delay3, delay5]
    type_of_transform: SyNRA
    use_mask: false

  zscore_normalization:
    images: [delay2, delay3, delay5]
    only_inmask: false
    mask_key: mask

  adaptive_histogram_equalization:
    images: [delay2, delay3, delay5]
    alpha: 0.3
    beta: 0.3
    radius: 5

# 保存选项
save_options:
  save_intermediate: true
  intermediate_steps: [dcm2nii, n4_correction, resample]

# 通用设置
processes: 2
random_state: 42

字段说明:

data_dir: 数据目录路径,可以是文件夹或 YAML 配置文件

out_dir: 输出目录路径

Preprocessing: 预处理设置

  • dcm2nii: DICOM 转换设置 - images: 要转换的图像列表 - dcm2niix_path: dcm2niix 可执行文件路径 - compress: 是否压缩输出文件(true/false) - anonymize: 是否匿名化(true/false)

  • n4_correction: N4 偏置场校正设置 - images: 要校正的图像列表 - num_fitting_levels: 拟合级别数(2-4)

  • resample: 重采样设置 - images: 要重采样的图像列表 - target_spacing: 目标间距 [x, y, z](单位:mm)

  • registration: 配准设置 - images: 所有涉及的图像列表 - fixed_image: 固定图像(参考图像) - moving_images: 要配准的图像列表 - type_of_transform: 变换类型(SyNRA、SyN、Affine 等) - use_mask: 是否使用掩码引导配准(true/false) - mask_key: 掩码键名(当 use_mask 为 true 时)

  • zscore_normalization: Z-Score 标准化设置 - images: 要标准化的图像列表 - only_inmask: 是否仅在掩码内计算统计量(true/false) - mask_key: 掩码键名(当 only_inmask 为 true 时)

  • adaptive_histogram_equalization: 自适应直方图均衡化设置 - images: 要均衡化的图像列表 - alpha: 全局对比度增强因子 [0, 1] - beta: 局部对比度增强因子 [0, 1] - radius: 局部窗口半径(像素)

save_options: 保存选项

  • save_intermediate: 是否保存中间结果(true/false)

  • intermediate_steps: 要保存的中间步骤列表(空列表表示保存所有步骤)

processes: 并行进程数

random_state: 随机种子

预处理方法详解

DICOM 转换 (dcm2nii)

将 DICOM 格式转换为 NIfTI 格式。

适用场景: - 原始数据为 DICOM 格式 - 需要将 DICOM 转换为 NIfTI 格式

参数说明: - dcm2niix_path: dcm2niix 可执行文件路径 - compress: 是否压缩输出文件 - anonymize: 是否匿名化(移除患者信息)

注意事项: - 确保 dcm2niix 可执行文件有执行权限 - 对于大量 DICOM 文件,转换可能需要较长时间

N4 偏置场校正 (n4_correction)

校正 MRI 图像的偏置场,改善图像质量。

适用场景: - MRI 图像存在偏置场不均匀 - 需要改善图像质量

参数说明: - num_fitting_levels: 拟合级别数(2-4,级别越高,校正越精细,但计算时间越长)

注意事项: - 主要用于 MRI 图像 - 拟合级别数越高,计算时间越长

重采样 (resample)

统一图像的空间分辨率。

适用场景: - 不同图像的空间分辨率不一致 - 需要统一图像分辨率

参数说明: - target_spacing: 目标间距 [x, y, z](单位:mm)

注意事项: - 重采样会改变图像的物理尺寸 - 选择合适的目标间距,避免过度重采样

配准 (registration)

将多时相图像配准到同一空间。

适用场景: - 多时相图像存在空间不匹配 - 需要将图像配准到同一空间

参数说明: - fixed_image: 固定图像(参考图像) - moving_images: 要配准的图像列表 - type_of_transform: 变换类型

  • SyNRA: 对称归一化互相关(推荐)

  • SyN: 对称归一化

  • Affine: 仿射变换

  • use_mask: 是否使用掩码引导配准

  • mask_key: 掩码键名

注意事项: - 配准是一个计算密集型操作,可能需要较长时间 - 选择合适的变换类型,平衡精度和计算时间

Z-Score 标准化 (zscore_normalization)

将图像强度标准化为均值 0、标准差 1 的分布。

适用场景: - 需要统一图像强度分布 - 为机器学习准备数据

参数说明: - only_inmask: 是否仅在掩码内计算统计量 - mask_key: 掩码键名(当 only_inmask 为 true 时)

注意事项: - 标准化会改变图像的绝对强度值 - 对于仅掩码内标准化,确保掩码正确

自适应直方图均衡化 (adaptive_histogram_equalization)

增强图像对比度。

适用场景: - 图像对比度不足 - 需要增强图像细节

参数说明: - alpha: 全局对比度增强因子 [0, 1]

  • 0: 不进行全局对比度增强

  • 1: 完全进行全局对比度增强

  • beta: 局部对比度增强因子 [0, 1] - 0: 不进行局对比度增强 - 1: 完全进行局对比度增强

  • radius: 局部窗口半径(像素)

注意事项: - 增强因子不宜过大,避免过度增强 - 半径值不宜过大,避免平滑细节

自定义预处理器

HABIT 支持自定义预处理器,您可以添加自己的预处理方法。

步骤 1: 创建自定义预处理器

从模板文件开始:

from habit.core.preprocessing.preprocessor_factory import PreprocessorFactory
from habit.core.preprocessing.base_preprocessor import BasePreprocessor

@PreprocessorFactory.register("my_preprocessor")
class MyPreprocessor(BasePreprocessor):
    def __init__(self, keys, allow_missing_keys=False, **kwargs):
        super().__init__(keys=keys, allow_missing_keys=allow_missing_keys)
        # 初始化参数
        self.param1 = kwargs.get('param1', default_value)
        self.param2 = kwargs.get('param2', default_value)

    def __call__(self, data):
        self._check_keys(data)
        for key in self.keys:
            data[key] = self._process_item(data[key])
        return data

    def _process_item(self, item):
        # 实现您的预处理逻辑
        return processed_item

步骤 2: 在配置文件中使用

Preprocessing:
  my_preprocessor:
    images: [T1, T2]
    param1: value1
    param2: value2

步骤 3: 运行预处理

habit preprocess --config config_with_custom_preprocessor.yaml

实际示例

示例 1: 基本预处理

基于 demo_data/config_preprocessing.yaml

data_dir: ./files_preprocessing.yaml
out_dir: ./preprocessed

Preprocessing:
  dcm2nii:
    images: [delay2, delay3, delay5]
    dcm2niix_path: ./dcm2niix.exe
    compress: true
    anonymize: true

  resample:
    images: [delay2, delay3, delay5]
    target_spacing: [1.0, 1.0, 1.0]

  zscore_normalization:
    images: [delay2, delay3, delay5]
    only_inmask: false

processes: 2
random_state: 42

示例 2: 完整预处理流程

包含多个预处理步骤:

data_dir: ./files_preprocessing.yaml
out_dir: ./preprocessed

Preprocessing:
  dcm2nii:
    images: [delay2, delay3, delay5]
    dcm2niix_path: ./dcm2niix.exe
    compress: true

  n4_correction:
    images: [delay2, delay3, delay5]
    num_fitting_levels: 4

  resample:
    images: [delay2, delay3, delay5]
    target_spacing: [1.0, 1.0, 1.0]

  registration:
    images: [delay2, delay3, delay5]
    fixed_image: delay2
    moving_images: [delay3, delay5]
    type_of_transform: SyNRA
    use_mask: false

  zscore_normalization:
    images: [delay2, delay3, delay5]
    only_inmask: false

save_options:
  save_intermediate: true
  intermediate_steps: [dcm2nii, n4_correction, resample, registration]

processes: 4
random_state: 42

输出结构

预处理后的输出结构:

preprocessed/
├── dcm2nii_01/              # DICOM 转换结果
│   ├── images/
│   │   ├── subj001/
│   │   │   ├── delay2/
│   │   │   │   └── delay2.nii.gz
│   │   │   ├── delay3/
│   │   │   │   └── delay3.nii.gz
│   │   │   └── delay5/
│   │   │       └── delay5.nii.gz
│   │   └── subj002/
│   │       └── ...
│   └── masks/
│       └── ...
├── n4_correction_02/          # N4 校正结果
├── resample_03/               # 重采样结果
├── registration_04/             # 配准结果
└── processed_images/           # 最终结果(总是保存)
    ├── images/
    │   ├── subj001/
    │   │   ├── delay2/
    │   │   │   └── delay2.nii.gz
    │   │   ├── delay3/
    │   │   │   └── delay3.nii.gz
    │   │   └── delay5/
    │   │       └── delay5.nii.gz
    │   └── subj002/
    │       └── ...
    └── masks/
        └── ...

常见问题

Q1: 预处理失败怎么办?

A: 检查以下几点:

  • 确认配置文件路径正确。

  • 确认数据文件存在且格式正确。

  • 检查日志文件了解详细错误信息。

  • 确保有足够的磁盘空间。

Q2: 如何选择预处理步骤?

A: 根据数据特点选择:

  • DICOM 数据:需要 dcm2nii。

  • MRI 图像:建议 N4 校正。

  • 多时相图像:需要配准。

  • 不同分辨率:需要重采样。

  • 机器学习:建议标准化。

Q3: 预处理时间太长怎么办?

A: 可以尝试:

  • 增加并行进程数(processes 参数)。

  • 跳过不必要的预处理步骤。

  • 使用更简单的变换类型(如 Affine 而非 SyNRA)。

  • 分批处理数据。

Q4: 如何验证预处理结果?

A: 使用医学图像查看器(如 ITK-SNAP)检查:

  • 图像质量是否改善。

  • 空间对齐是否正确。

  • 强度分布是否合理。

  • 掩码是否正确。

Q5: 中间结果占用太多空间怎么办?

A: 可以:

  • 设置 save_intermediate: false 只保存最终结果。

  • 定期清理中间结果目录。

  • 使用压缩格式(.nii.gz)。

下一步

图像预处理完成后,您可以: