5.4 图像增强与恢复
这一节解决什么问题
这一节回答的是:增强、增强到什么程度、以及恢复性处理该不该做,应该依据什么来判断。
为什么它不等同于预处理
预处理默认输入图像已经可以被稳定标准化,但真实数据经常不满足这个前提:
- 训练数据量少,模型容易过拟合;
- 图像局部对比度弱,小病灶不够显眼;
- 噪声、偏场或伪影会同时影响判读与建模。
于是就出现了两类不同需求:
- 数据增强:在训练阶段制造合理变化,扩大模型见过的数据分布;
- 图像增强 / 恢复:直接改善图像可见性,或补偿退化带来的影响。
为什么需要
可以把它们分成两个方向:
| 方向 | 直接目标 | 典型收益 |
|---|---|---|
| 数据增强 | 扩大训练分布 | 提高泛化、缓解过拟合 |
| 图像增强 / 恢复 | 改善可见性或修复退化 | 提升对比度、降低干扰、辅助观察 |
医学影像里的底线约束是:变化必须符合医学合理性。不能把病灶“增强没了”,也不能凭空制造误导性结构。
核心方法
这一节先抓住 4 个关键点。
- 增强不是越猛越好,而是越接近真实采集波动越好。
- 恢复不是让图更好看,而是让目标结构更可判读。
2. 变化必须贴近真实采集波动
小角度旋转、轻微噪声、有限对比度变化往往合理;大角度几何扭曲、夸张亮度变化则可能破坏解剖关系或病灶形态。
- 对 CT 做小角度旋转、轻微噪声扰动,通常合理;
- 对胸片做过大的几何形变,可能会破坏解剖关系;
- 对 X 光做 CLAHE,重点不是把图变亮,而是让边缘和局部结构更清楚。
4. 只保留少量、可解释的操作
相比堆很多强变换,更好的做法通常是先保留少数可以解释的增强,再通过验证集或下游任务结果确认它们是否真的有帮助。
典型案例
场景 1:训练阶段的数据增强
- 痛点:样本少、中心差异大、模型容易记住训练集细节。
- 典型操作:小角度旋转、平移、缩放、轻度噪声、对比度扰动、弹性变形。
- 本地源码:
src/ch05/medical_image_augmentation/main.py、src/ch05/medical_image_augmentation/simple_augmentation.py。
场景 2:X 光或低对比度图像的可见性增强
- 痛点:边界和纹理不清楚,人工判读和模型都容易忽略细节。
- 典型方法:CLAHE。
- 本地源码:
src/ch05/clahe_enhancement/main.py。
场景 3:恢复性处理
- 用途:减少偏场、非均匀照明或局部退化的影响。
- 相关源码:
src/ch05/visualize_bias_field/main.py、src/ch05/n4itk_bias_correction/main.py。
最小流程
无论做训练增强还是图像恢复,都可以先从下面这个最小闭环开始:
- 先明确目标:是为了训练鲁棒性,还是为了改善原图可见性。
- 限定医学约束:哪些结构不能变形过度,哪些强度关系不能破坏。
- 从少量、可解释的变换开始:先小规模验证,再逐步扩展。
- 同时看视觉结果和定量指标:例如对比度、熵、边缘强度、Dice 变化。
- 把完整实现留给脚本和附录:正文只解释判断原则与关键片段。
片段代码
正文只保留帮助理解的短片段;完整实现、参数扫描和可视化请看 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 + mean3. 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 是否仍同步;
- 增强是否真的提升验证集,而不是只提升训练集;
- 恢复后的图像是否更利于判读,而不是只更“亮”或更“锐”。
代码实验入口
正文不再承接长命令、完整日志和大段输出,这些内容统一迁移到:
- 5.6 代码实验 / 实践附录
src/ch05/README.md- 各实验目录下的
README.md、output/、outputs/
这样主线章节只保留“什么时候该用增强 / 恢复、为什么这样用”的判断框架,而把可运行细节放进专门的实践入口。
延伸实践
- 先固定一套保守增强:小角度旋转、轻度对比度扰动、少量噪声,观察下游指标变化。
- 比较增强前后训练:不要只看训练集分数,更要看验证集与外部数据。
- 做一次 CLAHE 参数扫描:比较不同
clip_limit与tile_grid_size对边缘和噪声的影响。 - 把增强与分割 / 分类任务联动:同样的增强,在分类上有效,不代表在分割上也有效。
- 继续阅读本地源码:重点看增强是否符合解剖常识,而不是只看图像变化是否明显。
代码实验 / 实践附录
运行命令、环境依赖、完整输出和可运行 demo 已统一迁移到 5.6 代码实验 / 实践附录 与 src/ch05/README.md。
当你把“增强”和“恢复”分清楚之后,就能更有针对性地决定:什么时候该扩增训练分布,什么时候该改善原始图像质量。