⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议。
Skip to content

5.4 图像增强与恢复

这一节解决什么问题

这一节回答的是:增强、增强到什么程度、以及恢复性处理该不该做,应该依据什么来判断。

为什么它不等同于预处理

预处理默认输入图像已经可以被稳定标准化,但真实数据经常不满足这个前提:

  • 训练数据量少,模型容易过拟合;
  • 图像局部对比度弱,小病灶不够显眼;
  • 噪声、偏场或伪影会同时影响判读与建模。

于是就出现了两类不同需求:

  1. 数据增强:在训练阶段制造合理变化,扩大模型见过的数据分布;
  2. 图像增强 / 恢复:直接改善图像可见性,或补偿退化带来的影响。

为什么需要

可以把它们分成两个方向:

方向直接目标典型收益
数据增强扩大训练分布提高泛化、缓解过拟合
图像增强 / 恢复改善可见性或修复退化提升对比度、降低干扰、辅助观察

医学影像里的底线约束是:变化必须符合医学合理性。不能把病灶“增强没了”,也不能凭空制造误导性结构。


核心方法

这一节先抓住 4 个关键点。

  • 增强不是越猛越好,而是越接近真实采集波动越好。
  • 恢复不是让图更好看,而是让目标结构更可判读。

2. 变化必须贴近真实采集波动

小角度旋转、轻微噪声、有限对比度变化往往合理;大角度几何扭曲、夸张亮度变化则可能破坏解剖关系或病灶形态。

  • 对 CT 做小角度旋转、轻微噪声扰动,通常合理;
  • 对胸片做过大的几何形变,可能会破坏解剖关系;
  • 对 X 光做 CLAHE,重点不是把图变亮,而是让边缘和局部结构更清楚。

4. 只保留少量、可解释的操作

相比堆很多强变换,更好的做法通常是先保留少数可以解释的增强,再通过验证集或下游任务结果确认它们是否真的有帮助。


典型案例

场景 1:训练阶段的数据增强

  • 痛点:样本少、中心差异大、模型容易记住训练集细节。
  • 典型操作:小角度旋转、平移、缩放、轻度噪声、对比度扰动、弹性变形。
  • 本地源码src/ch05/medical_image_augmentation/main.pysrc/ch05/medical_image_augmentation/simple_augmentation.py

场景 2:X 光或低对比度图像的可见性增强

  • 痛点:边界和纹理不清楚,人工判读和模型都容易忽略细节。
  • 典型方法:CLAHE。
  • 本地源码src/ch05/clahe_enhancement/main.py

场景 3:恢复性处理

  • 用途:减少偏场、非均匀照明或局部退化的影响。
  • 相关源码src/ch05/visualize_bias_field/main.pysrc/ch05/n4itk_bias_correction/main.py

最小流程

无论做训练增强还是图像恢复,都可以先从下面这个最小闭环开始:

  1. 先明确目标:是为了训练鲁棒性,还是为了改善原图可见性。
  2. 限定医学约束:哪些结构不能变形过度,哪些强度关系不能破坏。
  3. 从少量、可解释的变换开始:先小规模验证,再逐步扩展。
  4. 同时看视觉结果和定量指标:例如对比度、熵、边缘强度、Dice 变化。
  5. 把完整实现留给脚本和附录:正文只解释判断原则与关键片段。

片段代码

正文只保留帮助理解的短片段;完整实现、参数扫描和可视化请看 src/ch05/ 下脚本。

1. 一个最小的几何增强片段

python
from skimage.transform import rotate


def small_rotation(image, angle=5):
    return rotate(image, angle, preserve_range=True)

2. 一个最小的强度扰动片段

python
import numpy as np


def adjust_contrast(image, factor=1.1):
    mean = np.mean(image)
    return (image - mean) * factor + mean

3. CLAHE 的关键调用

python
import cv2


def run_clahe(image, clip_limit=2.0, tile_grid_size=(8, 8)):
    clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=tile_grid_size)
    return clahe.apply(image)

4. 先做这几项最小检查

  • 增强后器官和病灶形态是否还符合解剖常识;
  • image 与 mask 是否仍同步;
  • 增强是否真的提升验证集,而不是只提升训练集;
  • 恢复后的图像是否更利于判读,而不是只更“亮”或更“锐”。

代码实验入口

正文不再承接长命令、完整日志和大段输出,这些内容统一迁移到:

这样主线章节只保留“什么时候该用增强 / 恢复、为什么这样用”的判断框架,而把可运行细节放进专门的实践入口。


延伸实践

  1. 先固定一套保守增强:小角度旋转、轻度对比度扰动、少量噪声,观察下游指标变化。
  2. 比较增强前后训练:不要只看训练集分数,更要看验证集与外部数据。
  3. 做一次 CLAHE 参数扫描:比较不同 clip_limittile_grid_size 对边缘和噪声的影响。
  4. 把增强与分割 / 分类任务联动:同样的增强,在分类上有效,不代表在分割上也有效。
  5. 继续阅读本地源码:重点看增强是否符合解剖常识,而不是只看图像变化是否明显。

代码实验 / 实践附录

运行命令、环境依赖、完整输出和可运行 demo 已统一迁移到 5.6 代码实验 / 实践附录src/ch05/README.md

当你把“增强”和“恢复”分清楚之后,就能更有针对性地决定:什么时候该扩增训练分布,什么时候该改善原始图像质量。

Released under the MIT License.