018、Sensor 坏点与热噪点的工厂检测与在线校正方案
2026/6/5 11:40:29 网站建设 项目流程

018、Sensor 坏点与热噪点的工厂检测与在线校正方案

一、从一条产线投诉说起

去年夏天,某款旗舰机在量产爬坡阶段,产线突然爆出“暗光预览有白点”的批量不良。QC抽检发现,大约千分之三的模组在30秒长曝光下会出现数十个固定位置的亮斑,位置不随场景变化。当时产线停线三天,我们团队被拉去救火。

一开始怀疑是镜头脏污,但擦拭后白点依然存在。后来用纯黑帧(盖上镜头盖)抓raw图,发现这些亮斑的像素值比周围高出200-300个DN(12bit raw),而且位置在多次抓图后完全一致。确认是sensor本身的坏点——准确说是“热噪点”,因为它们在短曝光下几乎不可见,长曝光或高温下才暴露。

这个案例让我意识到:坏点校正不是简单的“找出来抹掉”,工厂端和在线端的策略完全不同,必须分开设计。

二、坏点与热噪点的本质区别

先理清概念,别把两者混为一谈。

坏点(Dead/Stuck Pixel):sensor制造缺陷,像素点永远输出固定值(全黑或全亮),不随光照变化。比如某个像素永远输出4095(12bit满量程),或者永远输出0。这类坏点出厂即存在,数量通常很少(几十个以内),位置固定。

热噪点(Hot Pixel):暗电流过大导致的异常像素。温度每升高10℃,暗电流翻倍。在长曝光(>1秒)或高温(>60℃)下,这些像素的暗电流积累远超正常像素,表现为亮点。热噪点数量随温度、曝光时间动态变化,可能从几个到几百个不等。更坑的是,有些像素在常温下正常,一发热就“冒”出来。

工厂检测主要针对坏点,热噪点则依赖在线校正。为什么?因为热噪点数量多、动态变化,工厂全检成本太高,而且出厂时环境温度低,很多热噪点根本测不出来。

二、工厂端:坏点检测的“三板斧”

产线检测讲究快、准、稳。我们当时用的方案分三步,每一步都有血泪教训。

第一步:暗场抓图

盖上镜头盖,用遮光布(别用手,指纹会干扰),抓取至少3帧全黑raw图。曝光时间建议设为1/30秒,别太长——长曝光会引入热噪点,干扰坏点判断。帧数取平均,消除随机噪声。

这里踩过坑:曾经用单帧检测,结果把随机热噪声误判为坏点,导致良率虚降。后来改成多帧平均,误判率从5%降到0.1%。

第二步:阈值筛选

对平均后的暗场图,计算每个像素的均值μ和标准差σ。坏点的判定标准是:像素值 > μ + k*σ。k值怎么定?经验值:对于12bit raw,k取6-8。太小了误判多,太大了漏检。

但别死套公式。不同sensor的暗电流水平差异很大,比如索尼IMX系列暗电流通常<10e-/s,而一些国产sensor可能到50e-/s。所以阈值必须针对每颗sensor标定,不能一刀切。

第三步:位置映射与存储

检测到的坏点坐标存入OTP(One-Time Programmable)区域。注意:坐标必须是sensor原生坐标,不能是经过Binning或Cropping后的坐标。否则在线校正时坐标对不上,白忙活。

存储格式建议用压缩的“游程编码”,因为坏点通常成簇出现。我们当时用4字节表示一个坏点(2字节行号+2字节列号),一颗sensor最多存200个坏点,OTP空间够用。

三、在线校正:热噪点的“动态围剿”

在线校正不能依赖OTP里的静态坏点表,因为热噪点是动态的。我们的方案分两级:粗校正和精校正。

粗校正:基于帧差法的热噪点检测

每帧raw图进来,先做帧差。具体做法:维护一个“参考帧”,通常是上一帧的raw数据。当前帧与参考帧逐像素相减,差值超过阈值(比如50 DN)的像素标记为候选热噪点。

别这样写:直接对当前帧做全局阈值。因为场景中的高亮物体(比如灯光)也会产生大差值,会误判。帧差法的前提是:热噪点位置固定,而场景内容会移动。所以需要配合运动检测——如果整帧差值都很大,说明场景在变化,此时跳过热噪点检测。

精校正:自适应中值滤波

检测到热噪点后,不能简单用邻域均值替换,否则边缘会糊。我们用的是“方向性中值滤波”:先判断热噪点所在区域是平坦区还是边缘区。

  • 平坦区:取3x3邻域的中值,简单粗暴。
  • 边缘区:沿边缘方向取一维中值。比如检测到水平边缘,就取左右各2个像素的中值。

怎么判断边缘方向?用Sobel算子算梯度,但别全图算,只算热噪点周围的5x5区域,计算量可控。

温度补偿:热噪点数量的“天气预报”

热噪点数量与温度强相关。我们在sensor模组里贴了热敏电阻(NTC),实时读取温度。根据温度动态调整检测阈值:

  • 温度 < 40℃:阈值设为50 DN,只校正最明显的热噪点。
  • 40℃ ~ 60℃:阈值降到30 DN,校正中等强度的热噪点。
  • 温度 > 60℃:阈值降到15 DN,全面校正。

这个策略来自一次惨痛教训:某次户外高温测试,手机温度飙到65℃,热噪点数量从几十个暴涨到上千个,阈值没调,结果画面全是白点。后来加了温度补偿,问题解决。

四、代码实现:别踩这些坑

下面给一段简化版的在线校正代码,用C语言风格,注释里写了我踩过的坑。

// 热噪点检测与校正函数// raw_in: 输入raw图,raw_out: 输出raw图,width/height: 图像尺寸// temp: 当前温度(摄氏度),ref_frame: 上一帧raw图voidhot_pixel_correction(uint16_t*raw_in,uint16_t*raw_out,intwidth,intheight,floattemp,uint16_t*ref_frame){// 根据温度动态调整阈值intthreshold;if(temp<40.0f){threshold=50;// 低温,阈值高,只校正明显的}elseif(temp<60.0f){threshold=30;}else{threshold=15;// 高温,阈值低,全面校正}// 遍历每个像素for(inty=1;y<height-1;y++){// 边界不处理,别越界for(intx=1;x<width-1;x++){intidx=y*width+x;intdiff=abs(raw_in[idx]-ref_frame[idx]);// 帧差检测,但需要排除场景运动// 这里简化处理:如果整帧平均差值大于100,认为场景在运动,跳过// 实际工程中需要更精细的运动检测if(diff>threshold){// 判断边缘方向// 计算水平梯度:|左-右|intgrad_h=abs(raw_in[idx-1]-raw_in[idx+1]);// 计算垂直梯度:|上-下|intgrad_v=abs(raw_in[idx-width]-raw_in[idx+width]);uint16_tcorrected;if(grad_h>grad_v){// 水平边缘,取左右中值// 别这样写:直接取左右均值,会模糊边缘// 应该取中值uint16_tneighbors[2]={raw_in[idx-1],raw_in[idx+1]};corrected=median_2(neighbors);// 2元素中值}elseif(grad_v>grad_h){// 垂直边缘,取上下中值uint16_tneighbors[2]={raw_in[idx-width],raw_in[idx+width]};corrected=median_2(neighbors);}else{// 平坦区,取3x3中值// 这里踩过坑:直接用冒泡排序取中值,太慢// 应该用快速选择算法,或者用硬件加速uint16_tneighbors[9];intn=0;for(intdy=-1;dy<=1;dy++){for(intdx=-1;dx<=1;dx++){neighbors[n++]=raw_in[(y+dy)*width+(x+dx)];}}corrected=median_9(neighbors);// 9元素中值,用快速选择}raw_out[idx]=corrected;}else{raw_out[idx]=raw_in[idx];// 正常像素,直接复制}}}// 更新参考帧memcpy(ref_frame,raw_in,width*height*sizeof(uint16_t));}

这段代码有几个关键点:

  1. 边界像素不处理,否则数组越界,程序直接崩。
  2. 中值滤波用快速选择算法(nth_element),别用冒泡排序,否则帧率掉一半。
  3. 运动检测这里简化了,实际工程中建议用帧间SSD(平方差和)或者光流法。

五、性能优化:别让校正成为瓶颈

在线校正如果处理不当,会吃掉大量CPU时间。我们的优化策略:

硬件加速:如果ISP有坏点校正硬件模块(比如高通平台的BPC模块),优先用硬件。硬件处理一帧只需要几十微秒,软件要几毫秒。

降采样检测:不需要全分辨率检测热噪点。可以先把raw图降采样到1/4分辨率(比如用双线性插值),在低分辨率图上检测热噪点位置,再映射回全分辨率校正。这样检测速度提升4倍,准确率几乎不变。

分时处理:热噪点检测不需要每帧都做。可以每5帧检测一次,中间帧直接用上一次的坏点表校正。因为热噪点位置变化很慢(温度变化才变),没必要每帧都算。

六、个人经验:给后来者的建议

  1. 工厂检测别省帧数:至少3帧平均,最好5帧。省帧数省出来的时间,最后都会变成产线返工的时间。
  2. OTP存储要留余量:坏点表空间至少留50%冗余。有些sensor用久了会“冒”出新坏点,OTP写满就没办法了。
  3. 在线校正阈值要保守:宁可漏检几个热噪点,也别误判正常像素。误判会导致画面出现“脏点”,比热噪点更难看。
  4. 温度传感器别省:热敏电阻成本几毛钱,但能解决80%的热噪点问题。没有温度反馈的校正方案,就像盲人开车。
  5. 测试用例要覆盖极端场景:低温(-20℃)下坏点可能“消失”,高温(70℃)下热噪点可能“爆发”。这些场景在实验室很难复现,但用户会遇到。建议用温箱做全温度范围测试。

最后说一句:坏点校正没有银弹。每颗sensor都有自己的“脾气”,最好的方案是“工厂标定+在线自适应”的组合拳。别指望一套参数打天下,那只会让你在产线投诉中焦头烂额。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询