人眼是有自动调节功能,sensor是没有调节功能的,环境的亮度可以通过人眼来适应,因此人眼的亮度总是合适的。人眼是非线性化的,而相机是线性化的。
相机视觉的亮度取决于曝光设置。除非曝光改变到合适的曝光设置,否则相机的亮度不合适。自动曝光,AE,发挥作用,适当的曝光设置会自动修改。
由Sensor统计当前环境的亮度信息(取帧),AEC算法将输入的RAW图分为M* N个Region,然后统计每个Region的亮度,最后做加权平均得到一个当前亮度值cur_luma。
cur_luma和luma target做对比,然后遍历曝光表去找到合适的曝光时间和Gain值,从而达到目标亮度。注意,这里的AE是随着时间变化的,所以是有一个 AE 循环 变化的过程。
曝光的设定,在手机上面基本上就是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曝光表对应的图如下:
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 */
},
...
},
},
如上有三个区域和两个触发点,理解可如下图理解。
对于亮度多样的场景, 确定最佳积分时间和 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的差异。
Dark Region指亮度低于某个阈值时,可视为暗区。如果图像中暗区太多,会导致AEC的exp_time和gain偏大而图像偏亮。如拍摄存在大量黑色物体时,如果不做调整,会导致图像亮度偏高。
5, /* Low Threshold */
对低于该亮度值的区域应用最大暗区调整权重。
15, /* High Threshold */
低于该亮度值的任何区域被视为是暗区。
0.750000f, /* Weight */
暗区的权重,低于1.0 的值会丢弃暗区。避免过亮。
0.250000f, /* Max Dark Percent */
图像帧中要调整的所有暗区的最大百分比。如果暗区百分比超过该值,则暗区效果不应用于其余暗区。
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来降低大面积绿植的亮度。