如果做白平衡C语言算法,一种暗通道优先的快速自动白平衡算法

1 引言

色彩校正对于许多基于图像处理的应用非常重要,色彩的偏差可能导致图像处理结果的错误,如颜色识别、图像分类、图像重建、图像目标检测及跟踪等。人类的视觉系统能够自适应光源的变化,还原场景中真实的颜色,而图像传感器不具备自适应的功能。因此,不同色温的光源会导致图像颜色的偏差。白色物体在较低色温的光源照射下,图像会偏红;相反,如果在较高色温光源照射下,图像偏蓝[。为了解决这个问题,数字摄像机使用自动白平衡来模拟人类自适应系统。自动白平衡算法的目的是自动适应光照的变化。为了尽量减少算法过程中用户的操作,整个白平衡过程应该全自动完成。

在之前的文献中,提出的白平衡算法主要分为两类:1)基于假设统计学的;2)基于样本学习的。基于假设统计学的有GWM(grey world method)算法[,PRM(perflect reflector method)算法[,Grey-Edge算法[,自适应阈值算法等;基于样本学习的有Cheng等人提出的Regression Tree算法[,Barron等人提出的CCC算法[,Shi等人提出的DS-Net算法[等。GWM算法假定场景中的平均反射率是无色的,且在不同色温下的平均反射率是相同的。Max-RGB算法假定光源的颜色来自RGB中最大响应的通道。PRM算法假设图像中最亮像素点对应于镜子表面或者光滑的物体,这样的像素点最大限度反映了光照情况,而且含有大量光源信息。Grey-Edge算法提取图像的边缘,在边缘中提取若干个点作为假设白点进行校正。自适应阈值算法将图像分为若干个区域,对每个区域在YCrCb空间上计算分量均值,按照要求取前10%亮度的像素相对于Y通道来计算校正增益。基于假设统计学的方法对图像中白色区域或者白点检测不准确或者较少,影响白平衡的精度和效果;基于样本学习的方法普遍速度较慢且需要大量样本进行长时间的学习。

本文提出了一种稳定的自动白平衡算法,该算法不使用彩色分量来提取白色区域,而是使用了何凯明等人提出的基于暗通道优先的方法[来估计光照透射模型,通过估计到的光照透射模型来计算图像中白色区域,在检测到白色区域后,相对于图像的亮度分量Y来计算每个颜色通道的增益值。经过大量实验验证,本方法在精度和视觉效果方面相对于传统的基于假设统计学的方法有较大改进,且在低主频ARM平台上实现大于150 frames /s的速率,具有较强的实用性。

2 算法描述

定义g(x, y)是由图像传感器获取的一幅图像,f(x, y)是真实光照的图像,则传感器的成像模型我们可以定义为

$

g\left( {x,y} \right) = f\left( {x,y} \right)t\left( {x,y} \right) + A\left( {1 - t\left( {x,y} \right)} \right),

$

(1)

式中: (x, y)是图像中对应像素的坐标,t(x, y)是对应每个像素点的光线的透射率,A表示全局光照强度。通常情况下A是恒定的,定义如下:

$

A = \frac{1}{{W \times H}}\sum\limits_{x = 0}^{W - 1} {\sum\limits_{y = 0}^{H - 1} {\frac{{R\left( {x,y} \right) + G\left( {x,y} \right) + B\left( {x,y} \right)}}{3}} } ,

$

(2)

式中: R (x, y),G (x, y),B (x, y)代表偏色图像中对应(x, y)点的r,g,b通道的值。

根据暗通道的先验知识可以得到:

$

{D_{{\rm{dark}}}}\left( {x,y} \right) = \mathop {\min }\limits_{\left( {x,y} \right) \in \mathit{\Omega }\left( {x,y} \right)} \left[ {\mathop {\min }\limits_{\left( {r,g,b} \right)} \left( {f\left( {x,y} \right)} \right)} \right] \approx 0,

$

(3)

式中Ω(x, y)是(x, y)像素对应的一个邻域。对于一个小的邻域来说,光照透射率t(x, y)是恒定的,可以得到:

$

\begin{array}{l}

t\left( {x,y} \right) = 1 - \frac{{\mathop {\min }\limits_{\left( {r,g,b} \right)} \left( {{g^{\rm{c}}}\left( {x,y} \right)} \right)}}{A}\\

\;\;\;\;\;\;\;\;\;\; + \frac{{\mathop {\min }\limits_{\left( {r,g,b} \right)} \left( {{f^{\rm{c}}}\left( {x,y} \right)} \right)}}{A}t\left( {x,y} \right),

\end{array}

$

(4)

式中: gc(x, y)表示g (x, y)邻域中r,g,b通道的最小值,fc(x, y)表示f (x, y)邻域中r,g,b通道最小值。根据暗通道先验知识,式(4)中第3项为0,从而得光透射率图如

$

t\left( {x,y} \right) = 1 - \frac{{\mathop {\min }\limits_{\left( {r,g,b} \right)} \left( {{g^{\rm{c}}}\left( {x,y} \right)} \right)}}{A}。$

(5)

4ab3380b58d92507b61d99c8380c3bca.png

图 1 白色区域提取过程。(a)原始偏色图像;(b)暗通道图像;(c)估计出的光透射模型;(d)为最终提取的为稳定的白色区域。(图中红色框的区域从视觉来看是很明显的过饱和的区域,本文的算法在提取白色区域的时候有效的排除了这部分区域) Fig. 1 White region extraction process. (a) Original color cast image. (b) Dark channel image. (c) Light transmission model; (d) The final stable white region. (The region of the red frame from the visual point of view is very obvious in the supersaturated region, and our algorithm effectively eliminates this part of the region when extracting white regions.)

从式(2)、式(5)可以得到,图像中白色区域或者高饱和度区域的光线透射率较低,本文提出的算法就是根据以上特性来计算图像中白色区域。但是如果图像中存在比较强的光源或者高饱和度的区域,这些区域就会被错误检测为白色区域,最终导致结果出现较大偏差。为了解决这个问题,本文设置一个阈值来去除高饱和度区域。

$

T\left( {x,y} \right) = \left\{ {\begin{array}{*{20}{c}}

{255,}&{t\left( {x,y} \right) < {t_1};{g^{\rm{c}}}\left( {x,y} \right) < K}\\

{0,}&{{\rm{otherwise}}}

\end{array}} \right.,

$

(6)

式中:T (x, y)是对应的白色区域阈值变换之后的二值图像,K为本文设置的一个变换阀值。t1为平均透射率,如式(7):

$

{t_1} = \frac{1}{{W \times H}}\sum\limits_{x = 0}^{W - 1} {\sum\limits_{y = 0}^{H - 1} {t\left( {x,y} \right)} } 。$

(7)

为了得到可靠的阈值K,本文从测试数据集中随机选择了200幅含有较多高饱和区域的图像做统计实验,最终K的值选择为230,即大于230认为是过饱和区域。K值得到的平均误差和最小误差,可以看出,在K= 230时,最小误差和平均误差均最小。当K < 200时,很多真实的白色点被排除掉,导致找到较少白色点,最终误差较大;当K= 255时,即不限制饱和区域,从K= 230比不限制K值误差降低了约26%。

a1474fd570a90bb8a25e3e9565b2174f.png

图 2 不同阈值K的取值时的误差比较 Fig. 2 Error comparison of different K values

得到白色区域后,使用白色区域的均值来计算r,g,b三个通道的校正增益:

$

{W_{r,g,b}} = \frac{{\sum\limits_{\left( {x,y} \right) \in \left\{ {T\left( {x,y} \right) = 255} \right\}} \quad\;\; {g\left( {x,y} \right)} }}{{\sum\limits_{\left( {x,y} \right) \in \left\{ {T\left( {x,y} \right) = 255} \right\}}^n \quad \;\;{T\left( {x,y} \right)} }}。$

(8)

接下来可以根据计算的增益来校正图像,如果直接校正图像的话可能导致图像亮度发生较大的变化。这就需要对增益做归一化处理。

CIE-XYZ颜色空间能够很好地反映色度特性,因此本文使用CIE-XYZ颜色空间相对于Y来对R,G,B做归一化处理,根据CIE-XYZ空间定义可以得到Y通道的增益为

$

{W_Y} = 0.212671 \times {W_r} + 0.71516 \times {W_g} + 0.072169 \times {W_b}。$

(9)

通过Y通道的增益,用下面的公式来校正图像:

$

{f^w}\left( {x,y} \right) = g\left( {x,y} \right) \times \frac{{{W_Y}}}{{{W_{r,g,b}}}},

$

(10)

式中:fw为校正后的图像,WY为Y通道校正增益,Wr, g, b为r,g,b三个通道的校正增益。

在实际使用中,白平衡算法多数是在嵌入式系统上运行的,比如监控相机、工业照相机等。为降低功耗,这些设备往往都使用较低主频的ARM、DSP或者其他架构的嵌入式CPU来实现。这就需要白平衡算法具有较高的效率且较少的资源占用。为了提高算法效率,减少内存资源占用,在不影响效果的情况下对图像进行了采样处理。经实验证明,在1/16下采样时,对最终的结果不会产生较大影响。本文在第3章对不同下采样下的误差及耗时进行了比较。

3 实验结果及分析

为了验证算法的有效性,本文使用了常用的两个数据集来进行测试,一个是Color Check数据集[,一个是NUS 8-Camera数据集[。Color Check数据集包含了568张室内室外的图片,NUS 8-Camera数据集包含1736幅使用8个相机拍摄的不同场景的图片。为了保证不受图片中色卡的影响,在提取白色区域的时候屏蔽掉了色卡区域,并测试了算法在不同下采样率下的误差以及耗时。误差计算方法采用了文献[

$

E = \sqrt {C_r^2 + C_b^2} ,

$

(11)

式中:Cr,Cb分别表示图像中色卡对应的灰色区域r通道和b通道的色差,选取色卡中左下角白色的区域求色差的平均值。

表 1 算法在不同下采样下误差及耗时

Table 1 Error and speed of our method

下采样比例

最大误差

最小误差

平均误差

耗时/ms

1

12.48

2.00

6.40

96

1/2

12.16

2.44

6.70

31

1/4

12.56

2.23

6.63

22

1/8

12.56

2.82

6.92

11

1/16

13.22

2.44

6.85

5

1/32

13.37

3.31

7.28

4

从测试数据可以看出,算法在对图像下采样比例到1/16的耗时仅仅需要5 ms,且误差没有太多增加,比较适合在嵌入式系统中使用。

从测试集中随机抽取了室外、室内以及剩余的图片共计68张进行算法对比实验。分别与GWM、PRM、Grey-Edge、Ada-Threshold四种传统方法进行最大误差、最小误差以及平均误差的比较。

1e477b28529dbaf5520535e0e178d79b.png

图 3 室内图片五种白平衡算法对比效果图。(a)原始图像(53.95);(b) GWM (26.92);(c) PRM (27.02);(d) Grey-Edge (19.11);(e) Ada-Threshold (22.80);(f)本文算法(11.91) Fig. 3 White balance results of the indoor image using five different automatic white balance methods. (a) Original image (53.95); (b) GWM (26.92); (c) PRM (27.02); (d) Grey-Edge (19.11); (e) Ada-Threshold (22.80); (f) Our method(11.91).

e0bfe982105ea8e00c67a29d9c820a2e.png

图 4 室外图片白平衡算法对比效果图。(a)原始图像(59.03);(b) G WM (11.40);(c) PRM (11.70);(d) Grey-Edge (5.02);(e) Ada-Threshold (8.06);(f)本文算法(4.12) Fig. 4 White balance results of the outdoor image using five different automatic white balance methods. (a) Original image (59.03); (b) GWM (11.40); (c) PRM (11.70); (d) Grey-Edge (5.02); (e) Ada-Threshold (8.06); (f) Our method (4.12)

为了测试本文算法的鲁棒性,使用尼康D7100单反相机在自然场景下拍摄几组照片验证测试效果。分别在打开相机白平衡以及关闭相机白平衡下拍摄图片,再用本文的算法对图像进行颜色校正。

e80239dc5e6639a599525a000e9ae141.png

图 5 尼康D7100白平衡与本文算法的比较。(a), (d)原始图像;(b), (e)相机白平衡;(c), (f)本文白平衡 Fig. 5 White balance results using Nikon D7100 and our method. (a), (d) Original image; (b), (e) D7100 auto white balance; (c), (f) Our auto white balance

此外,为了验证本文算法的实用性,在HI3516D中进行图像1/16下采样,使用本文的算法替代芯片自带的白平衡算法,CPU使用率仅1%~3%,内存仅占用256 K左右,从白平衡效果来看,在视觉上图像效果优于芯片自带的算法。

fd2628b7bf716d33d86b525ad4946373.png

图 6 HI3516D白平衡与本文算法的比较。(a), (d)原始图像;(b), (e) HI3516D白平衡;(c), (f)本文白平衡 Fig. 6 White balance results using HI3516D and our method. (a), (d) Original image; (b), (e) HI3516D auto white balance; (c), (f) Our auto white balance

表 2 几种白平衡算法误差比较

Table 2 Max/Min/Mean error of white balance on testing

Dataset

GWM

Min/Max/Mean

PRM

Min/Max/Mean

Ada-Threshold

Min/Max/Mean

Grey-Edge

Min/Max/Mean

Our method

Min/Max/Mean

Indoor(18)

16.06/33.07/21.13

14.14/34.05/23.02

4.24/31.08/18.14

4.58/26.09/12.48

4.35/14.49/10.53

Outdoor(30)

8.06/20.29/12.32

9.38/23.06/16.24

5.38/16.40/9.38

1.41/13.33/7.41

1.41/11.09/5.29

Other (20)

8.60/19.94/14.17

7.61/28.17/20.19

2.23/17.29/11.95

2.0/16.30/6.40

2.44/10.44/5.83

4 结论

本文提出了一种通过暗通道优先算法提取白色区域来做自动白平衡的方法。经过大量实验验证,本文的方法可以准确的找出参考白点,不管对室内还是室外相比以前的传统方法误差平均降低了22%,同时在低主频ARM平台上做了算法验证,经过下采样后,在不影响精度的前提下,可以做到150 frames /s的速率,具有较好的实用价值。

对于文章中所定义的阈值K的取值,本文是用实验统计的方法得到的,下一部的工作将会用机器学习的方法来取得相对精确的K值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值