
062、锐化的"overshoot检测"——如何自动识别过度锐化产生的白边/黑边,基于边缘梯度的自适应锐化强度控制上周在调试一款车载环视拼接的夜视场景时,客户反馈说“车尾轮廓像被描了一圈荧光边”,尤其在路灯和车身交界处,白边亮得刺眼。我第一反应是去查ISP里的sharpen gain,结果发现增益已经压到0.8了,白边依然存在。后来把raw dump出来逐行看像素值,才意识到问题根本不在增益大小,而在锐化核作用在“已经饱和或接近饱和”的像素上时,overshoot被硬生生截断成了纯白,而暗侧的undershoot则被钳位成纯黑——这两条“伪边缘”在视觉上比真实边缘更抢眼。这就是锐化overshoot的典型症状:不是锐化不够,而是锐化过头。但“过头”这个词太模糊,工程上需要一个可量化的判据。我翻了不少论文,什么“局部方差阈值”“拉普拉斯能量和”,听着高大上,落地时要么计算量扛不住,要么对纹理密集区误判严重。最后回归到最朴素的边缘梯度分析,反而把问题解决了。先看overshoot是怎么产生的。标准unsharp mask流程是:原图减去模糊图得到高频分量,再乘上增益加回原图。当边缘两侧的灰度差很大时,高频分量在边缘处会出现一个“过冲”和“下冲”,也就是像素值先冲过目标灰度再回落。这个过冲的幅度理论上等于增益乘以边缘对比度,但实际像素值被钳位在[0, 255]区间内,于是过冲部分被截断成纯白,下冲部分被截断成纯黑。更隐蔽的是,即使没到钳位极限,过冲也会让边缘显得“发毛”,在显示器上就是一圈光晕。要自动检测这种overshoot,不能只看单个像素的灰度值,得看边缘两侧的梯度形态。正常边缘的梯度剖面是单调的——从暗到亮,梯度先增后减,峰值在边缘中心。