1. 课程导入

医学影像组学(Radiomics)试图回答一个朴素但困难的问题:一张CT、MRI或PET图像里,除了医生肉眼能看到的形态学征象之外,是否还隐藏着可被计算机稳定量化、并与疾病生物学行为相关的信息?医学影像组学特征工程,正是把这个问题从"想法"变成"可计算数据"的关键环节。它指的是:在完成图像采集与感兴趣区(ROI)勾画之后,通过一系列可复现的数学变换与统计计算,从图像中提取出高维、定量的特征,并对这些特征进行筛选、变换与组合,最终形成可用于建模的特征矩阵的完整过程。

需要强调的是,特征工程并不等同于"调用一个特征提取库"。它至少包含四层含义:其一,定义特征——明确要计算哪些类别的特征(一阶统计、形状、纹理、小波、LoG等);其二,控制计算条件——如灰度离散化bin宽度、重采样体素间距、滤波器参数;其三,处理特征——缺失值、异常值、标准化、降维、稳定性筛选;其四,组织输出——形成"样本×特征"的矩阵及配套的特征字典。缺少任何一层,后续建模都可能建立在不可靠的数字之上。

特征工程在影像组学流程中的位置

一个典型的影像组学工作流可以概括为:图像采集 → 图像预处理 → ROI分割 → 特征工程 → 特征选择与降维 → 模型构建 → 验证与评估 → 临床落地。特征工程处在"分割"与"建模"之间,是承上启下的枢纽:向上,它依赖分割质量与预处理一致性;向下,它决定了模型可用的信息上限。若特征本身不稳定、不可复现或与标签无关,再复杂的分类器也无法挽救。

影像组学流程中的特征工程定位 图像采集 CT / MRI / PET 图像预处理 重采样 / 归一化 ROI 分割 手动 / 半自动 / 自动 特征工程(本节核心) 特征定义 → 参数控制 → 特征计算 → 特征处理 输出:样本 × 特征 矩阵 + 特征字典 (一阶 / 形状 / 纹理 / 小波 / LoG) 特征选择与降维 稳定性 / LASSO / mRMR 模型构建与验证 训练 / 内部验证 / 外部验证 验证结果反馈:特征稳定性不足 → 回到特征工程调整参数 关键认知: 特征工程决定了模型可用的信息上限;分割误差、参数不一致、特征不稳定,都会在此环节被放大并传递到最终模型。

特征工程的目标:从像素到可建模的数字

特征工程的目标不是"提取尽可能多的特征",而是构建一组可复现、有区分度、与临床问题相关的定量描述。具体可拆解为四个可检验的目标:

  • 可复现性:同一图像、同一ROI、同一参数下,不同时间、不同机器计算出的特征值应高度一致。通常用组内相关系数(ICC)衡量,ICC > 0.75 常被视为稳定性可接受。
  • 信息覆盖:特征应覆盖强度分布、形状、纹理、多尺度信息等不同维度,避免单一视角导致信息缺失。
  • 与标签相关:特征需在良恶性、基因突变、疗效等目标标签上表现出统计差异或预测能力。
  • 维度可控:原始特征常达数百至数千维,需通过筛选与降维控制过拟合风险,使特征数远小于样本数。

课程路线图:30章如何组织

本课程围绕"从图像到特征矩阵"的完整链路展开,30章大致分为五个板块:基础与流程定位(第1–4章)建立概念框架与工具环境;图像预处理与分割(第5–9章)解决输入一致性;特征提取与计算(第10–18章)逐一展开一阶、形状、GLCM、GLRLM、GLSZM、GLDM、NGTDM及小波/LoG滤波特征;特征处理与选择(第19–24章)覆盖缺失值、标准化、ICC稳定性筛选、LASSO、mRMR与降维;建模、验证与落地(第25–30章)完成模型构建、内部/外部验证、报告规范与可复现工程化。

学习建议:每章都围绕一个可操作的对象展开。建议在本地准备一套公开数据(如TCIA的NSCLC-Radiomics或LIDC-IDRI子集),边学边算,把每章的特征矩阵逐步拼装起来,最终形成一份可复现的完整流程。

一个最小示例:从ROI到特征矩阵

为建立直观感受,假设我们有一个已勾画好的肺部结节ROI,体素间距已重采样为1×1×1 mm³,灰度离散化bin宽度设为25 HU。特征工程的第一步是计算一阶统计特征,例如:

# 示例:一阶特征计算(伪代码,参数为教学假设)
roi_voxels = image[roi_mask == 1]          # 提取ROI内体素
bins = np.arange(roi_voxels.min(), roi_voxels.max() + 25, 25)
hist, _ = np.histogram(roi_voxels, bins=bins)
p = hist / hist.sum()                       # 归一化直方图

mean_intensity = np.mean(roi_voxels)        # 均值
entropy = -np.sum(p * np.log2(p + 1e-12))   # 熵
energy = np.sum(p ** 2)                     # 能量
# 输出示例(假设值):mean=42.3 HU, entropy=4.87, energy=0.031

上述数值仅为教学假设,用于说明"一个ROI如何变成几个数字"。当把一阶、形状、纹理等数百个特征按列拼接,就得到一行特征向量;对全部样本重复该过程,便得到样本×特征矩阵。这张矩阵,就是后续所有建模工作的起点。

常见误区:把特征提取当成"一键完成"。实际上,bin宽度、重采样间距、滤波器类型与尺度、是否各向同性等参数,都会显著改变特征值。参数不记录、不统一,特征矩阵就不可复现,后续结论也无从谈起。