
相机图像质量的评审会上最常见的场面是两拨人对着同一张样张各说各话。做器件的同事拿着测试数据说这颗传感器读出噪声只有两个电子底子相当干净做画质调优的同事把同一张图放大到百分之百指着画面里那片树叶说已经糊成一团了。两个人说的都对但他们嘴里的“画质”根本不是同一件事。前者讲的是器件在物理层面能给出的信噪比上限后者讲的是从光子穿过镜头、落到像素上、再经过一整条处理链路最终显示到屏幕上时人眼看到的那点观感。这篇东西想做的事情很朴素把相机图像质量这个被用滥的词拆成可以分别讨论、分别测量、分别调优的几个部分说清楚每一部分的天花板在哪里、代价是什么、出了问题该往哪儿查。适合谁看如果你刚开始接触相机模组选型、图像调优或者影像产品的评测验收这里能给你一张相对完整的地图如果你只是好奇为什么自己拍的照片一到暗光就糊、为什么手机拍人像皮肤总像塑料也能在下面找到对应的解释。我不会给你一个“画质等于九十分”的结论那种分数在工程上基本没有意义因为同样的分数背后可能是完全不同的取舍。1. 图像质量不是一个分数而是一组互相拉扯的指标1.1 把“画质”拆成可以分别下手的六个面任何一次画质讨论如果双方没有先对齐“我们现在说的是哪个维度”后面全是无效沟通。我习惯把相机图像质量拆成下面这几块每一块都有自己的测量方式和优化手段也都有自己的物理上限。维度具体表现主要来源典型测量手段分辨率与锐度细节能不能分辨、边缘是否干脆像素密度、镜头MTF、去马赛克与锐化斜边刀口卡测MTF、线对卡目视判读噪声暗部颗粒感、色彩噪点光子散粒噪声、读出噪声、暗电流平场图算SNR曲线、噪声频谱动态范围高光是否死白、暗部是否死黑满阱容量与噪声底之比阶梯曝光合成、灰阶卡测可用EV数色彩还原颜色准不准、饱和度是否自然CFA光谱响应、色彩校正矩阵色卡测ΔE、肤色主观评估均匀性四角是否发暗、是否偏色镜头渐晕、CFA与微透镜的CRA匹配均匀白场测阴影分布时序表现摇镜是否歪斜、灯光下是否有横纹读出速度、曝光与工频的关系动态场景实拍、频闪灯箱测试这六块里前五块基本是静态的第六块最容易被忽略因为它只有在“动起来”或者“遇到非自然光源”的时候才暴露。我见过不少项目实验室里所有静态指标都漂亮拿到户外一摇镜头画面就歪或者进了有灯光的室内画面就开始滚横条返工成本极高。1.2 这些指标为什么天生互相打架新手最容易犯的错是以为画质可以“全面提升”。现实是这几块指标之间存在着硬性的物理与工程约束你优化一头另一头必然付出代价。最典型的是噪声与细节的对立。降噪的本质是用邻域像素的信息去推测当前像素“应该”是多少推测就意味着平滑平滑就意味着细节被抹掉。降噪强度调高一档暗部干净了同时细密的纹理也一起没了。这不是算法不够聪明的问题是信息论层面的限制在噪声幅度接近甚至超过细节幅度的地方任何算法都无法完美区分“这是噪点”还是“这是真实的细小纹理”。第二组对立是动态范围与噪声底。想提高动态范围要么提高满阱容量像素做大或者工艺改进要么压低噪声底。而压低噪声底的常规手段之一是多帧合成多帧合成需要时间需要对齐一动就出鬼影。单帧硬拉暗部等于把暗部的噪声一起放大画面看起来“亮了”但同时“脏了”。第三组是锐度与伪影。锐化本质上是高频增强增强过头就会在边缘两侧造出亮边和暗边也就是常说的白边黑边。人眼对这类伪影极其敏感一张到处是白边的照片第一眼的“锐”很快就会变成“假”。2. 传感器与镜头地基在图像处理介入之前就定死了大半2.1 满阱容量和读出噪声决定了动态范围的天花板很多人以为动态范围是算法调出来的其实算法只能在物理给定的范围内做分配。单帧动态范围有一个非常干净的表达式DR(dB) 20 × log10(满阱容量 ÷ 读出噪声)满阱容量指的是一个像素在饱和之前最多能装下多少个光电子读出噪声指的是把电荷转成电压、再转成数字量的过程中混进去的等效电子数。这两个数一除就是“最亮能装多少”和“最暗能分辨多少”的比值。拿几组典型数字感受一下。一台用一英寸底的运动相机像素尺寸约2.4微米满阱容量大约一万五千电子读出噪声按3电子算动态范围就是20×log10(5000)≈74dB换算成曝光档位大约12.3EV。一台全画幅相机像素尺寸5微米出头满阱容量能到四万电子读出噪声压到2.5电子动态范围就是20×log10(16000)≈84dB约14EV。而手机主摄的单像素只有1微米左右满阱容量三千电子上下即便读出噪声做到1.5电子单帧也只有20×log10(2000)≈66dB约11EV。这组数字解释了一个长期存在的现象手机的单帧动态范围就是打不过大底相机跟算法水平关系不大。手机能把动态范围做到13EV以上靠的是多帧合成——短曝光保高光、长曝光保暗部中间再做对齐融合。这也解释了为什么手机拍运动物体时动态范围会明显缩水因为多帧合成的前提是“这几帧画面基本没变”。2.2 像素做小代价不只是噪声变大像素尺寸缩小带来的第一个直接后果是满阱容量下降因为能装电荷的物理体积变小了。容量下降意味着同样光照下更早饱和高光更容易死白同时也意味着散粒噪声主导下的信噪比上限下降因为散粒噪声主导时信噪比约等于满阱容量的平方根容量从四万降到三千这个上限就从200倍掉到55倍差了将近11dB。第二个后果是像素间的电学与光学串扰。像素越挤光生电荷越容易跑到隔壁像素去表现为色彩混叠和锐度下降。背照式结构、深沟槽隔离、微透镜优化都是为了缓解这个问题但缓解不等于消除。第三个后果常被忽略像素变小之后镜头的衍射斑开始占主导。这一点下一节单独说。工程上的应对手段主要是像素合并也就是把相邻四个同色像素的电荷合起来读等效像素面积翻四倍灵敏度和满阱容量都上去了代价是分辨率降到四分之一。这也是为什么很多手机默认输出一千万到一千两百万像素而不是标称的五千万——日常场景下合并输出的观感确实更好高像素模式留给光线充足、需要裁切的场合。2.3 衍射极限小光圈不是万能的镜头的衍射斑直径有个经典估算式d ≈ 2.44 × λ × Fλ取550纳米可见光中段F是光圈值。代进去算一下光圈艾里斑直径微米对1微米像素意味着什么F1.8约2.4已覆盖2个以上像素F2.8约3.8覆盖近4个像素F4.0约5.4明显软化F8.0约10.7细节基本交代不清F11约14.8只剩轮廓这张表最值得注意的一行是F1.8配合1微米像素。也就是说手机主摄在最大光圈下光学系统本身就已经处在衍射受限的边缘再往上堆像素密度实际能分辨的细节并不会同步增长。这也是为什么单纯比较“多少万像素”越来越没有说服力。对可换镜头相机来说这张表解释了另一个常见困惑为什么小光圈拍风景收到F11以后画面反而变肉了。很多人以为是镜头素质不行其实是衍射在起作用。全画幅像素尺寸5微米左右F8的艾里斑10.7微米已经明显超过两个像素软化不可避免。所以“拍风景就收到F11”这条老经验在高像素机身上是要打折扣的F5.6到F8通常是更稳妥的甜点区。2.4 暗角、色差、畸变镜头带来的先天缺陷怎么补镜头带来的问题有三类最典型渐晕造成的四角发暗、倍率色差造成的边缘紫边绿边、畸变造成的直线弯曲。渐晕的补偿方式是在处理链路里乘一张增益图四角乘的倍数大中心乘的倍数小。这里有一个必须知道的副作用增益是乘法噪声也跟着乘。四角补偿两倍增益等效于四角的有效曝光少了一档噪点自然更明显。所以很多画面“中心干净、四角发脏”不完全是传感器的问题是镜头阴影校正把四角的噪声一起抬起来了。做暗光拍摄时适当放弃一点边缘照度、少补一点增益整体观感往往更均匀。倍率色差和畸变通常是绑在一起校正的因为两者都跟视场位置相关可以用同一套几何映射处理。但几何校正本身是重采样重采样就会损失锐度。广角镜头畸变大的机型校正之后边缘锐度下降是必然的这不是玄学是插值的代价。做方案评估的时候我会特意去看校正前后的边缘MTF差异如果掉得太多就得回头质疑镜头设计本身。3. 图像处理链路画质在这里被重建也在这里被毁掉3.1 黑电平校正和坏点补偿最不起眼但最容易翻车原始数据进链路的第一步是黑电平校正。传感器在完全无光的情况下输出也不是零而是一个随温度、随积分时间缓慢漂移的偏置值。校正的办法是拿光学黑区的像素做参考实时估算这个偏置再减掉。这一步出问题的典型症状是暗部发绿或者发紫。原因通常是黑电平估偏了而且偏的方向在不同颜色通道上不一致。更麻烦的是温度相关机器冷启动时校正得挺准连续拍视频半小时机身温度上去暗电流翻倍增长大致每升高六到八摄氏度翻一倍如果黑电平跟踪跟不上暗部就开始出现固定的色斑。坏点补偿是另一件小事。传感器的坏点分两类永远是同一个值的死点和随曝光线性变化的亮点。前者用固定表就能修后者跟温度强相关得动态检测。我遇到过一次挺典型的故障常温测试全部正常低温环境下画面出现零星亮点查了半天发现是动态坏点检测的阈值是常温下标定的低温下暗电流变小原本被判为坏点的像素变成正常像素阈值不匹配导致误判反而把好像素修成了坏点。3.2 去马赛克颜色分辨率的天花板从采样那一刻就定下了绝大多数传感器的彩色滤光阵列是2×2的拜耳结构一个四像素格里只有一个红、一个蓝、两个绿。这意味着绿色通道的采样密度是全像素的一半红蓝各只有四分之一。而人眼对亮度的敏感度远高于色度亮度主要由绿色贡献所以这套非均匀采样在观感上是划算的。但代价必须清楚色度分辨率天生就比亮度低一大截。当画面里出现细密的红色或蓝色纹理比如远处的红色砖墙、蓝色织物去马赛克算法就要靠周围像素去“猜”猜错的结果就是色彩混叠出现本不存在的彩色条纹。这类问题在低分辨率缩略图里看不出来一放大就原形毕露。这也解释了为什么画面里细密的高频纹理容易出摩尔纹。当纹理的空间频率接近采样频率的一半时采样结果会产生低频的差拍信号表现为大片的彩色波纹。光学低通滤镜能压制这个现象但会牺牲锐度现在更多靠软件检测和局部处理代价是这部分区域的细节会被主动抹掉。3.3 降噪和锐化一场注定没有赢家的零和博弈降噪和锐化在链路里通常是串联的而且经常是分亮度色度分别处理。色度降噪可以下狠手因为人眼对彩色噪点的容忍度低、对色度细节的敏感度也低把色度通道大范围平滑观感提升明显且副作用小。亮度降噪就必须谨慎因为亮度细节就是“锐度”本身。真正难的是暗部。暗部的信号幅度本来就接近噪声幅度降噪算法面对的是信噪比接近一甚至小于一的区域。这时候无论怎么调都只有两个结果要么留着噪点要么抹成一片。工程上的折中办法是让降噪强度随亮度和频率变化——暗部强一点、亮部弱一点低频强一点、高频弱一点同时保留一部分细颗粒噪声因为完全干净的画面反而显得“假”人眼习惯了胶片和传感器都有点颗粒。锐化的问题在下一章单独讲这里只说一个原则锐化应该在降噪之后做而且应该在合适的色彩空间和亮度通道上做。顺序反了先锐化再降噪等于先把噪声放大一遍再去压制纯属自找麻烦。3.4 色彩校正矩阵与色调映射准确和好看是两码事传感器的色彩滤光片光谱响应跟人眼的三刺激值曲线从来就不重合所以必须要一个3×3的色彩校正矩阵把原始响应映射到标准色彩空间。这个矩阵通常不是正交的条件数不小意味着它在纠正色相的同时会放大噪声尤其是饱和度高的颜色。红色通道往往受影响最大这就是为什么很多机型在暗光下拍红色物体红色区域噪点特别明显。矩阵标定的目标函数也要想清楚。是追求色卡上的平均色差最小还是优先保证肤色准确这两者经常冲突。做消费类产品的时候肤色优先级几乎总是更高因为人眼对肤色偏差极其敏感色卡上其他颜色的偏差反而容易被忽略。所以你会看到一些机型拍色卡成绩一般但拍人看着舒服这是刻意的取舍而不是失误。色调映射是另一个取舍场。把线性的高动态范围数据压到显示设备的有限动态范围内本质上是重新分配亮度。全局曲线压得狠画面发灰、对比度不足局部色调映射压得狠高光周围会出现光晕暗部会出现不自然的提亮区域。我个人的偏好是宁可保留一点高光溢出也不要把暗部硬提到发灰因为前者符合真实观感后者一眼就假。4. 客观测试怎么做才不是自欺欺人4.1 分辨率线对每像素比“多少万像素”有用得多标称像素数只说明采样点有多少不说明这些采样点上承载了多少真实信息。有意义的指标是模量传递函数也就是不同空间频率下的对比度保留率。常用的测法是拍斜边刀口卡通过边缘扩散函数反推MTF曲线读出某个频率下的对比度百分比。实际验收时我会关注三个数奈奎斯特频率采样率的一半处的MTF还剩多少、MTF降到百分之五十对应的频率是多少、以及边缘视场和中心视场的差异。第一个数反映极限细节第二个数反映“看起来锐不锐”的主观感受第三个数反映镜头的一致性。很多机型中心很锐、边缘一塌糊涂只看中心成绩会严重误判。要注意的是MTF测出来的是“经过整条链路之后”的结果里面已经包含了去马赛克和锐化的贡献。锐化会把中高频的MTF抬上去看起来分数很漂亮但那部分是算法造出来的不是光学系统真能分辨的。所以我一般会要求同时提供锐化关闭状态下的原始MTF两个数对比着看才知道真实的底子有多厚。4.2 噪声和动态范围别只看一个平均值噪声测试的标准做法是拍均匀灰场在不同亮度下计算信噪比画出一条随信号强度变化的曲线。这条曲线的形状比单个数值有信息量得多散粒噪声主导的区域应该呈现每倍信号提升约3dB的斜率如果曲线在中间某段突然变平或者掉下去通常意味着降噪开始介入这时候测到的“噪声”其实是降噪之后的结果。动态范围的测法有两种口径很容易打架。一种是工程口径用满阱容量除以读出噪声算理论值另一种是观感口径用灰阶卡逐档降低曝光看哪一档开始无法和纯黑区分、哪一档开始无法和纯白区分。后者测出来的数通常更小因为它包含了链路里的各种处理和量化损失。两个数都报出来并说明口径比只报一个漂亮数字要诚实得多。还有一个容易忽略的点噪声是有频谱的。同样大小的噪声方差如果集中在低频看起来是“脏”如果集中在高频细颗粒看起来反而像质感。所以只看标准差不够做一次二维频谱分析能看出降噪算法是在哪个频段动手的。4.3 色彩色差之外还得看稳定性和一致性色卡测出的平均色差是个入门指标但它掩盖了两个更重要的问题在不同色温下的稳定性以及同一色温下不同亮度的一致性。稳定性的意思是从暖光到冷光扫一遍色差曲线的波动有多大。有些方案在标准光源下标定得很准一到混合光源就崩因为自动白平衡的色温估计在这些场景下不靠谱。一致性的意思是同一个颜色在亮部和暗部还原得是否一样这考验的是色彩校正矩阵和色调映射的配合暗部经常会出现色相偏移。肤色是单独的评估项。我会准备一组不同肤色的实拍样张在有标准光源和无标准光源的条件下各拍一遍然后找几个人盲评。这件事听起来不工程但确实是消费类影像产品最该做的一步因为最终决定成败的是人眼。4.4 主观评价不能省但要设计得像样客观指标能筛掉明显不合格的方案但没法告诉你“这张照片讨不讨喜”。主观评价要想有参考价值至少要做到三点样张覆盖典型场景室内人像、室外逆光、夜景、高饱和静物、评价者包含非专业人士、对比时打乱顺序盲评。我吃过一次亏内部评审时大家都觉得A方案更好因为细节更多拿去给普通用户看多数人觉得B方案更好因为B的画面更干净、色彩更讨喜。后来复盘发现内部评审的人习惯放大到百分之百看细节而普通用户只看整体。这个差异不是谁对谁错而是评价场景不同所以现在的做法是两个尺度都评一遍全图观感和局部细节分开打分。5. 调优和验收里最容易踩的坑5.1 降噪拉过头皮肤变塑料这是最常见也最难被内部发现的问题。测试环境的样张往往是静物和建筑纹理丰富降噪强一点也看不出来一到人像场景问题立刻暴露——皮肤被磨成一片均匀的色块毛孔、细纹、绒毛全部消失看起来像塑料模特。根本原因是降噪算法不区分“噪声”和“高频低对比度细节”而皮肤纹理恰好落在后者这个区间。解决思路有两条一是做人脸区域检测在人脸区域降低亮度降噪强度二是保留一部分噪声作为质感也就是所谓的“颗粒注入”在降噪之后按亮度反向加一点低幅度噪声回去。第二条更通用也更接近真实观感。验收时我的做法是固定拍一组人像样张包含不同肤色、不同光线方向、不同距离然后放大看鼻翼和脸颊交界处。这个位置的纹理最细降噪过头的话一眼就能看出来。5.2 锐化过度白边黑边比糊更难看锐化过度的典型症状是物体边缘出现一圈亮边和一圈暗边逆光场景下尤其明显树枝、栏杆、建筑轮廓周围都会出现。还有一个更隐蔽的症状是平坦区域的噪点被放大蓝天、墙面本来挺干净锐化之后变得颗粒粗糙。参数上要控制三个量锐化半径、锐化强度、以及触发阈值。半径太大会让边缘变粗强度太大会让白边明显阈值的作用是只对足够强的边缘做增强避免把噪声当边缘处理。经验值是半径控制在一个到两个像素强度适中阈值调到能滤掉大部分平坦区噪声的水平。还有一个坑是锐化做在了色彩通道上。色度通道本身分辨率就低在上面做锐化只会放大彩色伪影出现彩色镶边。锐化应该只作用在亮度通道。5.3 硬拉动态范围暗部发灰、高光掉色多帧合成把动态范围做上去之后接下来的色调映射如果压得太狠画面会出现两个问题暗部整体发灰、黑不下去以及高光区域的色彩饱和度崩塌本来鲜艳的晚霞变成一片惨白。暗部发灰的原因是把噪声也一起提亮了。解决方向是让提亮曲线在低信号区收敛同时对暗部做适度的降噪和黑位压制。高光掉色的原因是高光区域三个通道都接近饱和通道间的差值被压缩饱和度自然下降。这时候要么接受高光溢出一点要么在映射曲线里对高光区做单独的饱和度保护。判断标准很朴素把画面缩小到手机屏幕大小看一眼如果第一感觉是“灰蒙蒙”那就是压过头了。5.4 白平衡跳变和工频闪烁动起来才暴露白平衡在单一光源下通常很稳一进混合光源场景比如窗外自然光加室内暖光就开始来回跳。根本原因是色温估计在这种场景下本身就有多解。缓解办法是加时间域平滑限制单帧之间的白平衡变化速率同时用场景检测避免在光源切换时过度平滑导致偏色持续时间过长。工频闪烁的表现是画面出现横向明暗条纹或者拍视频时亮度周期性波动。成因是光源亮度以电网频率的两倍在波动而卷帘快门的逐行曝光让不同行在不同相位曝光。解决办法是检测闪烁频率然后把曝光时间对齐到光源周期的整数倍。这个功能在室内体育场馆、地下车库这类纯人工光源场景下几乎是必需的。5.5 卷帘快门静态测不出一动就露馅卷帘快门是逐行读出的帧内不同行的曝光起始时间不同。静止拍摄完全没问题一旦快速摇镜或者拍摄高速运动的物体画面就会倾斜、拉伸或者出现部分曝光。倾斜的方向取决于读出方向和运动方向的组合。这个问题没办法靠算法完全消除只能靠更快的读出速度。做方案评估时要明确问清楚全像素读出的行时间是多少一帧完整读出需要多久。如果一帧读出时间超过三十分之一秒拍视频摇镜基本一定会歪。有些方案提供部分区域高速读出模式牺牲视场换取速度在特定场景下可用。验收时的测试方法很简单对着方格墙匀速摇镜拍一段视频逐帧看方格是否还是正方形。这个测试不需要任何专业设备但非常有效。6. 一套我自己常用的画质评估顺序6.1 先定场景和验收口径再谈指标很多人上来就开始跑测试跑完一堆数据不知道怎么解读。我的习惯是先明确这个产品主要卖给谁、主要在什么场景下用。主打夜景的机型和主打运动拍摄的机型验收权重大概差一倍。夜景优先看暗光信噪比和动态范围运动优先看读出速度和对焦响应权重定下来之后再看数据结论才有意义。口径也要提前说清楚动态范围报的是单帧还是多帧、分辨率报的是锐化前还是锐化后、噪声报的是原始域还是处理后。这些不写清楚两份报告放在一起根本没法比。6.2 从暗光到高光、从静态到动态的测试矩阵我常用的顺序是均匀性打底、噪声与动态范围、分辨率与锐度、色彩、伪影、最后是动态场景。前面几项如果不过关后面的测试基本不用做了因为基础有问题的话后面所有数据都会被污染。动态场景放在最后但它不该被省略。静态测试全过、动态测试翻车的项目我见过不止一次返工代价远高于提前测一遍。摇镜、走动、开关灯、变频光源这几个场景跑一遍很多问题会自己跳出来。6.3 数据要看分布不要只看平均值同一批样张平均色差合格但个别色块严重偏离这种方案上线后一定会被投诉。所以我会要求提供极值、分布和离群点尤其是肤色和常见物品色天空、绿植、木色。噪声也一样全图平均噪声达标但局部有热点噪点观感上比整体稍脏要糟糕得多。还有一点是我个人的经验测试数据要和实拍样张放在一起看。数据说锐度够但实拍看着软多半是锐化的频谱分布不对数据说噪声低但实拍看着脏多半是噪声集中在低频。数据和观感不一致的时候不要急着怀疑数据先去找那个把两者连接起来的中间环节问题通常就藏在那儿。最后分享一个小技巧。如果你手上没有专业的测试卡和灯箱用一张打印的灰阶渐变纸加一盏显色性好的台灯也能做不少基础判断看渐变过渡处有没有出现色带、看暗部是不是发绿、看高光是不是先死哪一个通道。这些粗糙的测试没法给出精确数值但足够在选型阶段快速筛掉明显不靠谱的方案。我在早期做模组对比的时候靠这套土办法省下了不少来回寄样机的时间。