3、RAW图分析工具:RAW图格式解析、坏点检测、黑电平校准工具使用
做ISP调试,第一步就是跟RAW图打交道。很多人一上来就调参数,结果图像偏色、有亮点、暗部细节全丢了——说白了,就是没把RAW图分析透。
我个人习惯,拿到一块新Sensor,先花半天时间把RAW图摸清楚。格式对不对?坏点多不多?黑电平稳不稳?这三件事搞不定,后面全是白费功夫。
3.1 RAW图格式解析
RAW图不是一张“图片”,它是一堆原始像素值。每个像素只记录一种颜色,要么R、要么G、要么B。这就是Bayer阵列。
| Bayer模式 | 排列方式 | 常见应用 |
|---|---|---|
| RGGB | 第一行 R G R G… 第二行 G B G B… |
最主流,Sony、OV多数Sensor |
| BGGR | 第一行 B G B G… 第二行 G R G R… |
部分安森美、三星Sensor |
| GRBG | 第一行 G R G R… 第二行 B G B G… |
少数OmniVision型号 |
| GBRG | 第一行 G B G B… 第二行 R G R G… |
部分车载Sensor |
你想想看,如果解析错了Bayer顺序,出来的颜色就是乱的。我曾经遇到过一版固件,Sensor输出的Bayer顺序跟Datasheet写的不一样,结果调试了三天才发现是格式配错了。
解析RAW图的关键步骤:
- 确认位深:10bit、12bit还是14bit?这决定了每个像素占几个字节。
- 确认Bayer顺序:用工具读第一行前四个像素,看R/G/B的排列。
- 确认数据排列:是连续排列还是交错排列?有些Sensor会做packing。
- 确认有效数据范围:黑电平到饱和值之间才是有效信号。
下面是我常用的RAW图解析流程,画成图你一看就明白:
小技巧:解析RAW图时,先读一个4x4的小块,用十六进制查看器确认像素值分布。我习惯用Python的numpy直接reshape,配合matplotlib显示,一眼就能看出Bayer顺序对不对。
3.2 坏点检测
Sensor生产过程中难免有瑕疵像素。坏点分两种:
- 死点(Dead Pixel):永远输出0或接近0,表现为黑点。
- 亮点(Hot Pixel):永远输出最大值或接近最大值,表现为白点。
嗯,这里要注意——坏点检测不能只看单帧。我遇到过一种情况,某个像素在暗场下是好的,一到亮场就飘了。这种叫“半坏点”,最坑人。
坏点检测流程
- 采集暗场:盖上镜头盖,拍一张全黑RAW图。
- 采集亮场:对着均匀光源,拍一张全白RAW图(不饱和)。
- 统计像素分布:计算每个像素在暗场和亮场的值。
- 设定阈值:暗场下超过阈值的→亮点;亮场下低于阈值的→死点。
- 生成坏点表:记录坏点坐标,后续ISP用这个表做校正。
⚠️ 重要提醒:坏点检测一定要在“黑电平校准之后”做!否则黑电平偏移会导致误判。我曾经因为先做了坏点检测后做黑电平校准,结果把正常像素当成了坏点,校正后图像反而多了很多暗斑。
下面是一个简单的坏点检测代码示例:
import numpy as np
def detect_bad_pixels(dark_raw, bright_raw, dark_thresh=100, bright_thresh=200):
"""
检测坏点
dark_raw: 暗场RAW图
bright_raw: 亮场RAW图
"""
hot_pixels = np.where(dark_raw > dark_thresh)
dead_pixels = np.where(bright_raw < bright_thresh)
bad_pixel_map = {}
for y, x in zip(*hot_pixels):
bad_pixel_map[(y, x)] = 'hot'
for y, x in zip(*dead_pixels):
bad_pixel_map[(y, x)] = 'dead'
return bad_pixel_map
经验之谈:阈值怎么设?我一般看暗场的直方图。正常像素集中在0~50之间,如果某个像素跑到100以上,基本就是亮点。亮场同理,正常像素应该在饱和值的80%~95%之间,低于50%的就要警惕。
3.3 黑电平校准工具使用
黑电平(Black Level)是Sensor在无光照情况下的输出值。理论上应该是0,但实际上因为暗电流、电路噪声等因素,会有个偏移。
说白了,黑电平校准就是把这个偏移减掉,让“真正的黑色”归零。
黑电平校准的两种方式
| 方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| OB(Optical Black)区域校准 | 利用Sensor边缘被遮挡的像素计算黑电平 | 实时、随帧更新 | OB区域可能受温度影响 |
| 全局固定校准 | 在暗场下统计全图均值作为黑电平 | 稳定、简单 | 无法适应温度变化 |
我个人更推荐OB区域校准。为什么?因为Sensor温度一上来,黑电平会漂。固定值校准的话,拍久了暗部就发绿或者发红。
黑电平校准工具使用步骤:
- 采集暗场RAW图:盖上镜头盖,曝光时间设为正常值。
- 提取OB区域:一般Sensor会在边缘留几行/列被遮挡的像素。
- 计算OB均值:分别计算R、G、B通道的OB均值。
- 设定校准参数:将OB均值写入ISP寄存器。
- 验证:再拍一张暗场,看全图均值是否接近0。
你想想看,如果黑电平没校准好,后面做白平衡、Gamma校正都会带着这个偏移。结果就是暗部偏色,怎么调都调不回来。
⚠️ 避坑指南:我曾经遇到一个项目,Sensor的OB区域只有4行像素,但其中一行有坏点。直接用这4行算均值,黑电平偏了5个LSB。后来我改成中位数滤波,去掉异常值,才把问题解决。所以——OB区域也要做坏点剔除!
黑电平校准前后对比
| 指标 | 校准前 | 校准后 |
|---|---|---|
| 暗场R通道均值 | 64.3 | 0.8 |
| 暗场G通道均值 | 63.8 | 0.5 |
| 暗场B通道均值 | 65.1 | 0.7 |
| 暗部信噪比 | 差(噪声明显) | 好(噪声被抑制) |
看到没?校准前三个通道的黑电平不一致,暗部就会偏色。校准后基本归零,暗部干净多了。
我的习惯:每次换Sensor型号或者改PCB布局,我都会重新做一次黑电平校准。因为电源噪声、走线长度都会影响黑电平。别偷懒,这一步省不了。
好了,RAW图分析这块就讲这么多。记住三个核心:格式解析要对、坏点检测要准、黑电平校准要稳。这三步走扎实了,后面的ISP调试才有意义。