序言
失业在家无事,想到以后换方向不做自动曝光了,但是自动曝光的工作经验也不能浪费了,准备写一个自动曝光的教学,留给想做自动曝光的小伙伴参考。笔者当时开发自动曝光没有按摄影的av+tv=ev=bv+sv公式弄,而是按正确的增益=目标亮度/当前亮度*当前增益的公式去开发。
介绍
自动曝光算法的目的:已知当前raw图亮度、当前曝光时间、当前增益和目标亮度,当环境光发生变化的时候,是通过控制增益、曝光时间和光圈使raw图的亮度,保持在目标亮度附近。
下面开始对上面的话进行解释:
raw图:r gr gb b格式的图,借鉴rgb图,raw图在数据上可以看成一个mxnx4的图片
raw图的亮度:将全图的r gr gb b的像素值分别累加后除以每个通道像素点的个数求平均后按yuv计算公式算。
r_avg=r_sum/r_num
gr_avg=gr_sum/gr_num
gb_avg=gb_sum/gb_num
b_avg=b_sum/b_num
y=(0.299 * r_avg+ 0.2935 * (gr_avg+ gb_avg) + 0.114 * b_avg)
曝光时间和增益:曝光时间和增益可以看成一个乘法系数,该乘法系数不可以为0,因为硬件存在最小曝光时间(1行)和最小增益(1x),这个系数是作用在整个raw图上的,如果该系数发生变化,raw图的每个值发生同样倍数的变化。
当前raw图的亮度:当前raw图的亮度=当前环境的环境光*当前的曝光值
举个例子说明曝光时间和增益变动的影响
假设当前亮度下获取到一张raw图,该图的每个点的像素如下,已知当前的曝光时间和增益分别是10ms和1.5x,下面我们要给sensor下发一个新的曝光参数,新的曝光参数为曝光时间10ms和增益3x。对比前后2组曝光参数,可以发现,增益从1.5x变成了3x,扩大了2倍。因此如果当前raw图的像素值没有饱和,每个点的像素也扩大了2倍。
10ms 1.5x
10ms 3x(如果是20ms 1.5x 每个像素也是变成2倍)
目标亮度:预设一个值或者一组值,raw图的亮度要在这个值附近,一般是±5%范围内。
当环境光发生变化的时候,是通过控制增益、曝光时间和光圈使raw图的亮度,保持在目标亮度附近。
假设当前环境光亮度为c,曝光时间和增益提供的系数为w,当前的raw图的亮度为cur_y,目标亮度为tar_y。
假如tar_y/cur_y在0.95到1.05范围内,则认为当前曝光没问题。
假如tar_y/cur_y不在0.95到1.05范围内,且tar_y/cur_y=w2;则需要将曝光时间和增益提供的系数为w变成w*w2,当曝光值(曝光时间、增益和光圈(虽然我们这里没用到光圈)的积叫做曝光值)从w变成w*w2,画面亮度也要*w2,cur_y->cur_y*w2。tar_y/(cur_y*w2)=w2/w2=1,1在0.95到1.05范围内,亮度达到预期。
仿真代码
待续……