2. 病理图像颜色与视觉特征

在WSI(全切片图像)分割与定量分析中,颜色是最直接、最廉价、也最容易被忽视的特征来源。同一块组织切片,在不同扫描仪、不同染色批次、不同试剂批次下,会呈现出明显不同的色调与饱和度。如果直接把RGB像素值当作特征输入分割模型,模型学到的往往是“某台扫描仪的成像风格”,而不是“组织本身的病理属性”。因此,理解H&E染色的物理化学原理、掌握颜色空间的表达方式、并能够把颜色归一化和颜色反卷积用对,是后续所有分割与定量任务的基础。

一、H&E染色的光学原理

H&E是苏木素(Hematoxylin)与伊红(Eosin)的联合染色。苏木素经氧化后形成苏木红,再与铝离子结合成带正电的阳离子染料,与细胞核中带负电的DNA/RNA磷酸基团结合,把细胞核染成蓝紫色;伊红是带负电的酸性染料,与细胞质中带正电的蛋白质结合,把细胞质、胶原纤维、红细胞等染成粉红色至红色。两者在可见光波段具有不同的吸收峰:苏木素-铝复合物在约550–620 nm(偏黄绿光)吸收较强,伊红在约510–530 nm(偏绿光)吸收较强。

从成像角度看,白光穿过染色组织时,各波长光被按Beer-Lambert定律吸收:I(λ) = I₀(λ)·exp(−A(λ)),其中A为吸光度。相机传感器把透射光积分成RGB三通道,于是每个像素的颜色本质上是“苏木素浓度 + 伊红浓度 + 残余未染色背景”三者在RGB空间中的线性混合结果。这正是颜色反卷积能够分离两种染色的理论依据。

二、三种颜色空间的表达差异

RGB是最原始的采集空间,三通道高度相关,光照变化会同时改变三个分量,不利于颜色恒常性。HSV把颜色拆成色调H、饱和度S、明度V,其中H对染色色调差异敏感,V对光照强度敏感,适合做染色区域的粗筛。Lab空间则把亮度L与色度a、b分离,a轴对应绿-红,b轴对应蓝-黄,欧氏距离近似人眼感知差异,常用于颜色归一化后的相似性度量与聚类。

在工程实践中,一个常见做法是:用HSV的H通道快速定位苏木素富集的核区域,用Lab的a、b通道区分伊红富集的间质与背景,再把RGB原始值送入反卷积模块。三者不是互斥关系,而是分工关系。

H&E染色颜色处理链路:从光学吸收到染色通道分离 白光光源 I₀(λ) 400–700 nm 连续谱 染色组织切片 苏木素:核,蓝紫 伊红:质/间质,粉红 透射 RGB相机采集 I(λ)=I₀·exp(−A) 积分成 R,G,B RGB 原始空间 三通道强相关 受光照/染色批次影响大 → 反卷积输入 HSV 空间 H:色调,区分核/质 S:饱和度,染色强度 V:明度,光照变化 Lab 空间 L:亮度,独立于色度 a:绿−红,b:蓝−黄 ΔE 近似感知差异 颜色归一化 Reinhard:Lab均值/方差 Macenko:OD空间SVD → 统一到参考模板 颜色反卷积 OD = −log₁₀(I/I₀) OD = C · M(M为染色矩阵) C = OD · M⁻¹ → 苏木素/伊红浓度图 苏木素通道 核分割/计数 核形态定量 伊红通道 间质/胞质分割 腺体轮廓提取 关键约定:吸光度 OD 越大表示该染色浓度越高;反卷积矩阵 M 的列向量为苏木素、伊红在 RGB 下的单位吸光方向

三、颜色归一化的两种主流方法

Reinhard方法基于Lab空间统计迁移。设参考图像在Lab空间的均值为(μ_L, μ_a, μ_b)、标准差为(σ_L, σ_a, σ_b),待归一化图像对应统计量为(μ'_L, μ'_a, μ'_b)与(σ'_L, σ'_a, σ'_b),则逐像素执行:L* = (L − μ'_L)/σ'_L · σ_L + μ_L,a、b通道同理。该方法实现简单、速度快,适合染色风格整体偏移不大的场景;但它假设颜色分布近似高斯,对局部染色不均或强背景区域容易过校正。

Macenko方法在光密度(OD)空间操作。先把RGB转为OD:OD = −log₁₀((I+1)/255),再剔除OD值过低的背景像素,对剩余OD向量做SVD分解,取前两个主成分平面,把投影角度按1%和99%分位数截断,得到两个稳定的染色方向向量,构成2×3的染色矩阵M。对每个像素求解C = OD · M⁻¹,即得到苏木素与伊红的浓度。Macenko对染色批次差异更鲁棒,是当前WSI预处理中最常用的方案之一。

归一化的参考图像应选择染色均匀、背景干净、包含典型核与间质的切片,且一旦确定就固定下来,不要在不同批次间随意更换,否则定量指标会失去可比性。

四、颜色反卷积的实操要点

颜色反卷积的核心是求解染色矩阵M。OpenCV等库提供了cv2.color_deconvolution,但更常见的做法是先用Macenko估计M,再手动做矩阵求逆。以下是一个可复用的Python片段,展示从RGB到苏木素、伊红浓度图的完整过程:

import numpy as np

def rgb_to_od(img):
    # img: float32, 范围[0,255]
    img = np.clip(img, 1, 255)
    return -np.log10(img / 255.0)

def deconvolve(od, M):
    # M: 2x3 染色矩阵,行向量为苏木素、伊红单位OD方向
    # od: HxWx3
    C = od.reshape(-1, 3) @ np.linalg.pinv(M.T)
    return C.reshape(od.shape[0], od.shape[1], 2)

# 示例:Macenko估计得到的染色矩阵(仅作演示,实际应由数据估计)
M = np.array([[0.65, 0.70, 0.29],
              [0.07, 0.99, 0.11]])
od = rgb_to_od(img.astype(np.float32))
he = deconvolve(od, M)
hematoxylin = he[:, :, 0]   # 苏木素浓度
eosin       = he[:, :, 1]   # 伊红浓度

得到两个浓度通道后,通常还要做一次对比度拉伸或分位数裁剪(例如把1%和99%分位映射到0–255),再送入分割网络。判断反卷积是否合理,可以观察三点:苏木素通道中细胞核应呈高亮、间质应接近零;伊红通道中胞质与胶原应高亮、核区应偏暗;两通道叠加后不应出现大面积负值或饱和溢出。

五、常见问题与排查

现象可能原因处理建议
反卷积后核通道出现大量噪点背景区域OD过低,被误当作染色先做OD阈值掩膜,仅对前景像素反卷积
归一化后整体偏蓝或偏粉参考图像选择不当或统计量计算含背景剔除背景像素后重新统计μ、σ
不同批次间定量指标波动大染色矩阵M未随批次更新每批次用少量切片重新估计M并记录
伊红通道中核区仍有残留M的两列方向夹角过小,分离度不足检查SVD主成分,必要时人工校正M

需要强调的是,颜色归一化和反卷积不是“一次性配置”,而是需要随扫描仪、染色协议和试剂批次持续维护的环节。建议在WSI预处理流水线中固定记录每批次的参考图像、染色矩阵M和归一化统计量,这样当后续分割结果出现漂移时,可以快速定位是颜色环节还是模型环节的问题。