ISP Pipeline AE
时间:2023-02-28 10:30:00
1 AEC简述
人眼具有自动调节功能,sensor是没有调节功能的,环境的亮度可以通过人眼来适应,因此人眼的亮度总是合适的。人眼是非线性化的,而相机是线性化的。
相机的视觉亮度取决于曝光设置。相机的亮度不合适,除非曝光改为适当的曝光设置。自动曝光,AE,适当的曝光设置会自动修改。
1.1 AEC原理
由Sensor统计当前环境的亮度信息(取帧),AEC算法将输入RAW图分为M* N个Region,然后统计每一个Region最后,加权平均得到当前亮度值cur_luma。
cur_luma和luma target对比一下,然后通过遍历曝光表找到合适的曝光时间和Gain值,从而达到目标亮度。请注意,这里AE随着时间的变化,所以有一个 AE 循环 变化的过程。
1.2 AEC几个重要概念
1.2.1 曝光表
曝光设置基本上是手机上的sensor的shutter, sensor gain和ISP gain,为了很好地调节亮度,三者需要相互协调。在实际需求中,我们对sensor和shutter有一定要求的,要避免flick,然后sensor gain不连续, ISP gain是连续的,所以对sensor的总gain如果我们是对的,可以随意设置值flick如果有一定的限制,曝光表的设置需要有规则来限制,在AE在收敛过程中,曲线更线性、更光滑。在这种情况下,我们ae table,一个可编辑的曝光表就是这样一个角色,我们会在那里ae 收敛,参考ae table,一步步确定收敛。
AEC 曝光表通过设置图像传感器曝光时间和传感器模拟增益控制图像亮度。 曝光表包括这些时间和增益组合。
/* Exposure Table */ {
... 453, /* Max Exposure Table Entries for EV0 */ 1, /* Enable Digital Gain for EV Lowlight */ 499, /* Max Exposure Table Entries for EV 2 with digital gain */ 274, /* Fix FPS AEC Table Index */ {
{
256, 1}, /* Gain= 1.000 Exposure Index=0 */ {
264, 1}, /* Gain= 1.031 Exposure Index=1 */ {
272, 1}, /* Gain= 1.063 Exposure Index=2 */ {
280, 1}, /* Gain= 1.094 Exposure Index=3 */ ... } }
453, /* Max Exposure Table Entries for EV0 * /
453代表曝光行数光行数index,再往后的index不会走。
274, /* Fix FPS AEC Table Index * /
274表示不降帧能达到最大值gain值,也可以理解为index。
AEC曝光表对应的图表如下:
1.2.2 AEC Zone
AEC Zone用于定义室内、室外、低亮等亮度条件。zone和trigger如下图所示:
各种条件下的参数在各自的场景下运行,以获得正确的效果。
/* Luma Targets */
{
3, /* Num Zones Used */
/* Triggers */
{
/* Zone 0 */
{
182, /* Start */
222, /* End */
},
/* Zone 1 */
{
372, /* Start */
442, /* End */
},
...
},
/* Luma Target Data */
{
/* Region 0 */
{
50, /* Outdoor Luma Target */
},
/* Region 1 */
{
45, /* Default Luma Target */
},
/* Region 2 */
{
25, /* Low-Light Luma Target */
},
...
},
},
如上有三个区域和两个触发点,理解可如下图理解。
1.2.3 Bright Region
对于亮度多样的场景, 确定最佳积分时间和 Gamma曲线是十分困难的。而在我们常见的室外场景中尤为明显, 因为明亮的天空会导致AEC降低传感器增益,从而使图像的其余部分过度暗化(曝光不足),此时如果降低亮区的权重,则会使其余部分增亮,但也会导致亮区部分亮度也会增亮,容易过曝。
180, /* Outdoor Bright Region Threshold */
高亮阈值,高于此亮度值视为bright region亮度值
1.200000f, /* Outdoor Bright Region Weight */
权重加大,会拉低上面亮度值的像素亮度。用于减轻过曝。大于1.0 的值会增加区域的偏置表权重,从而防止亮度饱和,即降低亮度。小于1.0的值将丢弃亮区,即忽视亮区。
0.250000f, /* Max Bright Percent */
用作亮区计算的一个百分比,比如一幅图分为64* 48个region,只有25%(此值是给定的一副图里面亮区相对所有region的占比)的统计为亮区。调整亮区最大百分比,亮区百分比高于此值的其他亮度部分不做调整。如下给出实例,可从图片的3A信息中看到亮区权重为1.2和亮区权重为1.5的差异。
1.2.4 Dark Region
Dark Region指亮度低于某个阈值时,可视为暗区。如果图像中暗区太多,会导致AEC的exp_time和gain偏大而图像偏亮。如拍摄存在大量黑色物体时,如果不做调整,会导致图像亮度偏高。
5, /* Low Threshold */
对低于该亮度值的区域应用最大暗区调整权重。
15, /* High Threshold */
低于该亮度值的任何区域被视为是暗区。
0.750000f, /* Weight */
暗区的权重,低于1.0 的值会丢弃暗区。避免过亮。
0.250000f, /* Max Dark Percent */
图像帧中要调整的所有暗区的最大百分比。如果暗区百分比超过该值,则暗区效果不应用于其余暗区。
1.2.5 Extreme Color
RGB颜色亮度计算公式:
Y = 0.299R + 0.587G + 0.114B
由公式可看出,在纯红、绿、蓝场景下,要达到luma target值的亮度时,需要更大的RGB值。比如纯红,则没有G和B分量。
Y=0.299R,没有G和B导致R需要更大才能达到luma target。因此,实际成像中需要更大的曝光值,从而导致拍摄大面积绿植、大面积深红色等场景过曝。
/* Color-Based Metering Enable */
3, /* Num Zones Used */
/* Triggers */
{
/* Zone 0 */
{
182, /* Start */
222, /* End */
},
...
},
/* Zone Data */
{
/* Zone 0 */
{
/* Adj Ratio */
{
0.800000f, /* R */
0.900000f, /* G */
0.800000f, /* B */
},
...
},
...
},
遇到极限色时候,我们可以将Color Based Metering Enable,然后调试extreme red/green/ bule ,将Adj Ratio <1来降低大面积绿植的亮度。