首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用Zynq-7000 All Programmable SoC 实现图像传感器色彩校正

使用Zynq-7000 All Programmable SoC 实现图像传感器色彩校正

作者:Gabor Szedo,赛灵思公司高级视频设计工程师 Gabor.szedo@xilinx.com
Steve Elzinga,赛灵思公司视频IP 设计工程师 Steve.elzinga@xilinx.com
Greg Jewett, 赛灵思公司视频市场营销经理 Greg.jewett@xilinx.com

赛灵思图像/ 视频处理内核和套件为相机开发人员提供了完美的原型设计平台。
图像视频传感器广泛用于手机、视频监视产品、汽车以及导弹系统等各种应用。几乎所有这些应用都要求白平衡校正(也称为色彩校正),以便生成无论是在日光、白炽灯、荧光灯下还是其它光照条件下都会产生与人眼视觉相一致的图像色彩。
对以前使用ASIC 或ASSP 器件的众多开发人员来说,现在用赛灵思FPGA或ZynqTM-7000 All Programmable SoC这样的可编程逻辑器件来实现自动白平衡校正可能会是一个全新的挑战。首先让我们看一下运行在嵌入式处理器上的软件(如运行在Zynq-7000 All Programmable SoC 上的ARM9 处理系统)是如何控制定制图像/ 视频处理逻辑来执行实时像素级色彩/白平衡校正的。
要了解是如何实现这一功能,首先需要了解色彩知觉和相机校准这些基本概念。
相机校准
要测量一个自身不发光或不透光的小型均匀表面物体反射光的色彩和强度,取决于三大函数:光源的光谱功率分布(I(λ))、表面材质的光谱反射特性(R(λ))、成像系统的光谱敏感性 (S(λ))。

检测器测量到的信号功率可表达为:

要得到有彩色图像,摄影与摄像设备与人眼一样,均使用有不同光谱响应的相邻传感器。人的视觉依赖三类光敏视椎细胞来形成色彩知觉。在开发基于人类感知的色彩模型时,国家照明委员会(CIE)定义了三个色彩匹配函数: 。这三个函数可视为三个线性光检测器的光谱敏感度曲线。三个线性光检测器可产生CIE XYZ 三色激励值Px、Py 和Pz,这三个值也被统称为CIE 标准观察者。
数字图像传感器主要采用两种方法测量三色刺激值。一种方法是在固有的单色光敏二极管上加一组滤色片阵列;另一种方法是使用堆叠光敏二极管测量光子吸收深度,这个深度与波长λ 成正比。
但这两种方法都不能产生与人眼相似的响应。因此,不同的光检测和复制设备的色彩测量值存在差异,即在拍摄具有相同(Iλ) 和(Rλ) 的相同场景,图像传感器的测量值与观测者的目测值之间也存在差异。
因此,相机校准的目的是转换和校正相机或图像传感器测得的三色刺激值,实现与CIE 标准观察者相符的光谱响应。
白平衡
您可观察自然光以及火焰、白织灯或荧光灯等不同光照条件下的任何物体发现人的视觉都会认为物体有相同的颜色。这种现象被称为“颜色适应”或者“色彩恒常性”。但是,如果相机不具备针对不同光源进行调整或自动补偿的功能,获得的色彩就会发生变化。而相机对这种情况进行校正的行为,就称为白平衡校正。

图1 右侧的等式分别用于描述光源的光谱、场景中各种物质的反射特性以及检测器的光谱敏感度。这三者共同决定最终的色彩测量。因此即便是采用相同的检测器,测量结果还是会把物体固有的色彩与光源的光谱混合在一起。只要满足下列条件,就有可能实现白平衡,或者说将固有的反射特性R(λ) 与光源的光谱I(λ) 分离:
• 采用启发法,比如光源上的空间频率限制,或者先验性地知道物体的色彩。例如,在日光下拍摄场景时,可以预计光源的光谱特性将在整个图像上保持恒定。与此相反,如果将图像投影到白屏幕上,光源的光谱特性会随像素发生显著的变化,但场景(幕布)的反射特性保持恒定。如果光源的特性和发射特性均有显著的变化,就难以将场景中的物体和光源区分开来。
• 检测器的敏感度S(λ) 和光源光谱I(λ) 在观测的光谱范围内不会为零。观测者无法获得光源光谱范围外物体的任何反射特性信息。例如,如果场景中用单色红光源照明,蓝色物体和绿色物体都会是黑色。


早期方法
在数字成像系统中,已知光源的相机校准问题可以表达为一个离散三维向量函数:

其中F(x) 为映射向量函数,x 为R、G、B 主要色彩分量的离散向量(一般为8 位、10 位或12 位)。根据是否要进行线性映射以及是否要独立校正色彩分量,该映射函数可按照表1分类。


冯• 克里斯假设
相机校准最简单也是最常用的方法就是依据冯• 克里斯假设[1]。这种方法旨在将色彩转换为LMS 色域,然后每个通道仅使用三个乘法器便可进行校正。该假设假定通过单独调整三种视椎细胞反应的增益,就可以实现人视觉系统的色彩恒定性。这三种视椎细胞反应的增益取决于感知环境,即色彩历史和周边环境。两个辐射光谱f1 和f2 的视椎细胞反应可以通过适当选择对角适应矩阵D1和D2 来匹配, 即, 使得D1•S•f1 =D2•S•f2,。其中S 为视椎细胞敏感度矩阵。在LMS(长中短波敏感视椎细胞反应域)中,有:


这种方法的优势在于相对简单,易于实现,仅使用三个并行乘法器,并将其作为数字图像传感器或图像传感器流水线(ISP)的一部分:


在实际实现中,使用RGB 色域替代LMS域来调整通道增益。一种颜色(以白色为代表)通常用相等的R、G、B 值来表示。但是,针对某种色彩调整感知视椎细胞反应或R、G、B 值不能保证其它色彩也得到如实表达。
分量校正
对任何特定的色彩分量,冯• 克里斯假设只能表达输入和输出之间的线性关系。假设用相似的数据表达(比如每分量8 位、10 位或12 位),除非 k 等于1.0,否则部分输出动态范围就无法使用,或者部分输入值对应于需要剪切或钳位的值。除了使用乘法器,还可以使用小规模的基于分量的查找表来表达任何定义输入/ 输出映射的函数。这样在一个模块中就可以实现传感器/ 显示器的非线性与伽马校正。在采用FPGA 图像处理流水线实现方案中,可以使用赛灵思伽马校正IP 模块来完成这一运算。

完整查找表
相机校准可为所有可能的相机输入三色刺激值分配预期值。我们可以将所有可能的输入RGB 值预期值存储在一个大型查找表中,但这种方案有两个弊端。第一个问题是内存大小。对10 位的色彩分量而言, 这个查找表将达到230 字(4GB)的深度,30 位的宽度。第二个问题是初始化值。一般来说,通过校正测量,只能建立数十到数百个相机输入值/ 预期输出值对。其余稀疏的查找表值必须通过内插得到。这种内插工作并不轻松,因为异构分量输入到输出函数并非是单调或平滑的。图2a 所示即为R、G、B 输入(行)输出(列)值的测量值与预期值对。


通过对内插得到的经验结果进行视觉评估(图2b),结果表明内插法与基于伽马校正和色彩校正矩阵的解决方案相比并没有明显的质量改进。大多数图像或视频处理系统均受制于对外部存储器的访问带宽。大型查找表要求使用外部存储器;逐像素访问需要很高的带宽;而且查找表内容是静态的(难以逐帧重新编程),会限制完整查找表解决方案在嵌入式视频/ 图像处理应用中的实际使用。


色彩校正矩阵
我们在本文中介绍的校正方法将向您演示如何采用3×3 矩阵乘法器进行坐标转换,旨在让测得的红、绿和蓝三种色彩分量正交化。这种方法与冯• 克里斯方法相比的优势在于所有三个色彩通道都参与了校正过程。比如,在调整绿色通道增益时,可以结合红色通道和蓝色通道的信息。另外,这种方法还适合用同一模块同步进行相机校准和白平衡校正,并逐帧更新矩阵系数以平滑匹配不断变化的光源。

白平衡校正使用的两种最简单的算法是灰度世界算法和白点算法。这两种方法均使用RGB 色域。
灰度世界算法[2] 依据这样的启发条件,即虽然场景中的不同物体有截然不同的颜色,场景颜色的平均值(红、绿、蓝三种颜色的平均值)应该是中性的灰色。因此,一帧中R、G、B 平均色值之差能体现出光源的颜色信息。校正的作用是进行色彩转换后使得到的平均色值完全相同。灰度世界算法相对容易实现。但是如果场景中出现大型运动物体,这种方法就会产生严重误差,导致原生的场景色彩掉色或变化。
白点算法[2] 依据这样的假设,即图像中颜色最浅的像素必定是白色或浅灰色。红色、绿色和蓝色通道最大值之间的差值提供的是与光源颜色有关的信息,校正的作用是进行色彩转换后让得到的颜色最大值完全相等。但是,要找出白点,就需要按亮度值对像素排序。另外可能还需要对排序后的列表进行时空滤波,抑制噪声伪影,最后将排序结果汇聚成唯一的白色三元色。使用白点法的优势是易于实现,缺陷则是会造成巨大的误差,可能导致原生场景的色彩掉色。另外这种方法的效果还容易被饱和像素削弱。
更加先进的方法发挥色域转换的优势。这样色度可以轻易地与色彩饱和度和亮度隔离,将三维色彩校正问题降低为一维问题。
例如,先进行色彩饱和度映射,在YCC、YUV、L*a*b* 或LuV 色域中建立二维直方图,然后围绕直方图底部周边建立一个凸壳。计算出UV 或(Cr,Cb)均值,用于校正色彩,让得到的色彩UV 或CbCr 直方图位于YUV、YCC、Luv 或Lab 域中的中性点或灰度点上。这些方法的优势在于能够得到更好的色彩表象,而缺陷则在于需要浮点算法才能实现。
所有上述的方法有一个共同的缺陷,就是如果曝光设置不当或者场景光照存在极度的动态范围,就会产生伪影。例如使用带原生色调的高亮光源照明,在图像中产生的饱和像素。典型如火焰位于焦点上的烛光照片,此时会导致完全饱和,图像上出现白色像素。
其它改善白平衡结果的方法
还有一种色彩校正方法就是将前景和背景分离。数码相机采用的自动对焦与矩阵测光相结合的方法,可以把镜头中心焦点周边的像素与靠近边缘的背景像素在空间上区分开来。这种方法假定拍摄的物体只有几种主要颜色,而且位于图像中心的焦点上。远处的物体靠近边缘,由灰度世界假设主导。

另一种方法围绕形状检测。面部或皮肤颜色检测有助于相机识别有预期色调的图像内容。这样只需要对有已知和预期的色调的像素进行白平衡校正。颜色校正就是将这些像素的颜色调整为贴近预期颜色。这种方法的不足之处就是分割和识别逻辑的成本不菲。
大多数商业应用采用适应图像内容和拍摄环境的策略,综合应用多种方法。[2]
用于相机校准和色彩校正的ISP
我们的实现方案采用如图3 所示的典型图像传感器流水线技术。我们采用赛灵思基于可配置逻辑的图像处理内核来构建ISP 的硬件部分(见蓝色方框)。同时,我们将相机校准和白平衡算法设计为运行在其中一个嵌入式ARM 处理器上的C 代码(见粉红色方框)。该ARM处理器还运行嵌入式Linux,为主机PC提供用户界面。


ISP 中与白平衡和相机校准有关的部分是一个反馈环路,包括:
• 图像统计模块,用于逐帧采集各域的统计数据;
• 嵌入式驱动程序和应用软件,用于逐帧分析统计信息并对色彩校正模块编程;
• 色彩校正模块,用于逐像素地执行色彩转换。

我们将该ISP 实现为Zynq 视频和成像套件(ZVIK)1080×60 相机图像处理参考设计的组成部分。
算法详解
为校准传感器的颜色,我们使用现成的颜色观察箱(X-Rite Macbeth Judge II)或灯箱。该设备有四个已知光的标准光源,分别用于模拟日光、冷白荧光灯、暖光荧光灯和白炽灯。我们还使用现成的色靶(X-Rite ColorChecker 24色标准色卡),其色标具有已知的反射特性以及RGB 与sRGB 预期值。

在开始实现相机校准算法之前,我们首先将色靶放置在灯箱中,与灯箱的灰黑色背景平行。我们将色靶调整到一定位置,让来自所有光源的光照尽量均匀。
接下来,在打开所有光源的情况下,我们采集由传感器拍摄的有待校准的图像,此时尚未进行色彩校正(使用“跳过”色彩校正设置:将单位矩阵加载至色彩校正矩阵)。
然后使用赛灵思提供的MATLAB®脚本协助补偿镜筒(几何形状)透镜畸变和镜头阴影(光强度在角落处下降)带来的影响。我们使用MATLAB 脚本找出图像上的控制点,然后弯曲图像,用以对筒形畸变进行补偿。脚本的其余部分用于根据寄存的ColorChecker 色靶背景来估算水平和垂直方向的光强度下降。
为衰减测量到的噪声,我们在色标中划出矩形区域。在这些区域中,我们计算出R、G、B 像素数据均值, 用RGB 三元色表达每个色靶。带GUI 的MATLAB 脚本可帮助找出色标的中心,然后计算出与每个色标的RGB 预期值(Re、Ge、Be)对应的平均RGB 三元色。


我们采用模拟退火优化法找出色彩校正系数和偏移量。然后使用图3 的色彩校正模块,将未经校正的(R、G、B)三元色转换为校正的(R’、G’、B’)三元色。

模拟退火算法的作用是求出一个能够返回标量的误差函数的最小值。在下面的讨论中,用Rk、Gk、Bk 表示测得的色标像素值的子集或超集。用户可以自行限制包含在优化(子集)中的色标数量,也可多次使用某个特定的色标,以增大其在优化过程中的相对权重。整数n 代表选优化的色标数量。如果一次优化全部色标,则对X-Rite ColorChecker 24 色标准色卡而言,n 则为24。
因为优化算法最多只能设置12 个变量(CCM 系数和偏移量),一般来说不存在有能够将所有测量值精确映射到预期色标值的解决方案。不过该算法的目的是求出误差函数的最小值,从而在所使用的所有色标上实现理想的误差分布。
我们设置的误差函数用于计算下列参数之一:
• RGB 色域中预期三元色和转换后三元色之间的方差和:

• RGB 色域中预期三元色和转换后三元色之间的绝对差和:

• YUV 色域中预期三元色和转换后三元色之间的方差和:

• YUV 色域中预期三元色和转换后三元色之间的绝对差和:

其中U’和V’对应的是R’G’B’值转换到YUV 色域的值。与此类似,误差函数也可设置用于L*u*v* 或是 L*a*b*色域。用户可将任何上述误差函数用于仿真退火求最小值。
白平衡
使用上面介绍的相机校准方法,我们建立了4 个色彩校正系数和偏移量(CCMk, k={1,2,3,4})。如果能够正确地识别光源,这4 个系数和偏移量就可实现理想的色彩表达。采用运行在嵌入式处理器上的软件实现的白平衡算法需要逐帧完成下列运算。首先根据统计信息估算光源权重(Wk)。权重经低通滤波后,用于补偿场景突变,得到光源概率(pk)。根据权重pk,使用CCMk 值对色彩校正矩阵模块进行编程。


这种方法的优势在于,即便场景色彩和光源色彩没有适当分离, 校准CCMk 值的线性组合也能限制色彩伪影形成。比如在水下摄影时会面临严重的蓝色调,如果采用灰度世界法等简单的白平衡算法,在补偿时会去除所有的蓝色,导致场景的原生色彩严重失真。
对灯箱中不同场景设置下的所有光源k={1,2,3,4},我们通过根据色度对像素值进行分档并根据亮度值对每个像素加权,还得到二维的场景YUV 直方图(亮度加权色度直方图)。这种方法可以去掉黑色像素,或者那些R、G、B 值存在少量差异就会在色度域中形成巨大噪声的像素。
我们使用掩码,去除可能造成典型光源照明条件下中性(灰色或白色)物体不可能产生的鲜艳颜色对应的直方图分档(图6)。典型的掩码包含的是仅围绕中性(白色)点周围的非零值,这里是大多数光源所处的位置。我们将有掩码的二维直方图值Hk(x,y) 和CCMk 值硬件编码到运行在嵌入式处理器上的白平衡应用中。


在实时运算过程中,白平衡应用负责采集相似的二维亮度加权色度直方图。然后给测得的二维直方图加掩码。最后
计算四个存储的直方图和测得的直方图之间的绝对差和或方差和:

其中Hk(X,Y) 是与已知光源{k=1,2,3,4} 有关的预先计算出的基准二维直方图,H(x,y)是实时测量的直方图。
根据测量的直方图偏差Dk,用下式计算标准化相似值:

为避免逐帧色调陡变,我们将标准化相似值按时间进行平滑处理。我们采用简单的低通IIR 滤波器,实现方法为:

其中0<c<1,用于控制iir 滤波器的脉冲响应。c="" 值越小,转换就越平滑。c="" 值越大,滤波器对光照条件变化做出响应的速度就越快。
最后,我们将预先计算出的色彩校正系数和偏移量(CCMk)线性合并,完成ISP 的色彩校正模块的编程(图3):

图7是自然光和荧光灯照明条件下,场景采用实时白平衡算法实现的结果,可以看出感知的图像质量和色彩表达的明显改善。

Zynq 视频与成像套件,加上赛灵思提供的MATLAB 脚本,为我们提供的算法提供了补充和实现范例。
随着工业、消费和汽车视频应用分辨率和帧率的提高,实时色彩平衡算法的难度正在不断增大。我们在本文介绍的算法阐述了如何使用运行在嵌入式处理器(诸如Zynq 处理平台采用的ARM9核)上的软件,控制执行像素级色彩校正的定制图像和视频处理算法。
参考资料:
1. H.Y.Chong,S.J.Gortler 和T.Zickler,《冯• 克里斯假设和色彩恒定的基础》,IEEE 计算机视觉国际大会会议纪要,2007 年。

2. S. Bianco,F.Gasparini 和R.Schettini,《白平衡综合策略》,2007 年国际光学工程学会(SPIE)纪要,第39 卷,65020D-65020D-9 页。
记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表