035、图像传感器噪声源与建模:光子散粒噪声、读出噪声与固定模式噪声

发布时间:2026/7/16 19:48:54
035、图像传感器噪声源与建模:光子散粒噪声、读出噪声与固定模式噪声 035、图像传感器噪声源与建模光子散粒噪声、读出噪声与固定模式噪声去年夏天我在调试一款车规级800万像素CMOS传感器时遇到了一个诡异现象——夜间行车场景下图像暗部区域出现了一种“颗粒感”但又不是传统意义上的噪点更像是某种有规律的纹理。产线反馈说ISP参数已经调到了极限降噪强度再大就会丢失车道线细节。我盯着示波器上的模拟前端输出波形看了整整两天最后发现是读出电路里一个偏置电压的纹波在作祟。这件事让我重新审视了一个基础问题我们天天挂在嘴边的“噪声”到底有多少种它们从哪来又该怎么建模光子散粒噪声量子世界的“随机性税”先聊最根本的噪声源——光子散粒噪声。这不是电路设计的锅是物理定律的硬约束。光电转换本质上是光子撞击硅原子产生电子-空穴对的过程而光子的到达时间服从泊松分布。这意味着即使光照绝对均匀每个像素收集到的电子数也会围绕平均值波动。建模方式散粒噪声的方差等于信号电子数的均值。假设一个像素收集了N个电子那么散粒噪声的标准差就是√N。信噪比SNR N/√N √N。这个公式很直白——信号越强信噪比越高但噪声本身也在增长。暗光下N很小比如N100时SNR只有10图像看起来就像蒙了一层雾。实战中的坑我在做手机夜景模式时曾经试图用多帧合成来“消除”散粒噪声。理论上是对的但实际效果总差一截。后来发现是因为帧间运动导致配准误差把散粒噪声变成了运动伪影。这里踩过坑——散粒噪声是时间上的随机波动多帧平均确实有效但前提是场景静止。车载场景下车辆抖动、行人移动多帧合成反而会引入鬼影。别这样写代码直接对原始RAW域做帧平均而不做运动补偿结果就是边缘模糊加鬼影。读出噪声电路设计的“物理极限”读出噪声是模拟前端AFE和数字转换过程中引入的噪声包括复位噪声、1/f噪声、热噪声、量化噪声等。这部分噪声与信号无关是电路本身的“本底噪声”。关键参数读出噪声通常用电子数e-表示高端传感器可以做到1-2e-普通手机传感器在3-5e-。这个值决定了传感器的动态范围下限——读出噪声越低能分辨的暗部细节越丰富。复位噪声这是CMOS传感器特有的问题。像素复位时复位晶体管的热噪声会被采样到浮置扩散节点上。早期传感器用硬复位噪声很大后来发展出软复位、相关双采样CDS等技术来抑制。CDS的原理很简单先读一次复位电平再读一次信号电平两者相减。但这里有个细节——CDS只能消除固定模式的复位噪声对随机噪声无效。我在调试一款安防监控传感器时发现暗部有“闪烁”现象就是CDS时序没对齐导致的。量化噪声ADC量化时模拟信号被映射到离散数字值这个映射误差就是量化噪声。理想情况下量化噪声的均方根值为LSB/√12。但实际ADC的非线性、DNL微分非线性和INL积分非线性会放大这个噪声。别这样写以为12-bit ADC的量化噪声就是1/√12 LSB实际测量时发现噪声比理论值大3倍因为ADC的DNL达到了1.5 LSB。建模方式读出噪声通常建模为高斯分布均值为0方差为σ²_read。这个值可以从传感器datasheet查到但更可靠的方法是实测——盖上镜头盖拍一张全黑帧计算像素值的标准差。注意要排除暗电流的影响暗电流是温度相关的需要在低温下测量。固定模式噪声像素间的“个性差异”固定模式噪声FPN是传感器最让人头疼的噪声之一因为它不是随机的而是空间上固定的。每个像素的暗电流、增益、偏置都有细微差异这些差异在图像上表现为固定的“网格”或“条纹”。列噪声与行噪声CMOS传感器采用列并行读出架构每列共享一个ADC或放大器。如果某列的偏置电压有偏差整列像素都会偏亮或偏暗形成垂直条纹。行噪声则来自水平方向的时序抖动。我在调试一款工业相机时发现图像上有一条若隐若现的垂直条纹排查了三天最后发现是PCB layout上某条电源走线离列ADC太近耦合了50Hz工频干扰。像素响应非均匀性PRNU每个像素的光电转换效率不同导致对相同光照的响应不一致。PRNU在强光下更明显表现为“颗粒感”。建模时通常用增益因子和偏置因子来描述实际输出 增益因子 × 理想输出 偏置因子。增益因子服从高斯分布偏置因子则与暗电流相关。实战中的坑FPN可以通过暗场校正DCNU和亮场校正PRNU来消除。但校正表需要定期更新因为传感器会老化温度变化也会改变FPN特性。我在车载项目中遇到过一个问题——冬天和夏天的FPN校正表不能通用因为温度变化导致暗电流漂移。这里踩过坑校正表必须在实际工作温度下采集否则校正后反而会引入新的伪影。噪声模型的工程落地理论模型再漂亮最终要落到代码里。我常用的噪声模型是输出 增益 × (信号 散粒噪声) 读出噪声 FPN其中散粒噪声的方差与信号成正比读出噪声是常数FPN是空间固定的。这个模型在ISP pipeline里用于降噪算法的参数自适应——根据信号强度动态调整降噪强度。实测验证用均匀光照的灰卡拍摄取不同曝光时间下的图像计算每个像素的均值和方差。绘制方差-均值曲线斜率就是散粒噪声的增益因子截距就是读出噪声的方差。FPN可以通过减去多帧平均后的图像来提取。别这样写直接套用高斯噪声模型做降噪忽略散粒噪声的信号相关性。结果就是亮部过度平滑暗部噪声残留。正确的做法是使用泊松-高斯混合模型或者用方差稳定变换如Anscombe变换将散粒噪声转化为近似高斯噪声。个人经验性建议噪声分析从RAW域开始别在sRGB域分析噪声Gamma校正和色彩矩阵已经把噪声分布搞得面目全非。RAW域才是噪声的“原生形态”。温度是最大的变量传感器温度每升高10°C暗电流翻倍读出噪声也会增加。车载摄像头在夏天暴晒后传感器温度可能达到80°C噪声特性与实验室25°C完全不同。设计降噪算法时一定要留出温度补偿的接口。FPN校正表要动态更新产线标定一次是不够的。我见过一个项目出厂时FPN校正完美三个月后用户反馈图像出现条纹就是因为传感器老化导致FPN漂移。建议在ISP中集成在线FPN检测和校正更新机制。不要迷信datasheetdatasheet上的噪声参数通常是在理想条件下测得的实际模组组装后镜头、滤光片、封装应力都会改变噪声特性。拿到模组后第一件事就是实测噪声曲线建立自己的噪声模型库。降噪不是越强越好过度降噪会抹掉纹理细节在医疗影像和工业视觉中可能是致命的。我做过一个内窥镜项目降噪算法把血管纹理当成噪声去掉了导致医生无法判断病变区域。降噪的边界条件一定要和场景需求对齐。写到这里我想起那个车规传感器的调试经历。最终解决方案不是加强降噪而是在PCB layout上增加了一路LDO给列ADC单独供电把纹波从10mV降到了1mV以下。有时候噪声问题的根因不在算法而在硬件。作为影像系统架构师既要懂算法也要懂电路才能在噪声的迷宫中找到真正的出路。