接着是曝光。最后sensor上面读到的数据等于曝光时间乘以光通量。因为传感器的敏感度是有限的,进光量很小的时候为了把照片拍出来就需要比较长的曝光时间,那么为了完整地获取图像的一帧,就需要帧率不能超过曝光时间分之一。自动获取图像模块就把曝光时间调大,一旦调大到帧率分之一还大,帧率就会降下来。 这里的第一个问题是rolling shutter。大家看到这里直升机的螺旋桨拍下来不是直的。因为当我们的成像的时候,图像上的像素不是在同时获得的,最上面的pixel可能是0.0001秒,第二行是0.0002秒。整张图像是扫描获得的,而物体运动足够快的时候,不同行获得的信息不一致,但扫描的过程是连续的,所以最后的图片就变成这样一个连续的扭曲了。 第二个是motion blur。同样拍运动物体。为了测量不同pixel上的进光量,就需要一个一段时间的积分。如果在那段很短的时间内有很多的snapshot,我们把它们叠加到一起。如果物体运动得够快,哪怕10毫秒可以造成图像很大的不同。在exposure的瞬间,物体已经跑了一段距离了,那么最后拿到的是积分的结果。比如识别路牌,motion blur 对此就很不利。 为了减少这两种问题,最好的方法是减少曝光时间,这意味着在成像过程中,会有更少的光子来。假设传感器的敏感度不变。不同的照片在不同的iso上拍的。由于成像系数在前面计算,不涉及量化的问题。如果把曝光减少,不调iso,图像就会变暗。而当曝光时间很小,猛调传感器系数时,就会出现噪音。因为传感器本来就有热噪声。所以曝光时间是一个矛盾的事情,太大了会blur,太小了有噪声。 我们再说到CCD上面。传感器上会发生两件事。 第一是饱和。光是线性的,为了拍出暗部,把亮的部分砍掉。意味着我们可以确定亮度范围,把超出的部分砍掉,然后去做量化。 这里会有几个问题。 我们为了拿到暗部的细节,就会丢掉亮部的细节。如果要使整张图片都没有饱和,为了留下亮部的细节。亮度除以一万倍,最亮才能fit到量化空间里。但暗部的细节就没有了。本质上说图片量化精度不够,而没有那么多量化点。我们会人为选择的量化范围。要不留下亮度的细节,要不留下暗部的。线性量化的时候,有时候量化精度不够,比如gif图像通常量化的层级不够。我们有时可以过渡。这些都是因为我们的传感器和处理电路的限制。一般的图像是8位。有些人要拿raw,就意味着拿CCD原始的东西。有的CCD里面的raw是10个bit或者12个bit一个变量,这样量化要好些。 最后是对模式转换器做最后的变化。前面全部是线性变化。这一步是非线性的变化,比如白平衡,色彩的矫正,伽玛矫正。这里面的伽玛通常是值的1.2次方或1.5次方。这个可以近似人眼对光强的反应。人眼的反应不是线性的。意味着暗部的量化精度高于亮部。大部分手机或单反拿到的图像。后面还有压缩等。这时候引入非线性意味着什么呢?比如我们要做人脸识别,要去掉或者归一化光照。假设pixel的值是线性。其实不是,都被处理过。真正做归一化,先要做intensity recovery。通过拍摄不同亮度的照片反求这个函数。因为是单调的函数,所以可以反过来算原来的线性空间的值。严格的做法是把值线性化,叫radiometric calibration。这是很多做vision task的第一步,但是很多被忽略了。这个是可以保证我们拿到的pixel 是线性化之后的值。如果做线性变换,同比增加亮度,拿到的值不是2:1。线性化之后以后比例才能一致,才能准确地把光照条件带来的variation去掉。 在这个过程中我们可能会丢失很多信息。尤其一个场景一旦饱和掉,不同pixel的值就都一样了。为了改善这件事,有个东西叫HDR,用最后从传感器拿到的图像重构光进入传感器前的场景。HDR其实是高动态范围的图像,最大值和最小值的差距很大。重构原理是因为拍照只留下设定的亮度范围,只有这一段会被量化。那么我们不断改变曝光量,得到这个序列当中各个亮度范围的细节,再把图像叠到一起。假设曝光时位置不变,那么每个pixel就可以对起来。我们把没有饱和的像素都选出来,做平均——这个首先要在线性化以后的值上做,把原来的值线性化——叠加完后拿到HDR图像,每个通道上的值都是一个浮点数,这样就可以表达很大的动态范围。 然而我们的vision不是孤立地看一个,要看很多像素。这些像素有固定的结构和pattern,local feature在很多vision task里面都要用到。 (责任编辑:本港台直播) |