相机从RAW格式到相片生成过程

台湾那边的暑期项目马上就要开始了,在去台湾之前那边的导师让我做一个项目,就是通过raw格式转化到照片的处理过程,这个也是傅楸善教授的一个练功课,进入他们的实验室必须通过的一门“练功”的项目。

    想要知道什么是raw格式以及如何从raw格式到照片,我们首先必须了解什么是raw格式以及从raw格式到照片所必须经过的所有过程.

    raw格式是指从相机拍摄一个景象所得到的原始的数据,这个数据保存了包括CMOS或者CCD图像感应器将捕捉到的光源信号转化为数字信号的原始数据,RAW文件是一种记录了数码相机传感器的原始信息,同时记录了由相机拍摄所产生的一些原数据(Metadata,如ISO的设置、快门速度、光圈值、白平衡等)的文件。RAW是未经处理、也未经压缩的格式,可以把RAW概念化为“原始图像编码数据”或更形象的称为“数字底片”。

     那么有些研究者会觉得奇怪,为什么相机要存储的是raw格式呢?如果从图像的性质而言,每一个pixel都是一个三维的强度信号,相机若是想要得到照片的话,其实直接得到图像而不是得到raw格式不是更好吗?问题不是那么简单。

raw格式的文件相比于图像文件而言的优点,主要包括一下几个方面:

 ·1、RAW文件几乎是未经过处理而直接从CCD或CMOS上得到的信息,通过后期处理,摄影师能够最大限度地发挥自己的艺术才华。


   2、RAW文件并没有白平衡设置,但是真实的数据也没有被改变,就是说作者可以任意的调整色温和白平衡,并且是不会有图像质量损失的。

  3、颜色线性化和滤波器行列变换在具有微处理器的电脑上处理得更加迅速,这允许应用一些相机上所不允许采用的、较为复杂的运算法则。


  4、虽然RAW文件附有饱和度、对比度等标记信息,但是其真实的图像数据并没有改变。用户可以自由地对某一张图片进行个性化的调整,而不必基于一、两种预先设定好的模式。


 5、也许RAW最大的优点就是可以将其转化为16位的图像。也就是有65536个层次可以被调整,这对于JPG文件来说是一个很大的优势。当编辑一个图像的时候,特别是当你需要对阴影区或高光区进行重要调整的时候,这一点非常重要。



也就是说,对于一个相机而言,保存其原始的格式的重要性其实是不言而喻的,因为这样做可以保存下可供未来进行进一步处理的数据。



那么,从raw数据格式到普通的图像格式(例如jpg格式,bmp格式)需要经过多少步骤呢?







看上去确实有点乱,不过还好,我来一一解释一下:

Optical black:

       是指未感光但是仍然有值的部分,这个很让人费解,通常而言,有光学信号才会导致电流的产生,但是由于相机本身存在一定的电流信号,使得在有些像素中,即使未感光,也会导致暗电流的生成,使得像素上产生值,因此我们首先要进行的步骤,就是使用Optical black,将暗电流产生的信号进行消去。



White balance:

       对于一个相片而言,是非常重要的,raw格式的文件存储的格式只是一个图像的信号格式,但是,却不一定得到最好的图像效果,人眼其实是一个非常精妙的东西,它通过瞳孔的放大和缩小,可以适应不同的亮度环境,将所看见的视像调整到最好的效果,同样,例如我们长时间进入一个偏向红色的环境中,可以感觉到红色其实会变得不怎么红,别的颜色也会导致这样的情况。这个其实就是人的眼睛的一个Automatic White balance的功能,但是对于照相机而言可就没有那么那么厉害了,相机是死的,因此他不可能做到人眼所能做到的对图像的Automatic White balance的效果,因此,我们必须要设计一种算法,对图像进行一个White balance的功能。

不同的White balance所的得到的不同的效果(偏向冷色调或偏向暖色调)



处理前图像:                                                                                                       

处理后图像:



Color interpolation:

要理解这个操作的内容,我们首先要了解相机采像的基本原理:

对于一个单ccd 的camera而言,在进行取景的过程中,并不是对每一个点都进行RGB三个颜色都进行采样,而是对每一个像素点只采集某一个通道的值,如对某一个像素点只采集G值,或对另一个像素点只采集B值,至于该像素点的其他的通道值,则是通过临近的别的像素值进行某种方式的推测得到的。

多ccd 的camera和单ccd的camera:





采集到的间隔的数据





因此,为了要让每一个顶点都包含RGB值,必须采用某种算法,进行对未知像素的点进行别的通道的值的计算,当然,这里面的方法就有很多了,其中包括如Nearest Neighbor Interpolation,Bilinear Interpolation,Cubic B-Spline Interpolation,Cubic Convolution Interpolation等等。

Nearest Neighbor Interpolation:



Bilinear Interpolation:



Cubic B-Spline Interpolation



Cubic Convolution Interpolation:







gamma correction:

        Gamma曲线是一种特殊的色调曲线,当Gamma值等于1的时候,曲线为与坐标轴成45°的直线,这个时候表示输入和输出密度相同。高于1的Gamma值将会造成输出亮化,低于1的Gamma值将会造成输出暗化。总之,我们的要求是输入和输出比率尽可能地接近于1。在显示器、扫描仪、打印机等输入、输出设备中这是一个相当常见并且比较重要的概念。在计算机系统中,由于显卡或者显示器的原因会出现实际输出的图像在亮度上有偏差,而Gamma曲线矫正就是通过一定的方法来矫正图像的这种偏差的方法。一般情况下,当用于Gamma矫正的值大于1时,图像的高光部分被压缩而暗调部分被扩展,当Gamma矫正的值小于1时,图像的高光部分被扩展而暗调部分被压缩,Gamma矫正一般用于平滑的扩展暗调的细节。



图1 CRT显示器的亮度响应曲线图





图1显示的是一般CRT显示器的亮度响应曲线,可以看到其输入电压提高一倍,亮度输出并不是提高一倍,而是接近于两倍,显然这样输出的图像同原来的图像相比就发生了输出亮化的现象,也就是说未经过Gamma矫正的CRT显示器其Gamma值是小于1的。
没有经过Gamma矫正的设备会影响最终输出图像的颜色亮度,比如一种颜色由红色和绿色组成,红色的亮度为50%,绿色的亮度为25%,如果一个未经过Gamma矫正的CRT显示器的Gamma值是2.5,那么输出结果的亮度将分别为18%和3%,其亮度大大的降低了。


图2 按图进行曲线补偿
为了补偿这方面的不足,我们需要使用反效果补偿曲线来让显示器尽可能地输出同输入图像相同的图像,所以这个时候显示器的输入信号应该按照图2所示的曲线进行补偿,这样才能在显示器上得到比较理想的输出结果。



一般的反效果可以直接被赋予存储在帧缓存中的图像,使之Gamma曲线呈非线性,也可以通过RAMDAC进行这种反效果补偿(或者说是Gamma曲线矫正)。这样我们就可以在显示器上看到同我们输入的图像接近的图像了(如图3)。当然图3所示的曲线只是理想状态下的情况,在实际应用中我们并不可能得到如此完美的曲线,所以不同的厂商之间所竞争的就是谁能做到最接近于这个效果。


Hue Enhancement
Hue enhancement步骤是通过将RGB格式转化为HSI之后对颜色部分进行强化后得到的结果:
Hue指的是色彩值,在RGB格式内,色彩值是通过三维进行表述产生的,但是其实,当我们将这个三维的色彩空间转化到如下的格式时,我们可以看见,其实色彩Hue(色彩)可以通过表述角度得到

Saturation饱和度

HSI Color Space
Intensity

在使用对Hue/Saturation 进行强化的过程中我们采用一下的公式:

在β=0.6时效果最好

Edge Enhancement
edge enhancement是一种将边缘进行强化的方式这种方式能够将图像中的边缘进行强化使得边界能够变得更加明显:


enhance的方法主要包括:
Laplacian edge filter是一个边缘增强的算子,可以扩大边缘之间的差距


好了,以上就是所有的过程,得到的图像写入jpg或者bmp文件就可以了。


以上说了半天可能有些人会问:好像对于里面的原理没有仔细的说明,如何才能用代码实现呢?

首先必须说明一点,sony的格式对于raw格式进行了一定的加密操作,因此,需要通过一定的解密操作,解密的程序如下
c++解密程序的源代码:
http://www.zheyy.com/wp-content/uploads/2011/07/sony_raw_decrypt.zip
转化成照片的操作程序如下:
http://www.zheyy.com/wp-content/uploads/2011/07/GZYContest.zip
可能有些东西不能用,若需要了解程序的具体运行方式,请来邮件咨询~~~~~~~
[email protected]

猜你喜欢

转载自gaozheyuan.iteye.com/blog/1136537