基于FPGA的Bayer彩色自动白平衡设计与实现
在不同的光源或者天气条件下光谱特性是互不相同的,这被称之为色温。从物理意义上讲,人们看到的物体之所以呈现出特定的颜色,是因为光线照向物体时,物体所反射的光在人眼视觉系统中呈现出这种特定的颜色。也就是说,能看到的物体颜色不仅取决于其反射特性,而且还和照向物体的光线有关系,如一张白纸在钨丝灯下会偏橘黄色调,在荧光灯下会偏绿,而在日光下会有点偏蓝。自动白平衡的目的就是自动调整不同色温光照下图像的三基色分量的比例,使其看上去和标准光源下拍摄的颜色一致。
目前在工程上应用的自动白平衡算法主要有全局白平衡算法和局部白平衡算法两大类。全局白平衡算法以“灰度世界法”GWM(Gray World Method)为代表,其认为所拍摄的图像有丰富的色彩变化,R、G和B三色分量的统计平均值应该相等,并以该均值作为白平衡校准的依据。局部白平衡算法以“镜面法”PRM(Perfect Reflector Method)为代表,该算法认为一幅图像中最亮像素点对应于光滑或者镜子表面的物体,这样的像素点最大限度反映了照射光线的光谱信息,对这部分点做色彩信息统计并作为色温校正的依据。全局白平衡算法有较大的局限性,当场景过亮、过暗,或者色彩比较单一时,算法几乎完全失效。局部白平衡算法的关键在于寻找参考白点,而在户外拍摄的过程中,总是可以找到参考点的,文献[1]、[2]、[3]介绍了几种能精确寻找参考点的方法。
在工程上,需要对帧频较高的原始视频图像做实时的白平衡恢复,而目前的自动白平衡方法,算法复杂,计算时间较长,难以实现对视频流的实时处理。本文就针对以上问题,讨论了一种在FPGA上实现的、对视频流实时白平衡处理的自适应方法。
1 自动白平衡算法
在FPGA设计的过程中,采用局部白平衡的方法,主要有3个基本步骤:
(1)色温估计
色温估计是自动白平衡中最重要的一步,根据算法估计当前场景的色温,给增益计算提供依据。文献[1]利用“镜面法”,严格控制Y、Cb和Cr三分量的关系,在YCbCr空间定义了一个六面体的区域,凡是落入该区域的点都可以作为参考白点。文献[2]提出先对图像的R、G和B三个分量分别作直方图均衡化,然后将直方图均衡化后的图像转换到YCbCr空间,对转换后的Y分量进行边沿检测,在边沿包含的各个区域中寻找满足文献[1]条件的区域,作为参考白点区域。选择符合一定条件的区域而不是选择符合一定条件的点,可以提高参考点选择的准确性,但是直方图均衡化处理本身存在灰度级“简并”现象,这也是该文算法的不足。文献[3]直接在原图像的YCbCr空间,用LoG算子对Cb和Cr分别作色度边缘提取,获得的色度边缘即为参考白点区域。综合考虑参考点选择的准确性和电路设计的难易程度,本文选用文献[1]的方法选择参考点。
(2)增益计算
增益计算是在色温估计的基础上,求取色温修正系数的过程,主要有3种方法:
①查表法[1]。事先统计出一张表,记录不同的色温所对应的通道增益,具有速度快的优点。但由于表的容量有限,不能实现各种色温情况的连续调节。
②平均值法。对于参考白点区域有R=G=B,即Cb和Cr的分量为零。得到各通道的增益如下:
③迭代法。设G通道的增益为常数1,R和B通道的增益分别为?自,?滋。迭代法根据参考白点区域Cb和Cr的关系,通过不断地调节?滋和?自的值,便可得到各通道最终增益值。文献[1]中提到的方法,在场景出现大量色块时,容易出现色彩振荡现象。本文在其基础上做出了如下改进,增加对白点数目的判断:判断是否WhitePointNum>N,只有场景的白点数目大于阈值N时,才认为色温估计有效,这样能避免色温估计无效时对修正系数的误操作导致的色彩振荡。增加了对当前色温的判断:判断是否|Cb|+|Cr|M,如果小于阈值M,则认为修正后的图像已经达到白平衡,不做增益调节。文献[1]所示方法,只适应于相机的一次拍摄,而摄像机拍摄时间长,场景变化快,所以有必要对每帧或隔几帧图像做如图1的处理,以应对场景色温的变化。图1中?滋和?自的初始值为常数1,λ为迭代步长。
(3)色温校正
在获得各颜色通道的增益量后,按照下面的等式对原图像所有像素进行调整。
上述3种增益计算方法中,平均值法和查表法多用于对单张图片处理,迭代法用于对连续图片序列的处理。迭代法获得的修正系数,用于下一帧图像的色彩校正,每次色温估计都是在色彩校正的基础上进行的。
2 系统硬件结构
系统硬件结构如图2所示。
目前彩色CCD相机,分为3CCD全色相机和单CCD Bayer彩色相机两大类。全色相机中,光线被分光系统分为R、
- 基于DSP+FPGA的数字导弹飞控计算机设计(10-22)
- 一种基于FPGA+DSP的通用飞控计算机平台设计(07-08)
- 数据采集装置在某型控制器中的应用(01-21)
- 双端口RAM在单片机系统中的应用(03-08)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)