本文介绍Camera Image Sensor的硬件结构和不同的Sensor曝光原理。
Sensor的硬件结构
每个像素的结构
加入知识星球与更多Camera同学交流
- 星球名称:深入浅出Android Camera
- 星球ID: 17296815
每个像素点的最上方有个微透镜,增加透光量。有镜头就有CRA的问题,超出一定角度的光线无法被收集,需要和镜头进行匹配。
sensor的纵向结构
光透过电路会发生反射,造成每个像素点之间的干扰。背照式的结构(感光层在电路的上方)不会受到电路的影响。
CFA(color filter array)
每个像素点上覆盖有一种颜色的滤光片,从而去感知每种颜色的亮度。
Bayer格式:绿色分量为总像素数的一半,红色蓝色为总像素的四分之一。
MONO sensor
由于滤光会带来亮度上的损失,有种MONO sensor,没有滤光片的处理,亮度会大大提高(有文章说可以提高四倍),但是这就感知不到颜色了,所以又叫黑白sensor。
光谱响应曲线
下图是IMX290每个红绿蓝滤光片的光谱响应曲线。
这是人眼视锥细胞对光谱的响应曲线
由于人眼和sensor对光谱的感应曲线不同,同一个物体感知到的颜色不同。因此颜色需要一个转换关系。ISP中的CCM(色彩校正矩阵)就此诞生,利用一个3×3的矩阵,将sensor感知到的RGB颜色,校准成我们看到的RGB颜色。
红绿灯变色问题
这里穿插一个监控摄像头常遇到的问题,拍红灯的时候,经常会拍成黄灯和白灯,这是为什么呢?
因为红灯的光谱在780~620nm之间,从光谱响应曲线中可以看到,红像素最敏感,然后是绿像素,最后是蓝色像素。
当感光度比较小的时候,红色像素的亮度远远大于绿色和蓝色,肯定是呈现出红色。感光度比较大时,绿色像素也能有很高的亮度,而红色像素早已经饱和了,不在增加,这个时候呈现的颜色就是红色+绿色=黄色。感光度很大的时候,RGB都饱和了,红绿蓝加在一起就是白色。
解决方法:
降低曝光
换用蓝玻璃IRCUT:在650nm以上的红光,绿像素的感应也很强。换用蓝玻璃IR可以有效减少绿像素的干扰。同时它也可以比较彻底的滤除630nm以上波长的红光,减少过曝的问题。
去马赛克
由于sensor每个像素点只能感知到一种颜色,因此想要得到每个像素点的RGB值,需要进行插值,这个过程就是去马赛克(Demosiac)。
IR-CUT
大家都知道,摄像头有个IR-CUT,那为什么要加IR-CUT filter 呢?IR-CUT是红外滤光片,可以滤除红外光。
从IMX290的光谱敏感性曲线可以看到sensor到了1000的波长还能进行光电转换,而人眼只能到700nm,也就是可以说sensor 的“可见光”和人眼的不一样,而且范围远远比人眼的要大。
那么就会导致什么问题呢,最大的问题就是颜色不一样,因为人眼是感受到的是在可见光在可见光范围内的响应,而sensor感受到的却是在400-1000范围内的响应。因此我们需要加上一个IR-cut 使sensor感受的波段和人眼一样。
还有一个原因:当光线进入镜头,由于折射率不同,可见光和红外光会在靶面的不同位置成像,IR-CUT可以减少红外光产生的伪像。
RGB-IR sensor
补充一种sensor,这种sensor不用IR-CUT,除了有RGB三种CFA,还增加了一种专门只通过红外光的CFA。由光谱图我们可以知道,普通sensor中的绿像素不仅仅能感知绿色,还能感知到红外波段的光,实际上是绿色+IR(红外光)。RGB-IR的sensor有个IR像素只感知红外光,两者相减就可以得到可见光的绿色。
这样就用数字滤光代替了IR-CUT。我觉得更有应用场景的地方在于,夜间场景下开红外灯,不仅可以感知到红外,还能感知到颜色,是一种待开发的黑光技术。
黑电平
黑电平(Black Level Correction)也就是黑色的最低点,以8bit数据来说,指在经过一定校准的显示装置上,没有一行光亮输出的视频信号电平。定义图像数据为0时对应的信号电平。
黑电平产生的原因:
CMOS传感器采集的信息经过一系列转换生成原始RAW格式数据。以8bit数据为例,单个pixel的有效值是0-255,但是实际AD芯片(模数转换芯片)的精度可能无法将电压值很小的一部分转换出来,因此,sensor厂家一般会在AD的输入之前加上一个固定的偏移量,使输出的pixel value在5(非固定)-255之间,目的是为了让暗部的细节完全保留,当然同时也会损失一些亮部细节,由于对于图像来说,我们的关注度更倾向于暗部区域,ISP后面会有很多增益模块(LSC、AWB、Gamma等),因此亮区的一点点损失是可以接受的。
sensor的电路本身会存在暗电流,导致在没有光线照射的时候,像素单位也有一定的输出电压,暗电流这个东西跟曝光时间和gain都有关系,不同的位置也是不一样的。因此在gain增大的时候,电路的增益增大,暗电流也会增强,因此很多ISP会选择在不同gain下减去不同的黑电平的值。
ISP pipeline中的黑电平校正(Black Level Correction) :
拍几张不同增益下的全黑图像,算出每个增益下对应的黑电平值。isp会在raw图之后减去这个黑电平值。这一般是ISP的第一步。
坏点
传感器芯片由于工艺的原因产生一些有缺陷的像素点,这些像素点可能比邻近的像素点更暗或者更亮。
ISP pipeline中的的坏点校正:
在判定某像素为坏点后,会根据邻近像素点的值计算得到一个值以替代该坏点。
Sensor的曝光原理
sensor的曝光时间和快门时间是一个概念,都是sensor的感光时间。曝光(快门)时间越长,图像就越亮。
当控制快门时间,仍然达不到期望的亮度,就需要调节sensor的感光度(ISO)。CMOS sensor的感光度就是它的增益。增益是用模拟或数字的方法进行放大,不可避免的会放大噪声,因此拍摄时一般快门优先。
当拍摄高速运动的物体或者手抖的时候,容易产生运动模糊,就需要降低快门时间。
sensor的曝光方式有两种,卷帘曝光和全局曝光。
卷帘曝光(rolling shutter)
sensor曝光是每一行依次开始曝光的,所以图像中每一行的起始曝光时间是不一致的,目前大部分sensor属于这种。下图是卷帘曝光拍摄高速运动的物体的现象。
这是IMX290的sensor曝光与输出示意图
IMX290 曝光序列
黄色区域是sensor处于感光的时间,蓝色区域是sensor每一行数据的输出时间,红色是曝光开始的时间。XHS是进行每个操作的最小时间单位。
从时间先后来看,一幅图像是从第一行开始曝光,一个XHS之后,再从第二行开始曝光,依次类推。图像的第一行曝光结束后,进行输出,输出数据的时间是一个XHS,依此类推。
卷帘曝光带来的问题
日光灯下有横条纹
日光灯属于频闪灯,跟当地的供电频率有关,如果当地的供电是50Hz的正弦波(国内),日光灯就会以100Hz的频率闪烁。sensor每行的起始曝光时间是不同的,这就导致了每一行曝光时的亮度不同。因此会出现横条纹
解决方法:
控制曝光时间是1/100的整数倍,这样每行的曝光时间都是一个周期的整数倍,亮度就保持一致了。
控制帧率为25/50帧,不能解决横条纹的问题,但是可以让每帧图像中的横条纹固定在相同的位置。1/25是1/100的整数倍,可以使不同图像中每一行曝光的开始时间都相差四个周期。保证了每张图像中同一行的亮度是一致的。
拍摄快速运动的物体会有失真
因为每一行曝光开始的时间不同,当物体快速运动时,每行抓拍下来的物体位置都不同,造成了物体的变形。
解决方法:
加大图像输出的速度(提高帧率也可行,本质上改变的就是输出速度)
调整抓拍的时间和角度,比如远处的车辆每帧移动的像素点较少,可以去抓拍稍远处的车辆
使用全局曝光的sensor
全局曝光(global shutter)
每一行的起始曝光和终止曝光的时间一致,目前只有电警设备上用到,价格昂贵。因为电警设备有爆闪灯,爆闪灯亮的时间很短。如果使用卷帘曝光的sensor,一幅图像才曝光几行灯就熄灭了,所以必须要用全局曝光的传感器。