图像对齐基本概念:坐标系统、变换模型与误差度量
做图像对齐这些年,我最大的体会是——坐标系是地基,变换模型是骨架,误差度量是尺子。地基没打牢,后面全是白费功夫。今天咱就掰开揉碎聊聊这三样东西。
坐标系统:从哪里来,到哪里去
图像对齐本质上就是找两个图像之间的坐标映射关系。但我见过不少人,上来就怼变换矩阵,结果连原点在哪儿都没搞清楚。
空间转录组的图像数据,通常有两种坐标系:
- 像素坐标系——原点在图像左上角,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 | 平行线 | 同一切片,有均匀拉伸 |
| 非刚性 | 几十到几千 | 拓扑关系(大致) | 相邻切片,有局部非线性形变 |
注意事项:千万别一上来就用非刚性变换!我曾经在一个项目里直接用薄板样条,结果因为控制点选得不好,图像被扭曲得一塌糊涂,还不如用仿射。优先试试简单模型,不行再上复杂的。
下面这张图展示了从简单到复杂的变换模型家族关系:
误差度量:对齐得好不好,拿数字说话
选完变换模型,算完参数,怎么知道对齐得怎么样?靠眼睛看当然也行,但做科研发论文,评审人会问你定量指标。
我常用的误差度量有这几类:
- 基于特征点的误差——手动或自动标出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——完全是两码事。
避坑指南:我踩过的雷
好了,理论说得不少,我最后给大家分享几个实际项目中踩过的坑:
- 坐标系方向搞反。H&E图像像素坐标y轴向下,物理坐标y轴向上。我之前没注意,结果变换后图像上下颠倒,白忙活半天。
- 控制点分布不均。只选了组织中心附近的点做仿射变换,边缘区域完全没约束,结果边缘对得一塌糊涂。后来我改成均匀采样,甚至主动在边缘加几个点,效果好很多。
- 过度追求低RMSE。有一次我把RMSE优化到1微米以内,但看起来图像反而“皱巴巴”的——因为用了太多自由度的非刚性变换,过拟合了。对齐不是为了RMSE最小,而是为了生物学意义正确。
最后说一句。图像对齐没有银弹。多试试,多看看结果,比死磕一个模型要有效得多。