树枝逆光、黑字白底和建筑轮廓处常出现红、蓝或紫色细边。它有时来自饱和溢出、Debayer 或锐化,但镜头色差是另一类根源:玻璃对不同波长的折射率不同,红、绿、蓝光无法完全遵循同一条成像路径。
CAC(Chromatic Aberration Correction,色差校正)不是 CCM。CCM 改变一个像素的颜色数值,CAC 主要移动或重采样不同颜色通道,让同一物体边缘重新落到相同空间位置。
横向色差:通道倍率不一致
横向色差也叫倍率色差。把绿通道作为参考,红、蓝通道可使用略有差异的径向模型:
在光心 附近,各通道位移接近零;越靠近画面边缘,同样微小的倍率差会转化为越来越明显的像素偏移。
紫边为什么越靠近角落越明显
横向色差让红、绿、蓝通道具有略不同的径向放大率。中心几乎重合,边缘位移逐渐放大。
示意把绿通道作为几何参考。真实位移还随焦距、对焦位置、波长和镜头结构变化。
紫边之所以显眼,是因为高反差边缘对亚像素错位非常敏感。平坦区域即使存在相同几何偏差,也缺少可以观察的结构。
CAC 怎样进行反向补偿
若标定测得红通道相对绿通道向外偏移,校正就从输出红通道位置反查稍微靠内的输入坐标。与 LDC 一样,工程实现应采用逆向映射,确保每个输出像素都有定义。
怎样把通道边缘重新对齐
用相反的通道径向缩放抵消测得色差。目标不是让系数看起来漂亮,而是让全视场残差最小。
单一系数无法拟合所有镜头。工程上常用多项式或二维网格分别描述红、蓝相对绿通道的位移。
只让最外圈对齐还不够。参数要在完整像高范围最小化残差,并约束曲线平滑、单调和可逆。镜头的误差若并非纯径向对称,二维位移网格往往比少量多项式更准确。
一个极简的通道半径校正如下:
def channel_radius(radius, c1, c2): r2 = radius * radius return radius * (1 + c1 * r2 + c2 * r2 * r2)
# 输出位置反查输入通道位置source_r = channel_radius(output_r, red_c1, red_c2)source_b = channel_radius(output_r, blue_c1, blue_c2)真实实现还需要光心、非方形像素、图像宽高归一化和插值边界策略。
横向与纵向色差必须分开
纵向色差来自不同波长的最佳焦平面不一致:对焦在绿色时,红色可能在焦点前,蓝色在焦点后。它在中心也可能存在,常表现为焦外区域的洋红或绿色光晕。
横向色差和纵向色差不是同一种问题
横向色差改变通道的空间倍率;纵向色差让不同波长的最佳焦平面不同。二者需要不同模型。
CAC 的通道缩放主要处理横向色差。纵向色差本质是波长相关的离焦,仅靠二维 warp 无法完全恢复。
二维通道 warp 擅长处理横向位移,却无法把已经离焦扩散的通道重新变清晰。纵向色差更依赖镜头光学设计、光圈、对焦距离,以及针对性的去卷积或边缘抑制;校正能力有限时,应避免承诺“彻底消除紫边”。
为什么不能见到紫色就做去饱和
基于颜色阈值的 defringe 会寻找高亮边缘附近的紫色并降低色度。它可以掩盖残余色边,却也可能误伤紫色衣服、霓虹灯或产品颜色。几何 CAC 依据镜头模型恢复通道对齐,物理解释更明确;defringe 更适合作为残差处理,而不是替代标定。
还要排除其他来源:
- 高光饱和导致某个 Bayer 通道提前 clipping;
- Debayer 在高频斜边产生 false color;
- 过强锐化放大原本很弱的通道错位;
- 色域裁剪让高饱和边缘发生色相偏移;
- 镜头炫光产生大范围彩色雾状结构。
这些问题需要不同测试图和不同修复方法。
CAC 与 LDC 的关系
LDC 描述所有通道共享的几何畸变;CAC 描述红、蓝相对参考通道的额外偏移。如果先独立拟合 LDC,再用另一套数据拟合 CAC,两套参数可能互相吸收误差,最终中心正常而边缘残差不稳定。
LDC 与 CAC 为什么适合联合标定
LDC 修正共享几何形变,CAC 修正通道间相对形变。分开拟合时,两套模型可能互相吸收误差。
残差数值是机制示意。无论参数如何存储,部署时都可把 LDC 与通道偏移合成一张 warp 网格,减少重复插值。
联合标定可以把绿通道或亮度结构用于共享几何,再估计红、蓝残差。部署时,三通道各自的最终逆向坐标可以与 LDC、缩放和 EIS 合成一次 warp,减少带宽和重复插值。
在 Bayer 域还是 RGB 域处理
Bayer 域保留原始通道观测,但每种颜色只占稀疏采样位置。移动单个 CFA 通道会破坏规则采样几何,需要与 Debayer 联合设计。RGB 域拥有完整三通道平面,通道 warp 更直接,因此通用 ISP 常在 Debayer 之后执行 CAC。
高端管线可能把镜头模型带入 edge-aware Debayer,联合考虑颜色采样位置;这不是简单交换两个模块就能得到的效果。无论在哪个域,校正参数必须与图像裁切、binning、数字变焦和传感器读出模式使用同一坐标系。
标定与验证
标定目标需要提供全视场、高对比且可稳定定位的边缘。常见做法是分别检测各通道特征位置,拟合红、蓝相对绿的径向或二维位移。测试必须覆盖变焦、对焦、温度、OIS 状态和不同读出模式。
验证清单:
- 中心到四角的径向与切向高反差边缘;
- 红、绿、蓝边缘位置残差,而非只看综合色图;
- 亚像素斜线、细字与星点,检查插值损失;
- 真正的紫色物体,检查 defringe 是否误伤;
- 不同光圈与对焦距离,区分纵向色差;
- 视频变焦、对焦和参数切换时是否跳变;
- 校正后边缘是否因二次锐化重新出现彩边。
最容易踩的坑
- 把 CAC 当成调颜色的矩阵或饱和度操作;
- 用去紫阈值掩盖全部色差,误伤真实颜色;
- 只在画面角落拟合,忽略中间像高残差;
- 混淆横向位移与纵向离焦;
- LDC 和 CAC 使用不同光心或归一化方式;
- 分多次 warp,累积模糊、ringing 与带宽;
- 忽略焦距、对焦、温度和读出裁切对参数的影响。
CAC 的关键判断是:眼前的彩边究竟是不是“不同波长落在不同空间位置”。若是横向色差,就用可靠标定让通道几何重新对齐;若是纵向离焦或其他 ISP 伪色,就必须换用对应模型。先识别机制,再选择校正,才能避免用去饱和把问题和真实颜色一起抹掉。