本发明涉及一种对谷歌眼镜图像过度曝光的校正方法,属于计算机图像处理技术领域。
背景技术:
随着科技进步,越来越多的智能设备上配置了摄像头,比如手机、平板、甚至现在正处于发展阶段的可穿戴智能设备,比如Google Glass。随着这些智能设备在人们生活中的普及,人们对设备所能提供的摄像质量也有了越来越高的要求。在日常的摄影中,比较常见的问题就是曝光不足和过度曝光这两种情况所带来的图片细节的丢失。
在数码摄像中,曝光量指的是到达摄像头感应器的光量。理想的曝光情况是最后得到的图像能准确地反映实际场景或者物体的实际样子。但由于一般的摄像头所能捕捉到的亮度动态范围很有限,因此在不理想的光照条件下可能会出现图像曝光过度或者不足等现象。图像的过度曝光意味着在一些过亮的区域会出现一些细节的丢失,导致那些区域呈现出全白或者褪色的效果。这也可以称之为图像的饱和或者过饱和现象。这种现象主要出现在图像的感应器没有办法捕捉到正确的曝光量的时候,因为此时场景中部分区域的亮度动态范围会高于摄像头感应器有限的动态范围(或者叫曝光范围)。动态范围的定义是场景里最大亮度和最小亮度之间的比例。
日常生活中很多强光下的场景都具有很大的亮度动态范围,并远远超过了一般图像感应器所能接受的范围。例如,一般摄像头的亮度动态范围是103:1,而室外太阳光直射下的场景或室内高强度灯直射下的区域的亮度动态范围一般是从105:1到109:1的。当用低亮度动态范围的摄像设备去记录这样高亮度动态范围的场景,场景中的一些亮的部分就会因为曝光量过度而在图像中呈现全白或者褪色的样子。换句话来说,这些过度曝光的像素点的亮度值在最大值(假设1代表亮度最大值)处被修剪,以至于这些像素点只能显示出白色,因为它们对应的三个色彩通道(红、绿、蓝)的数值都是最大值(255)。相反,曝光不足区域的亮度值又因为太小,太接近最小值(假设0代表亮度最小值)以至于图像的细节难以被肉眼识别。
实际中,对过度曝光情况的改善可以通过设备的改进和调节来实现。在色调映射技术的基础上,亮度处于高动态范围的图像通过映射到低动态范围来避免过度曝光的发生。然而,可以处理高动态范围内亮度的摄像头往往太贵了。另一种现存的高动态亮度范围的捕捉方式通常需要多个在不同曝光条件下的拍摄。但是那样的方法是有一定限制的,因为实现这个方法需要场景本身是静态的。而且,这种方法只能用于生成新的接近正常曝光的图像,却没办法修复现存图像中过度曝光的区域。
本算法目标侧重于改善在过亮环境下得到的图像中过度曝光的区域。在有效减少过度曝光区域的同时,算法也提高了图像的色彩对比度,一定程度恢复了图像细节。
技术实现要素:
本发明的目的是提出一种对谷歌眼镜图像过度曝光的校正方法,以谷歌眼镜采集到的整体过度曝光图像样本作为主要切入点,在以往处理过度曝光图像算法的基础上,提出可以用于所有在强光环境下得到的具有相似过度曝光特征的图像样本的处理算法,更全面地从色彩和亮度两个角度修复图像丢失的色彩细节和图像的亮度。
本发明提出的对谷歌眼镜图像过度曝光的校正方法,包括以下步骤:
(1)对过度曝光的谷歌眼镜图像进行直方图均衡化,具体包括以下步骤:
(1-1)计算过度曝光的谷歌眼镜图像的直方图:利用下式计算过度曝光的谷歌眼镜图像的直方图概率分布Pr(rk):
其中,N为一幅过度曝光的谷歌眼镜图像中的像素点总数,nk表示直方图中第k灰度级中像素点的个数,rk表示直方图中第k灰度级,Pr(rk)表示第k灰度级的直方图概率分布;
(1-2)对上述步骤(1-1)中的直方图概率分布进行改写,得到与上述灰度级rk相对应的新直方图概率分布数值Pr'(rk):
其中,对步骤(1-1)中的每一个灰度级对应的概率分布数值进行开根号处理;
(1-3)根据上述步骤(1-2)的新直方图概率分布数值,利用下式计算过度曝光的谷歌眼镜图像的直方图的累积分布函数,从而得到过度曝光的谷歌眼镜图像的直方图的原始灰度级rk和新灰度级r'k的映射关系:
Sr(rk)=Sr(rk-1)+Pr'(rk)
其中,Sr(rk)表示过度曝光的谷歌眼镜图像中从第一个直方图灰度级到第rk直方图灰度级的累积分布概率,设定新灰度图的灰度级个数为255,则基于累积分布概率得到最后输出图像的新灰度级如下:
r'k=cvRound(255*Sr(rk)+0.5)
上式中,cvRound(·)表示取整函数,r'k表示过度曝光的谷歌眼镜图像的直方图原始灰度级为rk所对应的新灰度级;
(1-4)根据上述步骤(1-3)得到的原始灰度级和新灰度级的映射关系,得到过度曝光的谷歌眼镜图像的新直方图,并通过新直方图输出处理后的过度曝光的谷歌眼镜图像;
由于上述步骤所针对的过度曝光的谷歌眼镜图像本身是三通道彩色图像,而上述步骤中的改进直方图均衡化算法是针对于单通道灰度图像。因此,在将步骤(1-1)到(1-4)应用到过度曝光的谷歌眼镜图像前,需要先将该图像分为(split)R、G、B三个单通道,然后分别对三个单通道图进行由步骤(1-1)到(1-4)组成的改进直方图均衡化处理,最后再将处理后得到的三个新单通道图合并为(merge)改进后的谷歌眼镜图像。
(2)在色调饱和度亮度色彩空间内对上述步骤(1)得到的谷歌眼镜图像的I分量进行亮度修正,具体包括以下步骤:
(2-1)对谷歌眼镜图像从红绿蓝色彩空间到色调饱和度亮度色彩空间的转换,包括以下步骤:
(2-1-1)利用下式计算上述步骤(1)得到的谷歌眼镜图像中的每个像素点(i,j)的色调H分量:
其中,B是上述步骤(1)得到的谷歌眼镜图像的蓝色分量值,G是上述步骤(1)得到的谷歌眼镜图像的绿色分量值;
(2-1-2)步骤(2-1-1)的色调H分量公式中θ的求值公式如下:
其中,R是上述步骤(1)得到的谷歌眼镜图像的红色分量值,B是上述步骤(1)得到的谷歌眼镜图像的蓝色分量值,G是上述步骤(1)得到的谷歌眼镜图像的绿色分量值;
(2-1-3)利用下式计算上述步骤(1)得到的谷歌眼镜图像中每个像素点(i,j)的饱和度S分量:
其中,R是上述步骤(1)得到的谷歌眼镜图像的红色分量值,B是上述步骤(1)得到的谷歌眼镜图像的蓝色分量值,G是上述步骤(1)得到的谷歌眼镜图像的绿色分量值;
(2-1-4)利用下式计算上述步骤(1)得到的谷歌眼镜图像中每个像素点(i,j)的亮度I分量:
其中,R是上述步骤(1)得到的谷歌眼镜图像的红色分量值,B是上述步骤(1)得到的谷歌眼镜图像的蓝色分量值,G是上述步骤(1)得到的谷歌眼镜图像的绿色分量值;
(2-2)利用上述步骤(2-1)计算得到的谷歌眼镜图像中每个像素点的色调H、饱和度S、亮度I分量值,对谷歌眼镜图像的亮度I分量进行调整,具体包括如下步骤:
(2-2-1)利用下式等距压缩谷歌眼镜图像中所有像素点亮度I分量值的分布区间:
其中,Ii表示图像中第i像素点的原始亮度值,I'i表示图像中第i像素点压缩或提高后的新亮度值。μ1表示当图像中像素点亮度值Ii大于0.5时的压缩因子,而μ2表示当图像中像素点亮度值Ii小于0.5时的提升因子,此处取μ1=0.75,μ2=0.8;
(2-2-2)利用下式整体降低谷歌眼镜图像中所有像素点亮度I分量值的波动,首先计算出谷歌眼镜图像所有像素点亮度值的总体均值I'mean,然后再分别计算每个像素点经过步骤(2-2-1)处理后得到的新亮度值Ii'和总体均值I'mean之间的差值,再在这些差值的基础上求出总体的波动因子dif,计算公式如下:
根据上式,求dif的过程具体分为以下三步:
(2-2-2-1)分别对每个像素点的亮度值Ii'和亮度总体均值I'mean之间求差值,然后将这些差值相加得到总和∑|I'i-I'mean|;
(2-2-2-2)对(2-2-2-1)中得到的所有像素点对应的亮度差值求平均值,得到所有像素点亮度差值的平均值为其中N表示像素点总数;
(2-2-2-3)对(2-2-2-2)中得到的亮度差值平均值进行一定的压缩,最后得到总体波动因子dif。此处μ3为压缩因子,表示对亮度差值平均值的压缩程度,取μ3=2;
(2-2-3)在得到总体波动因子dif后,根据每个像素点的亮度值Ii'和总体亮度均值I'mean之间的差值大小分别对每个像素点的亮度值Ii'做如下处理:
其中,I'i为谷歌眼镜图像中第i像素点在第(2-2-1)步处理后得到的亮度值,I”i为谷歌眼镜图像中第i像素点在第(2-2-3)步处理后得到的最终亮度值;如果谷歌眼镜图像中第i像素点的亮度值I'i加上总体波动因子dif后不大于总体亮度均值I'mean,该像素点的最终亮度值I”i=I'i+dif;反之,如果谷歌眼镜图像中第i像素点的亮度值I'i减去总体波动因子dif后不小于总体亮度均值I'mean,该像素点的最终亮度值I”i=I'i-dif;其他情况下I”i=I'i不变;
(2-3)亮度I分量经过步骤(2-2)处理后的谷歌眼镜图像从HSI色彩空间到RGB色彩空间的转换:将经过步骤(2-2)处理后的谷歌眼镜图像的新的亮度I分量I”、色调H分量和饱和度S分量合并后得到新的HSI图,由于最后输出的图像应该是RGB图,因此输出最终谷歌眼镜图像前需要将新的HSI图转换成对应的RGB图;首先将代表谷歌眼镜图像色调H的横截面分为三个相隔120°的扇区,然后根据色调H的值在不同扇区的分布情况分别进行如下计算:
(2-3-1)RG扇区,0°≤H<120°,当H分量位于该扇区里时,对应的谷歌眼镜图像新的R、G、B三个通道的值R’、G’、B’分别可以用如下公式计算得到:
B'=I”(1-S)
G'=3I”-(R'+B')
其中,I”是经过步骤(2-2)处理后的谷歌眼镜图像的新的亮度I分量,R’是经过步骤(2-2)处理后的谷歌眼镜图像对应的新的红色分量值,B’是经过步骤(2-2)处理后的谷歌眼镜图像对应的新的蓝色分量值,G’是经过步骤(2-2)处理后的谷歌眼镜图像对应的新的绿色分量值;
(2-3-2)GB扇区,120°≤H<240°,当H分量位于该扇区里时,在计算谷歌眼镜图像新的R、G、B三个通道的值前先要对H分量的值做如下处理得到新的H’:
H'=H-120°
然后,对应的谷歌眼镜图像新的R、G、B三个通道的值R’、G’、B’分别可以用如下公式计算得到:
R'=I”(1-S)
B'=3I”-(R'+G')
(2-3-3)BR扇区,240°≤H<360°,当H分量位于该扇区里时,在计算谷歌眼镜图像新的R、G、B三个通道的值前先要对H分量的值做如下处理得到新的H’:
H'=H-240°
然后,对应的谷歌眼镜图像新的R、G、B三个通道的值R’、G’、B’分别可以用如下公式计算得到:
G'=I”(1-S)
R'=3I”-(G'+B')
(2-4)亮度I分量经过整体调整后的图像对应的HSI图转换成RGB图后就可以得到经过全局算法修复过后的过度曝光谷歌眼镜图像;
(3)基于CIELAB色彩空间对经过步骤(2)处理后得到的谷歌眼镜图像中依然过度曝光严重的区域进行局部亮度恢复,具体包括如下步骤:
(3-1)对经过步骤(2)处理后得到的谷歌眼镜图像进行RGB色彩空间到CIELAB色彩空间的转换,转换过程分为如下两个步骤:
(3-1-1)RGB转XYZ:设r、g、b分别代表经过步骤(2)处理后得到的谷歌眼镜图像中每个像素点(i,j)对应的R、G、B通道初始值,取值范围为[0,255],而r’、g’、b’分别表示经过这一步转换后得到的新值,转换的计算公式如下:
其中gamma函数是用于对图像进行非线性色调编辑的,它的目标在于对原始色彩分量的值进行校正,并提高图像的对比度,公式的作用如下:
在利用gamma函数对谷歌眼镜图像中每个像素点(i,j)对应的R、G、B通道初始值r、g、b进行处理后,可以进一步通过对R、G、B通道此时的新值r’、g’、b’进行进一步的处理来得到所要求的X、Y、Z的值,其中进一步处理对应的转换公式如下:
其中,矩阵M如下:
将矩阵M代入后,转换过程相当于如下公式:
X=r'*0.4124+g'*0.3576+b'*0.1805
Y=r'*0.2126+g'*0.7152+b'*0.0722
Z=r'*0.0193+g'*0.1192+b'*0.9505
(3-1-2)XYZ转LAB:通过对谷歌眼镜图像中每个像素点(i,j)对应的X、Y、Z的值进行进一步转换得到L*、a*、b*的值,转换的计算公式如下:
L*=116f(Y/Yn)-16
a*=500[f(X/Xn)-f(Y/Yn)]
b*=200[f(Y/Yn)-f(Z/Zn)]
其中,Xn、Yn、Zn一般默认值为95.047、100.0、108.883,而上面计算公式中出现的f函数如下:
此处计算得到的L*、a*、b*的值就是步骤(2)处理后得到的谷歌眼镜图像进行RGB色彩空间到CIELAB色彩空间转换后对应的LAB色彩空间三个通道的值;
(3-2)检测步骤(2)处理后得到的谷歌眼镜图像中依然过度曝光严重的区域:定义一个过度曝光映射矩阵M来记录谷歌眼镜图像中每个像素点被过度曝光影响的严重程度。谷歌图像第i个像素点在矩阵M对应的Mi值计算公式如下:
其中,Li代表了谷歌图像第i个像素点对应的L*值,Ci代表了谷歌图像第i个像素点对应的向量(a*,b*)T,LT和CT代表了谷歌眼镜图像中过度曝光区域像素点所能取的边界值,当LT和CT的值都等于过度曝光区域边界值时,M的值等于0.5;δ=1/60,LT=80,CT=40,谷歌眼镜图像中像素点对应的值Mi<0.5说明该像素点是正常曝光像素点,属于正常曝光区域反之像素点对应的值Mi≥0.5说明该像素点是过度曝光像素点,属于过度曝光区域Ω;
(3-3)对步骤(2)处理后得到的谷歌眼镜图像中依然过度曝光严重区域亮度L*的恢复分为如下步骤:
(3-3-1)采用色调映射的方法来压缩谷歌眼镜过度曝光图像中正常曝光区域的动态范围,步骤如下:
(3-3-1-1)定义一个过度曝光似然性矩阵P来衡量谷歌眼镜图像中过度曝光区域Ω的每个像素点i在亮度L*恢复后得到的输出图像中依然是过度曝光的可能性。通过如下计算公式得到每个像素点i的Pi值:
其中,K是归一化因子,K的取值使得针对经过步骤(2)处理后的谷歌眼镜图像中所有像素点在矩阵P中对应的值所能取到的最大值Pi=1,K的取值公式如下:
其中,Mmax代表了步骤(3-2)中计算得到的谷歌眼镜图像对应的过度曝光映射矩阵M中最大值。
(3-3-1-2)对谷歌眼镜图像中不同曝光类型区域内像素点i的梯度拉伸函数z(.)定义如下:
其中,表示谷歌眼镜图像第i个像素点亮度L*即Li的梯度,表示为分别在x轴和y轴的分量即对进行拉伸相当于对在x轴和y轴的分量进行同步拉伸。其中||·||等同于表示的是二范数。二范数的定义如下:
因此,的值可以表示成求Li的梯度时,在x轴方向上和在y轴方向上需要分别遵循如下公式(其中gradX(u,v)表示谷歌眼镜图像第u行第v列的像素点对应的L*值在X轴方向的梯度,gradY(u,v)表示谷歌眼镜图像第u行第v列的像素点对应的L*值在Y轴方向的梯度):
在X轴方向,
其中,L(u,v+1)、L(u,v)、L(u,v-1)分别代表谷歌眼镜图像第u行第v+1列、第u行第v列、第u行第v-1列的像素点对应的L*值,width表示谷歌眼镜图像像素点的列数。
在Y轴方向,
其中,L(u+1,v)、L(u,v)、L(u-1,v)分别代表谷歌眼镜图像第u+1行第v列、第u行第v列、第u-1行第v列的像素点对应的L*值,height表示谷歌眼镜图像像素点的行数。
另外,z(·)中的α和β是用于控制谷歌眼镜过度曝光图像中的像素点亮度L*压缩比例的两个参数。其中,α用于控制谷歌眼镜过度曝光图像中的像素点i亮度L*即Li被压缩的最小梯度值,因此一般设为平均梯度大小的十分之一。β用于控制谷歌眼镜过度曝光图像中的像素点i亮度L*即Li梯度压缩的压缩比例,取0.8。
β=0.8
在确定了L矩阵的梯度值并对谷歌眼镜过度曝光图像的正常曝光区域进行适度的压缩后,接下来的步骤就是计算新的亮度矩阵L'。
(3-3-2)计算能量公式:
计算得到的新亮度矩阵L'要满足如下两个条件:
(3-3-2-1)第一个条件是谷歌眼镜过度曝光图像处理后所得新图像的亮度梯度值要尽可能和原始图像的亮度梯度值相似。此处引入第一个需要进行最小化处理的能量公式ε1如下:
其中,表示谷歌眼镜过度曝光图像中第i像素点在原始亮度矩阵中对应的梯度值,表示谷歌眼镜过度曝光图像第i像素点的在新亮度矩阵中对应的梯度值,表示是二范数的平方值,即
(3-3-2-2)第二个条件是谷歌眼镜过度曝光图像中过度曝光区域Ω的像素点i对应的新亮度值L'i和原始亮度值Li不会相差太大。此处引入第二个需要进行最小化处理的能量公式ε2如下:
其中|Ω|表示谷歌眼镜图像的过度曝光区域Ω中像素点的个数,Pi表示步骤(3-3-1-1)得到的谷歌眼镜图像中每个像素点i在亮度L*恢复后得到的输出图像中依然过度曝光的可能性。
(3-3-2-3)为了在满足(3-3-2-1)和(3-3-2-2)的两个能量公式最小化的条件基础上得出谷歌眼镜过度曝光图像处理过后对应的新亮度矩阵L',此处引入新的总能量公式εL如下:
εL=ε1+λε2
其中,λ用于平衡梯度值能量公式ε1和亮度值能量公式ε2之间的相对大小,取λ=5。
(3-3-2-4)谷歌眼镜过度曝光图像处理过后对应的新亮度矩阵L'中原本亮度就较小的像素点对应的亮度值L'应该和谷歌眼镜过度曝光图像对应的原始亮度矩阵值L差异不大,此处引入如下约束条件
L'=L if L<min(L)+r·(max(L)-min(L))
其中,r=0.1。
(3-3-3)能量公式转换:计算谷歌眼镜过度曝光图像处理过后对应的新亮度矩阵L'相当于在满足上述约束条件式的基础上求使总能量公式εL得到最小值的解。这个问题可以转化成一个凸优化问题(OPT)。此处我们引入CVX,一个基于Matlab的模型,用于解决凸线性规划问题。为了求解使总能量公式εL最小化的新亮度矩阵L',我们可以将(3-3-2-3)中的能量公式εL和(3-3-2-4)中的约束条件式合起来转化成如下形式:
最小化
约束于Cx=d
x≥m
x≤n
能量公式和约束条件转换分为如下四个步骤:
(3-3-3-1)设m=L.width,n=L.height,m和n分别表示谷歌眼镜像素点的列数和行数,将谷歌眼镜过度曝光图像所对应的原始亮度L矩阵转换成一个n×m行的列向量矩阵在X轴和Y轴方向上的梯度分量矩阵分别为和谷歌眼镜过度曝光图像处理过后对应的新亮度矩阵L'同设为一个n×m行的列向量矩阵而在X轴和Y轴方向上的梯度分量矩阵分别为和
(3-3-3-2)将(3-3-2-1)中的第一个能量公式ε1转换成这样的形式。首先,将公式拆成如下形式:
其中和分别表示谷歌眼镜过度曝光图像每个像素点i所对应的在X轴和Y轴方向上的梯度值,和同理。由于可以在的梯度变换基础上将在X轴和Y轴方向上的梯度转换矩阵分别表示成如下形式:
设一个(n*m)×(n*m)大小的矩阵Px来表示的梯度转换矩阵,如下表示:
设一个(n*m)×(n*m)大小的矩阵Py来表示的梯度转换矩阵,如下表示:
此时将(3-3-2-1)中的第一个能量公式ε1转化成如下形式:
令
(3-3-3-3)将(3-3-2-2)中的第二个能量公式ε2转换成这样的形式。由于该能量公式只对谷歌眼镜过度曝光图像中的过度曝光区域Ω的|Ω|个像素点对应的亮度值L进行了处理,因此可以将这个能量公式拆成如下形式:
其中,P0,P1,…,PΩ-1表示的是谷歌眼镜过度曝光图像中过度曝光区域Ω里|Ω|个像素点在似然值矩阵P中对应的值。首先要构造一个|Ω|×|Ω|的矩阵P'如下,对角线上的值P'(i,i)依次表示过度曝光区域Ω中第i像素点对应的似然值:
然后再构造一个|Ω|×(height*width)的矩阵Q,用于记录谷歌眼镜过度曝光图像中过度曝光区域Ω中的像素点在亮度列向量中的位置。矩阵Q中的值满足如下要求:
如果Q(i,j)=1说明列向量中第j行的像素点是过度曝光的,反之则说明列向量中第j行的像素点是正常曝光的,不需要参与(3-3-2-2)中的第二个能量公式ε2的计算。因此矩阵Q也可以用来提取谷歌眼镜过度曝光图像中的过度曝光像素点在亮度矩阵中对应的值来进行(3-3-2-2)中的第二个能量公式ε2的计算。
将(3-3-2-2)中的第二个能量公式ε2转化成如下形式:
令
在将(3-3-2-1)中的第一个能量公式ε1和(3-3-2-2)中的第二个能量公式ε2均转换成的格式后,可以得到总的能量公式εL如下:
令
(3-3-3-4)将(3-3-2-4)中的约束条件式转换成Cx=d这样的形式,首先遍历谷歌眼镜过度曝光图像对应的亮度列向量矩阵记录下所有像素点对应的亮度最小值和亮度最大值然后构造一个行和列数均为(height*width)的矩阵C,矩阵C里每个像素点的值都满足:
矩阵C用于提取出亮度列向量中亮度值小于
的像素点,并使它们的亮度值在谷歌眼镜过度曝光图像处理过后对应的新亮度列向量中保持不变,约束条件式可以转换成
设d为一个(height*width)行的列向量矩阵,令(3-3-4)能量公式最小化:
在(3-3-3)中对总能量公式εL和约束条件式做了转换后,求解最优佳亮度列向量的问题就转换成了求解如下凸优化问题的解x:
最小化
约束于Cx=d
x≥0
x≤100
其中,x表示所要求的新亮度列向量矩阵而且
在Matlab上配置了CVX环境后,可以调用如下CVX的模型来解决这个凸优化问题:
从而计算得到谷歌眼镜过度曝光图像处理后所对应的新亮度列向量矩阵
本发明提出的对谷歌眼镜图像过度曝光的校正方法,其优点是:
1、本发明方法从色彩和亮度两个角度对谷歌眼镜在强光环境下拍摄的过度曝光图像进行了修复;
2、本发明方法避免了传统直方图均衡化方法处理后输出图像具有明显色彩过饱和现象的问题,并将该方法改进后应用于图像修复的第一步核心算法中,在很大程度修复了图像色彩的同时一定程度保留了较暗区域的图像对比度和细节;
3、本发明方法中对整体过度曝光图像的亮度单独进行处理时,通过对亮度分布范围的压缩和对像素点亮度值波动的整体降低这两步操作在一定程度上降低了过亮像素点和过暗像素点之间亮度的差异,使修复后的图像更加柔和;
4、本发明方法首先对输入的整体过度曝光图像进行色彩和亮度的全局修复,然后对全局修复后得到的输出图像进行局部亮度调整,这样更好地结合了全局修复算法和过往用于局部过度曝光图像的修复算法,得到适用于所有在相似强光环境下得到的类似过度曝光图像的修复算法。
附图说明
图1是本发明提出的对谷歌眼镜图像过度曝光的校正方法的流程框图。
具体实施方式
本发明提出的对谷歌眼镜图像过度曝光的校正方法,其流程框图如图1所示,包括以下步骤:
第一步是全局图像增强算法,由改进后的直方图均衡化算法和图像亮度I分量的调整算法组成,在提高了图像的色彩对比度的同时也改善了图像的整体亮度,使整体过度曝光图像转化成了局部过度曝光图像。第二步是针对第一步中得到的局部过度曝光图像的局部亮度修复算法,对以往论文中提出的过度曝光图像的局部亮度修复算法进行了适当的改进,针对谷歌眼镜拍摄的图像样本选取了适当的参数,最后得到进一步修复后的输出图像。
第一步全局图像增强算法分为两个小步骤来实现,分别是的对过度曝光的谷歌眼镜图像的改进直方图均衡化步骤和对图像I分量进行亮度的整体修正步骤。
(1)对过度曝光的谷歌眼镜图像进行直方图均衡化,更好地避免了图像亮度过饱和现象,使处理后的过度曝光图像一定程度上保留了较暗区域的图像对比度和细节,具体包括以下步骤:
(1-1)计算过度曝光的谷歌眼镜图像的直方图:图像的灰度(或单通道)直方图显示了图像中像素点在不同灰度级的分布。利用下式计算过度曝光的谷歌眼镜图像的直方图概率分布Pr(rk):
其中,N为一幅过度曝光的谷歌眼镜图像中的像素点总数,nk表示直方图中第k灰度级中像素点的个数,rk表示直方图中第k灰度级,Pr(rk)表示第k灰度级的直方图概率分布;
(1-2)对上述步骤(1-1)中的直方图概率分布进行改写,得到与上述灰度级rk相对应的新直方图概率分布数值Pr'(rk):
其中,对步骤(1-1)中的每一个灰度级对应的概率分布数值进行开根号处理;
(1-3)根据上述步骤(1-2)的新直方图概率分布数值,利用下式计算过度曝光的谷歌眼镜图像的直方图的累积分布函数,从而得到过度曝光的谷歌眼镜图像的直方图的原始灰度级rk和新灰度级r'k的映射关系:
Sr(rk)=Sr(rk-1)+Pr'(rk)
其中,Sr(rk)表示过度曝光的谷歌眼镜图像中从第一个直方图灰度级到第rk直方图灰度级的累积分布概率,设定新灰度图的灰度级个数为255,则基于累积分布概率得到最后输出图像的新灰度级如下:
r'k=cvRound(255*Sr(rk)+0.5)
上式中,cvRound(·)表示取整函数,r'k表示过度曝光的谷歌眼镜图像的直方图原始灰度级为rk所对应的新灰度级;
(1-4)根据上述步骤(1-3)得到的原始灰度级和新灰度级的映射关系,得到过度曝光的谷歌眼镜图像的新直方图,并通过新直方图输出处理后的过度曝光的谷歌眼镜图像;
由于上述步骤所针对的过度曝光的谷歌眼镜图像本身是三通道彩色图像,而上述步骤中的改进直方图均衡化算法是针对于单通道灰度图像。因此,在将步骤(1-1)到(1-4)应用到过度曝光的谷歌眼镜图像前,需要先将该图像分为(split)R、G、B三个单通道,然后分别对三个单通道图进行由步骤(1-1)到(1-4)组成的改进直方图均衡化处理,最后再将处理后得到的三个新单通道图合并为(merge)改进后的谷歌眼镜图像。
(2)在色调饱和度亮度(以下简称HSI)色彩空间内对上述步骤(1)得到的谷歌眼镜图像的I分量进行亮度修正,具体包括以下步骤:
(2-1)对谷歌眼镜图像从红绿蓝(以下简称RGB)色彩空间到色调饱和度亮度(以下简称HIS)色彩空间的转换,包括以下步骤:
RGB色彩空间是图像处理中最常用、最基础、面向硬件的颜色空间。通常我们采集到的彩色图像都是以R(红)、G(绿)、B(蓝)三个成分存储的。在RGB模型的基础上,图像每个像素都可以分成范围在0到255灰度值的R、G、B三个分量,其中0代表黑色,255代表白色。HSI色彩模型以色调(Hue)、饱和度(Saturation)和强度(Intensity Value)这三种基本的特征量来表示颜色。其中,H、S和I的定义分别如下:色调H(Hue)表示了人的感官对不同颜色的感受;饱和度S(Saturation)取决于颜色的纯度,即纯色被白光稀释的比例;亮度I(Intensity)表示了图像的明暗程度。
设定一幅RGB彩色图像,彩色图像的每个像素点的R、G、B通道都编入了色调、饱和度以及亮度的信息,因此每个RGB像素都可以通过相应的公式计算出对应的H、S、I分量的值。对经过改进直方图均衡化处理后的过度曝光谷歌眼镜图像的色彩空间转换过程分为如下四个步骤,包括色调H分量、饱和度S分量和亮度I分量的计算:
(2-1-1)利用下式计算上述步骤(1)得到的谷歌眼镜图像中的每个像素点(i,j)的色调H分量:
其中,B是上述步骤(1)得到的谷歌眼镜图像的蓝色分量值,G是上述步骤(1)得到的谷歌眼镜图像的绿色分量值;
(2-1-2)步骤(2-1-1)的色调H分量公式中θ的求值公式如下:
其中,R是上述步骤(1)得到的谷歌眼镜图像的红色分量值,B是上述步骤(1)得到的谷歌眼镜图像的蓝色分量值,G是上述步骤(1)得到的谷歌眼镜图像的绿色分量值;
(2-1-3)利用下式计算上述步骤(1)得到的谷歌眼镜图像中每个像素点(i,j)的饱和度S分量:
其中,R是上述步骤(1)得到的谷歌眼镜图像的红色分量值,B是上述步骤(1)得到的谷歌眼镜图像的蓝色分量值,G是上述步骤(1)得到的谷歌眼镜图像的绿色分量值;
(2-1-4)利用下式计算上述步骤(1)得到的谷歌眼镜图像中每个像素点(i,j)的亮度I分量:
其中,R是上述步骤(1)得到的谷歌眼镜图像的红色分量值,B是上述步骤(1)得到的谷歌眼镜图像的蓝色分量值,G是上述步骤(1)得到的谷歌眼镜图像的绿色分量值;
(2-2)利用上述步骤(2-1)计算得到的谷歌眼镜图像中每个像素点的色调H、饱和度S、亮度I分量值,对谷歌眼镜图像的亮度I分量进行调整,具体包括如下步骤:
(2-2-1)利用下式等距压缩谷歌眼镜图像中所有像素点亮度I分量值的分布区间:以0.5为中心,对任意亮度I分量值大于0.5的像素点的亮度值进行了降低,相反地,对任意亮度I分量值小于0.5的像素点的亮度值进行了提高。
其中,Ii表示图像中第i像素点的原始亮度值,I'i表示图像中第i像素点压缩或提高后的新亮度值。μ1表示当图像中像素点亮度值Ii大于0.5时的压缩因子,而μ2表示当图像中像素点亮度值Ii小于0.5时的提升因子,此处取μ1=0.75,μ2=0.8;
(2-2-2)利用下式整体降低谷歌眼镜图像中所有像素点亮度I分量值的波动,首先计算出谷歌眼镜图像所有像素点亮度值的总体均值I'mean,然后再分别计算每个像素点经过步骤(2-2-1)处理后得到的新亮度值Ii'和总体均值I'mean之间的差值,再在这些差值的基础上求出总体的波动因子dif,计算公式如下:
根据上式,求dif的过程具体分为以下三步:
(2-2-2-1)分别对每个像素点的亮度值Ii'和亮度总体均值I'mean之间求差值,然后将这些差值相加得到总和∑|I'i-I'mean|;
(2-2-2-2)对(2-2-2-1)中得到的所有像素点对应的亮度差值求平均值,得到所有像素点亮度差值的平均值为其中N表示像素点总数;
(2-2-2-3)对(2-2-2-2)中得到的亮度差值平均值进行一定的压缩,最后得到总体波动因子dif。此处μ3为压缩因子,表示对亮度差值平均值的压缩程度,取μ3=2;
(2-2-3)在得到总体波动因子dif后,根据每个像素点的亮度值Ii'和总体亮度均值I'mean之间的差值大小分别对每个像素点的亮度值Ii'做如下处理:
其中,I'i为谷歌眼镜图像中第i像素点在第(2-2-1)步处理后得到的亮度值,I”i为谷歌眼镜图像中第i像素点在第(2-2-3)步处理后得到的最终亮度值;如果谷歌眼镜图像中第i像素点的亮度值I'i加上总体波动因子dif后不大于总体亮度均值I'mean,该像素点的最终亮度值I”i=I'i+dif;反之,如果谷歌眼镜图像中第i像素点的亮度值I'i减去总体波动因子dif后不小于总体亮度均值I'mean,该像素点的最终亮度值I”i=I'i-dif;其他情况下I”i=I'i不变;
(2-3)亮度I分量经过步骤(2-2)处理后的谷歌眼镜图像从HSI色彩空间到RGB色彩空间的转换:将经过步骤(2-2)处理后的谷歌眼镜图像的新的亮度I分量I”、色调H分量和饱和度S分量合并后得到新的HSI图,由于最后输出的图像应该是RGB图,因此输出最终谷歌眼镜图像前需要将新的HSI图转换成对应的RGB图;首先将代表谷歌眼镜图像色调H的横截面分为三个相隔120°的扇区,然后根据色调H的值在不同扇区的分布情况分别进行如下计算:
(2-3-1)RG扇区,0°≤H<120°,当H分量位于该扇区里时,对应的谷歌眼镜图像新的R、G、B三个通道的值R’、G’、B’分别可以用如下公式计算得到:
B'=I”(1-S)
G'=3I”-(R'+B')
其中,I”是经过步骤(2-2)处理后的谷歌眼镜图像的新的亮度I分量,R’是经过步骤(2-2)处理后的谷歌眼镜图像对应的新的红色分量值,B’是经过步骤(2-2)处理后的谷歌眼镜图像对应的新的蓝色分量值,G’是经过步骤(2-2)处理后的谷歌眼镜图像对应的新的绿色分量值;
(2-3-2)GB扇区,120°≤H<240°,当H分量位于该扇区里时,在计算谷歌眼镜图像新的R、G、B三个通道的值前先要对H分量的值做如下处理得到新的H’:
H'=H-120°
然后,对应的谷歌眼镜图像新的R、G、B三个通道的值R’、G’、B’分别可以用如下公式计算得到:
R'=I”(1-S)
B'=3I”-(R'+G')
(2-3-3)BR扇区,240°≤H<360°,当H分量位于该扇区里时,在计算谷歌眼镜图像新的R、G、B三个通道的值前先要对H分量的值做如下处理得到新的H’:
H'=H-240°
然后,对应的谷歌眼镜图像新的R、G、B三个通道的值R’、G’、B’分别可以用如下公式计算得到:
G'=I”(1-S)
R'=3I”-(G'+B')
(2-4)亮度I分量经过整体调整后的图像对应的HSI图转换成RGB图后就可以得到经过全局算法修复过后的过度曝光谷歌眼镜图像;
经过原始过度曝光谷歌眼镜图像的图像细节和色彩对比度已经得到了一定程度的恢复,下一步针对过度曝光谷歌眼镜图像的修复步骤是针对谷歌眼镜图像中依然过度曝光严重的区域进行局部亮度恢复的算法。
(3)基于CIELAB色彩空间对经过步骤(2)处理后得到的谷歌眼镜图像中依然过度曝光严重的区域进行局部亮度恢复,具体包括如下步骤:
(3-1)对经过步骤(2)处理后得到的谷歌眼镜图像进行RGB色彩空间到CIELAB色彩空间的转换,因为图像不能直接从RGB转换成LAB,需要先转换成XYZ再转换成LAB,因此转换过程分为如下两个步骤:
(3-1-1)RGB转XYZ:设r、g、b分别代表经过步骤(2)处理后得到的谷歌眼镜图像中每个像素点(i,j)对应的R、G、B通道初始值,取值范围为[0,255],而r’、g’、b’分别表示经过这一步转换后得到的新值,转换的计算公式如下:
其中gamma函数是用于对图像进行非线性色调编辑的,它的目标在于对原始色彩分量的值进行校正,并提高图像的对比度,公式的作用如下:
在利用gamma函数对谷歌眼镜图像中每个像素点(i,j)对应的R、G、B通道初始值r、g、b进行处理后,可以进一步通过对R、G、B通道此时的新值r’、g’、b’进行进一步的处理来得到所要求的X、Y、Z的值,其中进一步处理对应的转换公式如下:
其中,矩阵M如下:
将矩阵M代入后,转换过程相当于如下公式:
X=r'*0.4124+g'*0.3576+b'*0.1805
Y=r'*0.2126+g'*0.7152+b'*0.0722
Z=r'*0.0193+g'*0.1192+b'*0.9505
(3-1-2)XYZ转LAB:通过对谷歌眼镜图像中每个像素点(i,j)对应的X、Y、Z的值进行进一步转换得到L*、a*、b*的值,转换的计算公式如下:
L*=116f(Y/Yn)-16
a*=500[f(X/Xn)-f(Y/Yn)]
b*=200[f(Y/Yn)-f(Z/Zn)]
其中,Xn、Yn、Zn一般默认值为95.047、100.0、108.883,而上面计算公式中出现的f函数如下:
此处计算得到的L*、a*、b*的值就是步骤(2)处理后得到的谷歌眼镜图像进行RGB色彩空间到CIELAB色彩空间转换后对应的LAB色彩空间三个通道的值;
(3-2)检测步骤(2)处理后得到的谷歌眼镜图像中依然过度曝光严重的区域:定义一个过度曝光映射矩阵M来记录谷歌眼镜图像中每个像素点被过度曝光影响的严重程度。谷歌图像第i个像素点在矩阵M对应的Mi值计算公式如下:
其中,Li代表了谷歌图像第i个像素点对应的L*值,Ci代表了谷歌图像第i个像素点对应的向量(a*,b*)T,LT和CT代表了谷歌眼镜图像中过度曝光区域像素点所能取的边界值,当LT和CT的值都等于过度曝光区域边界值时,M的值等于0.5;δ=1/60,LT=80,CT=40,谷歌眼镜图像中像素点对应的值Mi<0.5说明该像素点是正常曝光像素点,属于正常曝光区域反之像素点对应的值Mi≥0.5说明该像素点是过度曝光像素点,属于过度曝光区域Ω;
(3-3)对步骤(2)处理后得到的谷歌眼镜图像中依然过度曝光严重区域亮度L*的恢复分为如下步骤:
(3-3-1)采用色调映射的方法来压缩谷歌眼镜过度曝光图像中正常曝光区域的动态范围,步骤如下:
(3-3-1-1)定义一个过度曝光似然性矩阵P来衡量谷歌眼镜图像中过度曝光区域Ω的每个像素点i在亮度L*恢复后得到的输出图像中依然是过度曝光的可能性。通过如下计算公式得到每个像素点i的Pi值:
其中,K是归一化因子,K的取值使得针对经过步骤(2)处理后的谷歌眼镜图像中所有像素点在矩阵P中对应的值所能取到的最大值Pi=1,K的取值公式如下:
其中,Mmax代表了步骤(3-2)中计算得到的谷歌眼镜图像对应的过度曝光映射矩阵M中最大值。
(3-3-1-2)对于谷歌眼镜图像中正常曝光区域的动态范围,利用非线性拉伸图像梯度的方法来对图像中梯度较大的像素点进行梯度压缩。相反地,谷歌眼镜图像中过度曝光区域Ω的动态范围保持不变。对谷歌眼镜图像中不同曝光类型区域内像素点i的梯度拉伸函数z(.)定义如下:
其中,表示谷歌眼镜图像第i个像素点亮度L*即Li的梯度,表示为分别在x轴和y轴的分量即对进行拉伸相当于对在x轴和y轴的分量进行同步拉伸。其中||·||等同于表示的是二范数。二范数的定义如下:
因此,的值可以表示成求Li的梯度时,在x轴方向上和在y轴方向上需要分别遵循如下公式(其中gradX(u,v)表示谷歌眼镜图像第u行第v列的像素点对应的L*值在X轴方向的梯度,gradY(u,v)表示谷歌眼镜图像第u行第v列的像素点对应的L*值在Y轴方向的梯度):
在X轴方向,
其中,L(u,v+1)、L(u,v)、L(u,v-1)分别代表谷歌眼镜图像第u行第v+1列、第u行第v列、第u行第v-1列的像素点对应的L*值,width表示谷歌眼镜图像像素点的列数。
在Y轴方向,
其中,L(u+1,v)、L(u,v)、L(u-1,v)分别代表谷歌眼镜图像第u+1行第v列、第u行第v列、第u-1行第v列的像素点对应的L*值,height表示谷歌眼镜图像像素点的行数。
另外,z(·)中的α和β是用于控制谷歌眼镜过度曝光图像中的像素点亮度L*压缩比例的两个参数。其中,α用于控制谷歌眼镜过度曝光图像中的像素点i亮度L*即Li被压缩的最小梯度值,因此一般设为平均梯度大小的十分之一。β用于控制谷歌眼镜过度曝光图像中的像素点i亮度L*即Li梯度压缩的压缩比例,取0.8。
β=0.8
在确定了L矩阵的梯度值并对谷歌眼镜过度曝光图像的正常曝光区域进行适度的压缩后,接下来的步骤就是计算新的亮度矩阵L'。
(3-3-2)计算能量公式:
计算得到的新亮度矩阵L'要满足如下两个条件:
(3-3-2-1)第一个条件是谷歌眼镜过度曝光图像处理后所得新图像的亮度梯度值要尽可能和原始图像的亮度梯度值相似。此处引入第一个需要进行最小化处理的能量公式ε1如下:
其中,表示谷歌眼镜过度曝光图像中第i像素点在原始亮度矩阵中对应的梯度值,表示谷歌眼镜过度曝光图像第i像素点的在新亮度矩阵中对应的梯度值,表示是二范数的平方值,即
(3-3-2-2)第二个条件是谷歌眼镜过度曝光图像中过度曝光区域Ω的像素点i对应的新亮度值L'i和原始亮度值Li不会相差太大。此处引入第二个需要进行最小化处理的能量公式ε2如下:
其中|Ω|表示谷歌眼镜图像的过度曝光区域Ω中像素点的个数,Pi表示步骤(3-3-1-1)得到的谷歌眼镜图像中每个像素点i在亮度L*恢复后得到的输出图像中依然过度曝光的可能性。
(3-3-2-3)为了在满足(3-3-2-1)和(3-3-2-2)的两个能量公式最小化的条件基础上得出谷歌眼镜过度曝光图像处理过后对应的新亮度矩阵L',此处引入新的总能量公式εL如下:
εL=ε1+λε2
其中,λ用于平衡梯度值能量公式ε1和亮度值能量公式ε2之间的相对大小,取λ=5。
(3-3-2-4)谷歌眼镜过度曝光图像处理过后对应的新亮度矩阵L'中原本亮度就较小的像素点对应的亮度值L'应该和谷歌眼镜过度曝光图像对应的原始亮度矩阵值L差异不大,此处引入如下约束条件
L'=L if L<min(L)+r·(max(L)-min(L))
其中,r=0.1。
(3-3-3)能量公式转换:计算谷歌眼镜过度曝光图像处理过后对应的新亮度矩阵L'相当于在满足上述约束条件式的基础上求使总能量公式εL得到最小值的解。这个问题可以转化成一个凸优化问题(OPT)。此处我们引入CVX,一个基于Matlab的模型,用于解决凸线性规划问题。为了求解使总能量公式εL最小化的新亮度矩阵L',我们可以将(3-3-2-3)中的能量公式εL和(3-3-2-4)中的约束条件式合起来转化成如下形式:
最小化
约束于Cx=d
x≥m
x≤n
能量公式和约束条件转换分为如下四个步骤:
(3-3-3-1)设m=L.width,n=L.height,m和n分别表示谷歌眼镜像素点的列数和行数,将谷歌眼镜过度曝光图像所对应的原始亮度L矩阵转换成一个n×m行的列向量矩阵在X轴和Y轴方向上的梯度分量矩阵分别为和谷歌眼镜过度曝光图像处理过后对应的新亮度矩阵L'同设为一个n×m行的列向量矩阵而在X轴和Y轴方向上的梯度分量矩阵分别为和
(3-3-3-2)将(3-3-2-1)中的第一个能量公式ε1转换成这样的形式。首先,将公式拆成如下形式:
其中和分别表示谷歌眼镜过度曝光图像每个像素点i所对应的在X轴和Y轴方向上的梯度值,和同理。由于可以在的梯度变换基础上将在X轴和Y轴方向上的梯度转换矩阵分别表示成如下形式:
设一个(n*m)×(n*m)大小的矩阵Px来表示的梯度转换矩阵,如下表示:
设一个(n*m)×(n*m)大小的矩阵Py来表示的梯度转换矩阵,如下表示:
此时将(3-3-2-1)中的第一个能量公式ε1转化成如下形式:
令
(3-3-3-3)将(3-3-2-2)中的第二个能量公式ε2转换成这样的形式。由于该能量公式只对谷歌眼镜过度曝光图像中的过度曝光区域Ω的|Ω|个像素点对应的亮度值L进行了处理,因此可以将这个能量公式拆成如下形式:
其中,P0,P1,...,P|Ω|-1表示的是谷歌眼镜过度曝光图像中过度曝光区域Ω里|Ω|个像素点在似然值矩阵P中对应的值。首先要构造一个|Ω|×|Ω|的矩阵P'如下,对角线上的值P'(i,i)依次表示过度曝光区域Ω中第i像素点对应的似然值:
然后再构造一个|Ω|×(height*width)的矩阵Q,用于记录谷歌眼镜过度曝光图像中过度曝光区域Ω中的像素点在亮度列向量中的位置。矩阵Q中的值满足如下要求:
如果Q(i,j)=1说明列向量中第j行的像素点是过度曝光的,反之则说明列向量中第j行的像素点是正常曝光的,不需要参与(3-3-2-2)中的第二个能量公式ε2的计算。因此矩阵Q也可以用来提取谷歌眼镜过度曝光图像中的过度曝光像素点在亮度矩阵中对应的值来进行(3-3-2-2)中的第二个能量公式ε2的计算。
将(3-3-2-2)中的第二个能量公式ε2转化成如下形式:
令
在将(3-3-2-1)中的第一个能量公式ε1和(3-3-2-2)中的第二个能量公式ε2均转换成的格式后,可以得到总的能量公式εL如下:
令
(3-3-3-4)将(3-3-2-4)中的约束条件式转换成Cx=d这样的形式。首先遍历谷歌眼镜过度曝光图像对应的亮度列向量矩阵记录下所有像素点对应的亮度最小值和亮度最大值然后构造一个行和列数均为(height*width)的矩阵C。矩阵C里每个像素点的值都满足:
矩阵C用于提取出亮度列向量中亮度值小于
的像素点,并使它们的亮度值在谷歌眼镜过度曝光图像处理过后对应的新亮度列向量中保持不变。这种情况下,约束条件式可以转换成
设d为一个(height*width)行的列向量矩阵,令(3-3-4)能量公式最小化:
在(3-3-3)中对总能量公式εL和约束条件式做了转换后,求解最优佳亮度列向量的问题就转换成了求解如下凸优化问题的解x:
最小化
约束于Cx=d
x≥0
x≤100
其中,x表示所要求的新亮度列向量矩阵而且
在Matlab上配置了CVX环境后,可以调用如下CVX的模型来解决这个凸优化问题:
从而计算得到谷歌眼镜过度曝光图像处理后所对应的新亮度列向量矩阵