
1. 先搞清楚YUV Sharpen到底在干什么1.1 为什么锐化不能只盯着亮度和对比度很多刚接触海思ISP调试的工程师拿到一块新的Sensor板子点亮出图之后第一反应就是调亮度、调饱和度、调对比度。等画面颜色看起来正常了就急着交付。结果客户一看监控画面第一句话永远是“图像好软”“看不清车牌”“人脸边缘糊成一团”。这时候你才意识到锐化是绕不过去的一环。锐化的本质是在图像已经存在的边缘位置做“对比度增强”。人的视觉系统对图像边缘的清晰度极其敏感一张图哪怕色偏一点点只要边缘足够干净利落主观清晰度评分都不会低。反过来如果色准很好但边缘发糊观感就是“雾蒙蒙的”“没对上焦”。在安防监控、车载影像、门禁人脸识别这些场景里边缘清晰度直接决定了算法的检出率和客户验收是否通过。而“YUV Sharpen”这个词说白了就是只在Y分量上做锐化U、V两个色度分量基本不动或者只做微调。为什么要这么干因为人眼的亮度分辨率远高于色度分辨率。你在暗光下看一块红色招牌你能看清它的轮廓但很难分辨招牌上那块红色到底是偏紫还是偏橙。算法上也一样色度信息本身就经过了下采样4:2:2或者4:2:0分辨率天生就比亮度低在上面做强锐化只会放大色度噪声、产生彩色彗尾费力不讨好。YUV域锐化正是顺着人眼感知特性来设计的把算力集中在Y通道上用更精细的滤波核去提取边缘再对提取结果做增益和钳位最后叠加回原图。这样既保住了主观清晰度又不至于把色度噪声一起放大。所以你在海思的ISP参数库里面翻凡是带Sharpen字样的模块绝大多数处理对象都是Y分量。1.2 YUV Sharpen在整条ISP链路里的位置要做参数调试第一步不是拿遥控器瞎按而是先看懂这个模块在图像处理流水线里的位置。海思的ISP链路一般是这么走的Sensor输出RAW图先进坏点矫正和黑电平矫正再做去马赛克Demosaic变成RGB紧接着做白平衡、颜色矫正和Gamma校正最后转成YUV送到后面的降噪、锐化、缩放模块。锐化模块通常放在降噪之后、缩放之前。这个位置有几个讲究。放在降噪之后是因为锐化会把噪声一起放大如果前面不把噪声压下去你调完锐化会发现画面噪点比原来还凶。放在缩放之前是因为先锐化再做缩放边缘细节能保留得更完整如果先缩小分辨率再锐化高频信息已经被丢了一部分锐化就是无米之炊。海思的芯片在YUV输出端一般会有2DNR二维降噪和3DNR三维降噪两级降噪YUV Sharpen模块通常在2DNR和3DNR合路之后也就是说它吃进去的信号已经被降噪处理过一轮了。这是好事但也会带来一个副作用3DNR的强度如果拉得太高会把画面抹得很平边缘也一起被抹掉这时候你再怎么加锐化增益都是白搭甚至会产生“边缘是锐了但纹理像塑料”的奇怪观感。所以你在实际调试的时候不能孤立地只盯着Sharpen的几十个参数。你要先确认前面的降噪是不是正常工作噪声基底是不是在一个合理范围。我之前遇到过一台机器锐化增益调到天上去了画面还是糊折腾了一下午最后发现是3DNR的时域滤波强度被上一版配置调到了接近饱和的位置把细节全磨平了。降噪和锐化在工程上永远是两兄弟不能分开看。1.3 什么样的场景需要动YUV Sharpen参数不是所有项目都需要精细折腾锐化。有些场景用默认参数就够了有些场景则是默认参数会直接翻车。我这里列几个最常见的需求来源监控枪机看车牌看人脸这类场景对边缘强度要求极高尤其车牌字符边缘如果发虚识别率会掉得很厉害通常需要把锐化调得比较“硬”。室内半球机看通道、看仓库画面内容相对固定边缘只要干净就够了太强的锐化反而会在监控画面上留下明显的白边客户会觉得“图像太假”。夜间低照度场景这个问题最麻烦光一暗噪声就上来了锐化增益稍高就是满屏噪点。这类场景一般要配合降噪档位联调把锐化阈值抬高只保强边缘放弃弱纹理。车载环视/后视畸变矫正之后图像的边缘会被拉伸锐化参数如果沿用原来的画面边缘会出现明显的锯齿和水波纹需要针对性调整。我通常建议拿到一个新项目先用默认参数出图保存一份当时的图像和对应配置然后根据实际观看效果决定是往“更锐”还是“更柔”的方向调。不要一上来就动参数表否则你根本不知道当前画面问题的根因到底是锐化不够还是前面某个模块的参数本来就没配对。2. 海思平台上的Sharpen参数拆解2.1 增益、阈值、核尺寸、钳位四类参数各管什么不同芯片、不同SDK版本YUV Sharpen模块的参数命名会有差异有些叫SharpRatio有些叫EdgeGain有些叫Strength但拆开来看核心逃不出四类增益、阈值、核尺寸、钳位。增益Gain是最直观的参数决定边缘增强的幅度。增益拉大边缘两侧的对比度差被放得更大画面看起来更“硬”。但增益不是越大越好增益越大噪声被放大的幅度也越大同时边缘过冲也会更明显。阈值Threshold是判断“这里是边缘还是平坦区域”的门槛。图像里每个像素和周围像素的差值超过阈值才被判定为边缘才会做增强低于阈值的区域视为平坦区不动它。这个参数是控制噪声放大和蚊式噪声的关键。阈值设得低细小纹理和噪声都会被当边缘增强阈值设得高只增强明显的强边缘画面更干净但可能损失细节。核尺寸Kernel Size是滤波窗口的大小常见的有3x3、5x5有的平台支持更大尺寸。核越大参与计算的邻域像素越多提取到的边缘线条越粗核越小处理越精细但抗噪声能力越弱。海思平台通常不会提供太多个可选的核尺寸多数时候是固定一个核或者二选一。钳位Clamp/Clip是限制边缘增强幅度的上限防止边缘处像素值溢出或过冲太厉害。举个例子一个边缘本身从亮度100跳到150增益算出来要加30如果钳位是20那最后只加20防止边缘出现太明显的白边或黑边。钳位是锐化不“脏”的关键。看到这里你应该明白这四类参数不是独立工作的。增益是油门阈值是刹车核尺寸是轮胎宽度钳位是限速器。你踩油门之前得先确认刹车和限速器有没有设好否则轻则画面发脏重则满屏噪声。2.2 参数之间的联动关系与调参优先级新手最容易犯的错是拿一个参数从头拧到尾。实际上海思的锐化参数存在很强的耦合关系你动一个另外几个都得跟着动。拿最常见的场景举例画面噪声不大但边缘不够清晰你想加锐度。这时候应该先加增益还是先降阈值我的做法是优先动增益。因为噪声底子干净加增益是直接从源头增强边缘效果最直接。加完增益如果发现边缘开始出现白边再去动钳位把过冲压回来。最后如果发现平坦区域开始出现颗粒感说明阈值低了再把阈值抬一点。反过来如果画面噪声已经比较大同时边缘也不清楚这时候就不能先动增益。应该先把阈值抬高让锐化器只认强边缘、忽略弱纹理和噪声然后再小幅加增益。顺序反了你会陷入“加增益噪点变多降噪又抹掉边缘”的死循环。这里插一个经验值阈值参数在大多数平台上不是线性生效的往往存在一个“拐点”。拐点以下调小阈值画面细节量提升明显但噪点也明显拐点以上调大阈值噪点很快被压住但细节丢失也很快。调试的时候要在这个拐点附近来回扫找到“细节还在、噪点还不明显”的区间这通常是一个很窄的范围。我第一次认真扫这个参数的时候花了整整一个下午最后选出来的阈值只比默认值大了不到5%。2.3 示例参数对照表从“太软”到“太硬”下面这张表是我基于海思常见平台调试经验整理的一个示意性对照表不是某个具体SDK的真实参数名但量级和趋势有参考意义。实际调试时以你手上SDK里导出参数的实际数值为准。调参目标增益阈值钳位效果表现默认输出中中中画面干净边缘尚可适合初步预览更精细、更“硬”高低高边缘锐利细节增强明显需注意白边干净、柔和低高中低画面平滑边缘自然适合低照度夜间低噪优先中低高低只保强边缘放弃弱纹理噪声可控强边缘优先高高中人脸/车牌锐利背景纹理适可而止记住表里的“高、中、低”是相对的不同芯片、不同分辨率下的绝对数值差异很大。1080p下看起来不大的增益值换到400万像素可能就会明显过冲。原因是像素密度不同同样的边缘在更高分辨率下跨越的像素数更多滤波后的累积增益也会不同。3. 实操调试完整流程3.1 准备工作图卡、场景与工具链在开始调参数之前先把工具备齐不然调一半发现缺东西很耽误时间。第一件是标准测试图卡。我常用的是ISO12233分辨率测试卡和一张灰阶卡。ISO12233用来做主观清晰度评估看楔形线条在哪个位置开始糊掉灰阶卡用来观察锐化是否在明暗过渡区域引入了不必要的过冲。没有图卡的话拿一张印满小字的报纸贴在墙上也凑合但做不到可重复对比。第二件是稳定的测试场景。固定机位光照均匀画面里最好同时包含高对比度边缘比如窗户框、路边栏杆和低对比度纹理比如瓷砖缝、树叶、砖墙。这两个区域的观感是矛盾的也是你调参时的主要取舍点。第三件是工具链。海思平台一般提供串口命令行或者网口调试工具可以实时修改ISP参数并预览效果。我习惯把调试工具链准备好之后再连一个截图脚本每改一组参数就截一张图保存下来。这个习惯非常重要因为锐化的效果有时候在实时画面上看着还可以但截图放到电脑上看又是另一回事。没有历史截图你调着调着就忘了初始状态是啥样了。3.2 初版参数设置从默认值出发不要试图从零开始设置锐化参数也不要直接抄网上的参数表。每颗Sensor的光学特性不同同样参数在IMX335和OV4689上出来的效果可能差很多。正确做法是让平台跑默认配置先看默认效果。拿到默认图像后做三件事。第一观察强边缘区域比如窗户框、文字边缘看有没有白边。有白边说明钳位偏松或增益偏大。第二观察平坦区域比如白墙、天空看有没有颗粒感或纹理。有颗粒感说明阈值偏低或降噪不够。第三观察弱纹理区域比如砖墙、头发丝看细节保留是否够。这三步观察下来你基本能判断出当前参数偏哪个方向。然后才开始逐项微调。我一般建议每轮只改一两个参数改完截图对比不要一次性把所有参数都动了。原因很简单如果画面出了问题你不知道是哪一步改坏的回滚都不知道回滚到哪个值。3.3 精细调节的四步法我自己的调参流程比较固定这里分享给你。第一步定增益。在默认阈值和钳位都不动的情况下把增益从低往高拉同时观察强边缘的清晰度变化。拉到你觉得边缘已经足够锐利、但还没开始出现明显白边的时候停下来。这一步的目的是找到增益的“甜点区”。第二步压白边。增益确定之后如果画面里高对比度边缘出现了白边就把钳位往下压。一次压一点压到白边肉眼不可见为止。注意不要压得太狠钳位压得太过边缘锐度会立刻塌下去等于前面增益白给了。第三步调阈值。增益和钳位固定后开始动阈值。先把阈值设得偏高一点然后慢慢降低每次降一点观察平坦区域的噪点情况。当平坦区域开始出现可感知的颗粒感时立即往回抬一档这个位置就是当前噪声条件下阈值的最佳值。第四步局部修正。以上三步做完整体画面已经有了一个不错的基础。这时候回到你最关心的场景区域比如车牌、人脸、树叶纹理针对这些区域再单独看效果。如果某个区域锐化感还是不够可以用平台提供的局部锐化控制或者区域权重功能来做定向增强不要把全局增益继续往上拉了。这四步走完一组可用参数基本就出来了。整个过程说快不快顺利的话一两个小时遇到棘手的夜间场景可能得花一天。我见过有同事上来就把增益拉到接近最大值然后花了两天跟白边和噪点搏斗最后全部推翻重来。先找甜点区再处理副作用顺序对了效率会高很多。3.4 多场景回归验证参数调完千万别急着收工。你在实验室里对着图卡调出来的参数拿到实际场景里大概率还会出问题。最典型的翻车场景就是白天阳光充足的时候画面看起来很好到了傍晚光线变暗噪声上来之后同样的参数就会出现明显的噪点增强。所以我做完一轮参数之后一定会做多场景回归。至少要看这几个场景白天强光下的室外、白天背光区域、室内正常灯光、傍晚低照度、夜间有路灯的街景。有条件的话最好再把红外灯打开测一组。每一组场景都截取同几个位置的照片放到电脑上逐帧对比重点看边缘白边、平坦区噪声、暗部细节这三个位置。如果低照度场景下噪声超标优先把阈值和钳位往回调一点牺牲一部分锐度换噪声收敛。如果强光场景下白边明显优先压钳位。之前参与过一个出入口车牌识别的项目白天参数调得漂漂亮亮结果天一黑整个画面全是噪点车牌边缘被锐化得惨不忍睹识别率直接跌破60%。后来加了场景切换逻辑白天用一套锐化参数傍晚自动切换成低照度参数夜间再切换成强降噪弱锐化的组合。所以做ISP调试永远要记住一条没有一套参数能通吃所有场景要么做分级要么做动态切换。4. 常见问题排查实录4.1 强边缘出现白边和振铃图像中窗户框、栏杆这类高对比度边缘的旁边出现一条白色或者黑色的细线俗称白边。严重的时候边缘两侧会出现一条一条像水面波纹一样的交替亮暗条纹这就是振铃。白边的直接原因是边缘增强幅度超出了图像本身允许的动态范围加出来的部分被截断了。排查方向按顺序来先看钳位。钳位设置得太高边缘增强的幅度没有上限约束很容易过冲。把钳位降下来白边通常会立刻减弱。再看增益。如果钳位已经压到比较低了白边还是明显说明增益本身就太大了需要同步降增益。振铃则比白边更麻烦。振铃一般出现在核尺寸选得过大、同时增益又偏高的情况下。滤波核越大提取到的边缘越粗增强时影响的像素范围越广就越容易出现振荡。遇到振铃优先把核尺寸减小一档然后降增益。这个组合基本能解决90%的振铃问题。4.2 暗部噪点被锐化放大夜间暗部区域有明显的颗粒感看着像雪花而且颜色还发花这是低照度场景最头疼的问题。这个问题的根子不完全在锐化。前面的降噪没有把暗部噪声压干净后面的锐化只是把噪声放大了而已。所以排查要先确认降噪参数。打开图像降噪的统计信息看暗部区域的噪声标准差是多少。如果噪声本身已经压得不错再来看锐化参数。锐化这边优先做的是抬高阈值。阈值高了细小的噪声就不容易被判定成边缘。代价是暗部细节也会损失一些处理的时候得在阈值和细节之间反复试探。其次是把钳位调低这样即使有残留噪声被判定成边缘增强的幅度也被限制在一个很低的水平。最后实在不行就把暗部区域的锐化增益单独降一档。有些平台支持按亮度区间分别配置锐化强度这时候把暗部区间的增益调低亮部保持不动效果最好。4.3 强边缘正常但纹理细节依然发虚边缘很清楚但像树叶脉络、布料纹理、砖墙纹路这些细节一直出不来画面看整体轮廓很好细看总觉得“缺东西”。这种情况多半是阈值设得太高了。强边缘和弱纹理的像素梯度差异很大阈值设高了强边缘能过但弱纹理被当成噪声丢掉了。解决办法是缓缓降低阈值同时密切观察平坦区域的噪声变化。只要噪点没有明显起来阈值越低越好。另外一个常见原因是对比度不够。纹理细节的梯度本身就很弱如果前面Gamma调得偏暗或者对比度偏低纹理信号就被压缩在很窄的亮度范围里锐化器识别不出来。这种情况要去检查前面的对比度和Gamma参数先把图像整体的层次拉开再回来看锐化效果有没有改善。4.4 参数白天效果好但夜间翻车这是我在实际项目里被问得最多的一类问题。客户描述很统一白天清晰度不错晚上一片糊边缘还发毛。原因不复杂白天光照足、信噪比高锐化参数可以调得比较积极到了晚上Sensor增益拉高噪声基底大幅抬升原来在白天看起来完全没问题的阈值和增益在夜间就会把噪声全放大。解决办法是分场景出参数别指望一套参数打天下。海思平台一般支持基于AE统计信息的场景切换可以按亮度区间分别下发不同的ISP参数。白天亮度高的时候用一组锐度积极的参数晚上亮度低的时候自动切换成一组低增益、高阈值、低钳位的参数组。中间还可以加一两组过渡档避免亮度来回波动时画面出现明显的参数跳变。我在多个项目里验证过做好参数分档之后夜间图像的主观清晰度不一定比白天好但至少不会出现满屏噪点的“雪景图”客户的接受度高很多。5. 我调YUV Sharpen这几年攒下的心得最后分享几个实操中沉淀下来的零碎经验不一定写在哪个文档里但很实用。第一改参数之前一定要保存当前配置。我吃过亏改了一下午参数最后画面调坏了想回滚发现没有保存初始值只能凭记忆往回改折腾了大半夜。后来长记性了每次动参数之前先导一份配置存档命名带上日期和参数特征比如“Hi3516_default_20240115.cfg”改完一版再另存一份。这个习惯救了我很多次。第二截图对比不能省。人眼对画面的记忆是很短暂的你调完一组参数觉得不错调了三组之后回头看第一组往往发现第一组其实更好。所以每调一版参数截一张图按顺序编号保存在同一个文件夹里。全部调完之后把同场景的截图拼在一起对比很容易选出最佳的一组。第三YUV锐化和降噪要成对调。我在前面反复提到这件事因为它真的太重要了。你把锐化往死里调不如先把降噪调对。噪点压住了锐化空间自然就打开了噪点没压住锐化调的越大画面越脏。记住一个总原则先降噪后锐化降噪定底噪锐化定锐度。第四多跟客户确认“清晰”到底是什么意思。有的客户说图像不清楚想要的是边缘硬一点有的客户说图像不清楚其实是嫌暗部死黑、细节看不见还有的客户说图像不清楚是因为播放端分辨率不够跟ISP半毛钱关系没有。需求没对齐之前不要埋头调参否则你调一个月也可能是给错误目标打工。YUV Sharpen参数调试这件事说难不难就是把增益、阈值、钳位、核尺寸这几个参数理解透按正确的顺序来回试说简单也不简单因为它跟降噪、对比度、Gamma、场景切换全都有耦合。多花时间看图多记录对比熟练之后你会慢慢建立起一种手感看到画面大概就能判断出是哪个参数需要动。这种手感没法从文档里学只能在一次次调试里积累。