4. 图像对齐基本概念

做图像对齐这些年,我最大的体会是——坐标系是地基,变换模型是骨架,误差度量是尺子。地基没打牢,后面全是白费功夫。今天咱就掰开揉碎聊聊这三样东西。

坐标系统:从哪里来,到哪里去

图像对齐本质上就是找两个图像之间的坐标映射关系。但我见过不少人,上来就怼变换矩阵,结果连原点在哪儿都没搞清楚。

空间转录组的图像数据,通常有两种坐标系:

  • 像素坐标系——原点在图像左上角,x向右,y向下,单位是像素。H&E全切片扫描出来就是这个。
  • 物理坐标系——原点在组织切片某个固定点(比如载物台原点),单位是微米。空间转录组芯片给出的spot坐标就是这种。

你想想看,两种坐标系的原点位置、轴方向、单位都不一样。直接拿像素坐标和微米坐标算变换?会出大问题。

硬规则:做对齐之前,必须把两个图像的坐标系统一到一个参考系里。我个人习惯全部转成物理坐标系,以微米为单位。

坐标系类型 原点 轴方向 单位 常见来源
像素坐标系 图像左上角 (0, 0) x向右,y向下 像素 (px) H&E WSI 扫描文件
物理坐标系 切片固定参考点 x向右,y向上(一般符合右手系) 微米 (µm) 空间转录组芯片坐标

小技巧:把H&E图像的像素坐标转成物理坐标,需要知道扫描仪的像素分辨率(比如0.5 µm/px)。这个参数一般在WSI的元数据里能找到。

变换模型:选对工具少走弯路

坐标系统一了,接下来就是选变换模型。说白了,就是用什么样的数学函数把H&E图像映射到空间转录组图像上。

常见的变换模型就这几种:

  • 刚体变换(平移+旋转)。H&E切片和空间转录组切片如果只是放得位置不一样、角度不一样,用它就够了。我在一个项目中做过验证,刚体变换能搞定90%的简单对齐任务。
  • 相似变换(刚体+各向同性缩放)。如果扫描分辨率有细微偏差(比如两边的像素尺寸标称一样但实际差一点),相似变换比刚体更靠谱。
  • 仿射变换(平移+旋转+缩放+错切)。组织切片在制备过程中可能被拉扯变形,这时就需要仿射变换来修正各向异性的形变。我遇到过一个案例,H&E切片染色后缩水了一点点,仿射变换才拉得回来。
  • 非刚性变换(弹性/薄板样条/B-spline)。组织切片在RNA捕获、透化、染色过程中会发生局部非线性形变。说白了,如果你拿到的是相邻切片而不是同一张切片,非刚性变换基本是必需的。
变换类型 自由度 保持什么不变 适用场景
刚体 3 (tx, ty, θ) 距离、角度 同一切片,刚性放置偏差
相似 4 (tx, ty, θ, s) 角度 同一切片,加缩放修正
仿射 6 平行线 同一切片,有均匀拉伸
非刚性 几十到几千 拓扑关系(大致) 相邻切片,有局部非线性形变

注意事项:千万别一上来就用非刚性变换!我曾经在一个项目里直接用薄板样条,结果因为控制点选得不好,图像被扭曲得一塌糊涂,还不如用仿射。优先试试简单模型,不行再上复杂的。

下面这张图展示了从简单到复杂的变换模型家族关系:

变换模型家族树(从简单到复杂) 变换模型家族 线性变换 线性+缩放 非线性变换 刚体变换 仿射变换 相似变换 薄板样条 B-spline 弹性模型 实战选择建议 • 同一切片:先试刚体,不行再试相似/仿射 • 相邻切片:直接上非刚性,但控制点要足够密 • 如果总误差还是大,可能是坐标系没统一好

误差度量:对齐得好不好,拿数字说话

选完变换模型,算完参数,怎么知道对齐得怎么样?靠眼睛看当然也行,但做科研发论文,评审人会问你定量指标。

我常用的误差度量有这几类:

  • 基于特征点的误差——手动或自动标出H&E和空间转录组图像上对应的landmark(比如组织边缘交叉点、腺体中心),然后算这些点映射后的欧氏距离。最经典的就是均方根误差(RMSE)和平均绝对误差(MAE)。
  • 基于图像内容的误差——如果两幅图像是同一张切片(比如先荧光成像再H&E染色),可以比较图像强度差异,用归一化互相关(NCC)或互信息(MI)。
  • 基于下游任务的误差——比如对齐后,把H&E上的细胞核分割结果映射到空间转录组spot上,看基因表达和形态学特征的一致性。这虽然不像前两种那么直接,但更贴近实际应用。
误差指标 计算方式 取值范围 越小越好? 适用条件
RMSE √(∑(dᵢ²)/n) [0, +∞) 是 有对应landmark
MAE ∑|dᵢ|/n [0, +∞) 是 有对应landmark
NCC 协方差/(σ₁σ₂) [-1, 1] 越接近1越好 同一切片,灰度模式
互信息(MI) H(A)+H(B)-H(A,B) [0, +∞) 越大越好 不同模态图像

实战经验:我一般都会同时算RMSE和MAE。RMSE对大偏差点更敏感,MAE则反映整体平均水平。如果RMSE明显大于MAE,说明有那么一两个点对得特别差——赶紧回去看看是不是点标错了。


# Python: 计算两幅图对齐后的RMSE和MAE
import numpy as np

# pts_src: H&E图像上的landmark坐标 (N, 2)
# pts_dst: 空间转录组图像上的对应landmark坐标 (N, 2)

# 假设已经用变换矩阵M将pts_src映射到了pts_dst坐标系
pts_mapped = cv2.transform(pts_src.reshape(-1,1,2), M).reshape(-1,2)
diffs = np.linalg.norm(pts_mapped - pts_dst, axis=1)

rmse = np.sqrt(np.mean(diffs**2))
mae  = np.mean(diffs)

print(f"RMSE: {rmse:.2f} µm")
print(f"MAE:  {mae:.2f} µm")

小提醒:计算误差时一定要用物理坐标单位(微米),别用像素。同样的RMSE=5像素,在0.5µm/px的扫描分辨率下是2.5µm,但在1µm/px下就变成了5µm——完全是两码事。

避坑指南:我踩过的雷

好了,理论说得不少,我最后给大家分享几个实际项目中踩过的坑:

  1. 坐标系方向搞反。H&E图像像素坐标y轴向下,物理坐标y轴向上。我之前没注意,结果变换后图像上下颠倒,白忙活半天。
  2. 控制点分布不均。只选了组织中心附近的点做仿射变换,边缘区域完全没约束,结果边缘对得一塌糊涂。后来我改成均匀采样,甚至主动在边缘加几个点,效果好很多。
  3. 过度追求低RMSE。有一次我把RMSE优化到1微米以内,但看起来图像反而“皱巴巴”的——因为用了太多自由度的非刚性变换,过拟合了。对齐不是为了RMSE最小,而是为了生物学意义正确。

最后说一句。图像对齐没有银弹。多试试,多看看结果,比死磕一个模型要有效得多。