图像曝光自动校正算法详解:Automatic Exposure Correction of Consumer Photographs
1. 总体背景介绍
首先介绍下过曝和欠曝的原因,一种是相机本身的测光模式不完美,在没有对准目标或者存在多个目标时会失败;二种是由于外界复杂的反光比,目标灰色的中间调有时不可用,例如在没有曝光补偿时,一只雪白的兔子有可能被拍成一只灰色的兔子;三种是对比较低级的相机,图像后处理能力有限。由于存在这些原因,导致拍摄的图像存在曝光不足或曝光过量现象。
校正曝光一般存在存在两种方法,一种是传统方法,一种是深度学习方法。本文介绍的这篇论文主要使用传统方法,主要通过S曲线来调整图像高光和阴影,使得高光和阴影往中间调靠拢,进而达到矫正图像曝光的目的,这与各种图像处理软件,例如PS(图1)或者GIMP的思路相一致,接下来将详细介绍。
如上所述,该论文主要使用如下S型函数完成曝光矫正,自动计算等式中的和是这篇文章主要讲的:
其中表示图像像素强度,已经归一化到[0,1]。和曲线图2所示:
上图中的(a)图正是需要求解的S型曲线,当S型函数输入比较小时,此时主要由起作用,而高光因为存在变得很大,但是相应函数输出值有很小,进而高光起的效果不是很明显;(b)图显示了在不同高光和阴影数量百分比下的取值,当取值为稳重给定的超参时,该函数输出值范围在[0,0.5],恰好位于中间调左侧,这样做的原因是保证阴影和高光在调整时不超过0.5范围,原因:如图中(a)所示左下田字格,左下角格子调整的值就是,该值中取值范围为[0,1],取值范围为[0, 0.5],因此两者相乘取值范围为[0, 0.5]。
2. 算法详细介绍
该算法的整体思路如下图:
图像进行处理时都会进行归一化处理,在亮度层面进行操作。算法首先会对输入图像进行一些亮度变化,例如直方图均值化,自动色调调整等;然后计算S型曲线未知的两个参数,进而自动校正图像曝光,使得高光和阴影都向图像中间调靠拢,这一步包括区域分割、区域合并、计算可视化细节、区域直方图最短距离和寻找每个区域最优映射区域,最后矫正图像曝光;由于校正后的图像会丢失部分图像细节和色彩,因此最后会对图像进行细节和颜色补偿。
接下来介绍的都是对完成自动色调处理后的图像进行操作,因为这篇文章主要介绍的就是对已经处理后的图像做曝光矫正,应该属于锦上添花的作用。整片文章操作的图像都是经过归一化后的灰度图像的像素强度值。
图像分割。不像其它图像曝光矫正方法在校正曝光时会对图像整体亮度产生影响,为了对图像不同曝光区域进行不同的曝光矫正处理,需要分割图像,这也是本文求解S型曲线参数的关键。本文采用基于图的图像分割算法,将分割后的图像分解成不同的小区域,将计算的每个区域的像素强度均值作为该区域的曝光值。同时为了更好的区分高光和阴影,作者引进了zone值的概念,zone值范围从0到10共11个分段,其中小于5的为阴影,大于5的为高光,zone值V=5表示中间调,曝光值和zone值的关系,如下图所示:
实现:如何将计算的亮度均值映射到曝光值,可以设定一个范围,例如以0.1为间隔进行映射。
合并小区域,重新分配zone值。为了更好的矫正具有相同zone值的区域,需要合并这些区域,即合并zone值相同并且相邻的区域,这里需要注意可能存在需要合并的两个区域中间隔着一个区域,而这个区域也与他们zone值相同。合并区域后,重新给合并后的区域分配zone值,上图中的(c)就表示合并后的新区域。
实现:本次实现时将区域合问题并转换到图像处理问题,因为已经获取了各个区域的坐标,所以将每个区域分别转换为二值图,寻找二值图边界;对区域边界每个像素外扩5*5=25邻域外接16个像素,计算16个像素坐标中是否存在一个落入其它区域,如果是,则这两个区域相邻,同时如果区域值相同,则合并这两个区域。对合并后区域从新分配zone值,获取合并后区域的坐标和区域边缘坐标。
计算任意相邻区域间直方图最短距离。为了曝光矫正后的图像能更好保留原图的对比度,同时为了在求解S型参数时求解最优相邻区域,需要计算不同区域之间的直方图最短距离。该距离定义为两个直方图重叠面积最大时的平移距离,注意该距离需要除以255归一化到[0,1]。如下图所示:
实现:分别计算两个区域图像直方图,一个区域直方图不动,另外一个区域直方图分别从-255到255依次移动,同时计算两个直方图最大重合面积,将最小移动距离作为最终值。
计算每个区域的可恢复细节度值。为了曝光矫正后的图像能更好的保留原图细节,需要计算每个分割区域中可恢复细节程度值。核心原理是使用gamma(gamma曲线图如下图)曲线对图像进行曝光处理,根据不同曝光图像获取的边缘图像计算恢复程度值。
主要原理是,针对阴影区域,当gamma比较大/比较小时,gamma变换后的图像阴影区域与变换前图像阴影区域差别比较小/比较大,这种区域之间的差别可以度量最终矫正曝光时图像细节的恢复程度。高光区域同理。计算细节程度主要依据每个区域边缘像素数占图像所有边缘像素数的比值确定,具体计算过程如下:
对原图做和的gamma变化,对原图和gamma变换后的图像分别做canny边缘检测得到边缘图像,然后分别计算阴影和高光的边缘像素图像:和,式中的交集表示两种gamma变换图像的交集,使用opencv的bitwise_and可以实现,减去交集意味着交集不影响阴影和高光区域,并且阴影和高光区域不相互影响。计算阴影和高光可恢复细节程度为:和,式中|.|表示像素数,,效果如下图:
计算最优区域。获取了直方图间最短距离和可恢复图像细节程度,就可以根据它们计算每个区域需要映射的像素强度值,该强度值是在所有区域中寻找与该区域期望值最小的那个区域作为目标映射对象。进一步而言是和最大的两个区域对为最优区域组合,再细一点就是两个区域在细节程度和直方图距离最接近为最优,这样能保证曝光矫正不是很突兀,尽可能在亮度之间平滑过渡。优化等式如下:
其中,
目的是会让高光和阴影都向中间调靠拢,靠拢的程度大小由等式中获取的参数决定。其中和分别表示区域i和区域j面积占图像面积的比率,表示第i个区域的视觉细节程度,表示天空人脸的重要程度,本文此处省略不计,。和分别表示新映射后区域的zone值和原先区域的zone值。主要意义是占比小的区域贡献小,是均值为0,方差为0.15的高斯函数。表示所有的区域数量与成对区域数量的比值。
实现算法时碰到问题:如何计算优化后区域的?需要根据等式计算出参数,然后代入计算映射后阴影区域的像素强度值,然后再从新计算直方图距离,进而计算直方图之间的距离。
计算两个参数和。获取最优区域就可以计算出S型曲线需要的参数,计算阴影参数等式如,,,其中表示区域像素数,范围为实数R,最终为所有区域的参数加权平均值,注意在计算平均值的时候,大于1的值要舍去,同时注意分母也要相应减一,同时权重与参数相乘结果需要去绝对值。注意此处为除号,论文中为乘号,需要注意。对高光区域参数计算也是如此。分别获取了两个参数后,就可以代入本文开头介绍的等式中计算每个像素值应该映射的强度值。对彩色图像的话,需要对每个通道分别计算然后再合并。
细节补偿。获取曝光后图像会丢失一些细节,本文使用导向滤波计算滤波灰度图像和原输入灰度图像的差异,将差异与曝光后图像融合来补偿图像细节,等式如下:
当时,这项达到最大值,此时中间调细节补偿最多,超过了高光和阴影部分,然而原来的高光和阴影矫正后都会向中间调靠拢,因此这样对整幅图像的细节保留了更多的细节信息,该函数设计的很巧妙。
彩色补偿。获取补偿细节后的图像后,需要对图像色彩进行补偿,本文在YIQ颜色空间根据输入原图和矫正曝光后图像亮度与色彩的比值,补偿图像原色。最终获取曝光矫正后的图像。
自己一些感想。这篇文章的曝光矫正主要是在亮度处理后的图像上进行处理,单纯直接使用曝光矫正算法对过欠曝/过曝图像矫正效果不是很明显,但是在ps中查看图像直方图显示原图直方图区域都向中间调靠拢,说明矫正还是有一定的作用。本文曝光矫正方法对已经处理的图像曝光矫正效果不错,能对高光阴影进行有效校正且对中间调不造成比较大影响,方法值得借鉴。