图像⾃动去暗⾓算法(vegnetting
俄罗斯音乐家
暗⾓图像是⼀种在现实中较为常见的图像,其主要特征就是在图像四个⾓有较为显著的亮度下降,⽐如下⾯两幅图。根据其形成的成因,主要有3种:natural vignetting, pixel vignetting, 以及mechanic vignetting,当然,不管他的成因如何,如果能够把暗⾓消除或者局部消除,则就有很好的⼯程意义。
这⽅⾯的资料和论⽂也不是很多,我最早是在2014年看到Y. Zheng等⼈的论⽂《Single image vignetting correction》以及同样有他们撰写的论⽂《Single image vignetting correction using radial gradient sym
metry》有讲这⽅⾯的算法,不过其实现的复杂度较⾼,即使能编程实现,速度估计也很慢,其实⽤性就不⾼了。
分区表丢失前不久,偶尔的机会看到⼀篇名为《Single-Image Vignetting Correction by Constrained Minimization of log-Intensity Entropy》的论⽂,并且在github上找到了相关的⼀些参考代码,虽然那个代码写的实在是恶⼼加⽆聊,但是对于我来说这并不重要,只要稍有参考,在结合论⽂那⾃⼰来实现就不是难事了。
婚姻经济学论⽂⾥的算法核⼼其实说起来也没啥难的,我就我的理解来简单的描述下:
第⼀:去暗⾓可以说是阴影校正的⼀种特例,⽽将整副图像的熵最⼩化也被证明为进⾏阴影校正的⼀种有效⽅法,但是普通的熵在优化过程中会优化到局部最优的。因此论⽂中提出了⼀种对数熵的概念(Log-Intensity Entropy),论⽂中⽤数据做了说明,假设⼀副普通正常的图像其直⽅图是单峰分布,那么如果这幅图像有暗⾓,其直⽅图必然会存在另外⼀个低明度的分布,如下图所⽰:
我们校正暗⾓的过程就是使低明度的分布向原来的正常明度靠近,由上图第⼀⾏的数据可以看到,普通的熵计算直到两个直⽅图有部分重叠的时候熵才会下降,之前熵⼀直都是增加的,⽽对数熵则在没有重叠前⾄少是保持不增的,因此能够更好的获取全局最优解。
那么论⽂提出的对数熵的计算公式为:
⾸先先将亮度进⾏对数映射,映射公式为:
也就是将[0,255]内的像素值映射到[0, N-1]内,但不是线性映射,⽽是基于对数关系的映射,通常N就是取256,这样映射后的像素范围还是[0,255],但是注意这⾥的i(L)已经是浮点数了。我们绘制出N等于256时上式的曲线:
我等的船还不来
可见,这种操作实际上把图像整体调亮了。
由于映射后的⾊阶已经是浮点数了,因此,直⽅图信息的统计就必须换种⽅式了,论⽂给出的公式为:
公式很复杂,其实就是有点类似线性插值那种意思,不认识了那两个数学符号了,就是向上取整和向下取整。
这样的对数熵直⽅图信息会由于巨⼤的⾊阶调整,导致很多⾊阶是没有直⽅图信息的,⼀般可以对这个直⽅图信息进⾏下⾼斯平滑的,得到新的直⽅图。
浓缩果汁
最后图像的对数熵,计算⽅法如下:
其中:
第⼆:论⽂根据资料《Radiometric alignment and vignetting calibration》提出了⼀个暗⾓图像亮度下降的关系式,⽽我去看《Radiometric alignment and vignetting calibration》这篇论⽂时,他的公式⼜是从《Vignette and exposure calibration and compensation》中获取的,所以这个论⽂的作者写得⽂章还不够严谨。这个公式是⼀个拥有五个未知参数的算式,如下所⽰:
其中:
其中,x和y是图像每⼀点的坐标,⽽则表⽰暗⾓的中⼼位置,他们和a、b、c均为未知量。
我们可以看到,当r=0时,校正系数为1,即⽆需校正。当r=1时,校正系数为1+a+b+c。
那么经过暗⾓校正后的图像就为:
按照我们的常识,暗⾓图像从暗⾓的中⼼点想四周应该是逐渐变暗的,根据上式函数g应该是随着r单
调递增的(因为我们是校正暗⾓图像,所以越靠近边缘上式的乘法中g值也就应该越⼤),因此函数g的⼀阶导数应该⼤于0,即:
同时,我们注意到参数r的范围很明显应该在[0,1]之间,这样上式则可以转换为:
如果令,则上式变为:
根据⼆次不等式相关知识,令:
则论⽂总结了满⾜下述关系式的a,b,c就能满⾜上述要求了:
这个我也没有去验证了。粉皮怎么做好吃
第三: 上⾯描述了校正暗⾓图像的公式(带参数)以及评价⼀副图像是否有暗⾓的指标,那么最后⼀步就是⽤这个指标来确定公式的参数。我们未知的参数有5个,即a、b、c以及暗⾓的中⼼点。解这种受限的最优问题是有专门的算法的,也是⾮常计算耗时的。因此,作者提出了⼀种快速的算法:Hill climbing with rejection of invalid solutions.
我稍微看了下这个算法,确实是个不错的想法,不过我并没有去实践,我采⽤了另外⼀种粗略的优化⽅式。
⾸先,很明显,为了计算这些最优参数,我们没有必要直接在原图⼤⼩上直接计算,这点在原论⽂也
有说明,我们即使把他们的宽⾼分别缩⼩到原图的1/5甚⾄1/10计算出来的结果也不会有太⼤的差异,⽽这些参数的差异对最终的的结果影响也不⼤,但是计算量就能减少到原来的1/25和1/100。
接着,我们观察到a、b以及c的最优结果范围⼀般都在-2和2之间,并且从g的计算公式中知道,由于r是属于0和1之间的正数,r^2, r^4, r^6在数值递减的⾮常快,⽐如
r=0.8,则三者对应的结果就分别为0.64、0.4096、0.2621,因此,a和b及c在公式中的对最后结果的影响也依次越来越⼩。
那么,我们可以参考以前的⼀⽂中的优化⽅式,把a, b ,c 三个参数分别在[-2,2]之间离散化,考虑到参数稍微差异不会对结果有太⼤的影响,以及a、b、c的重要性,我们可以设置a、b、c三者的离散间隔分别为0.2、0.3、0.4,然后综合上述判断a、b、c是否为合理组合的函数,离散取样的计算量组合⼤概有300种可能,对⼩图计算着300种可能性的耗时是完全可以接受的,甚⾄考虑极端⼀点,把c的计算放到循环外侧,即C取固定值0,然后计算出优选的a和b值后,在计算C值。
04年属什么上述计算过程并未考虑暗⾓中⼼点的范围,我们是固定把暗⾓的中⼼点放置在图像的正中⼼位置的,即 (Width/2, Height /2),实际上,对于⼤部分拍摄的图来说,暗⾓就是位于中⼼位置的,因此这种假设也⽆可厚⾮,因为暗⾓中⼼计算的增加必然会严重增加计算量,为了求出暗⾓中⼼的合理位置,我们在计算出上述a、b、c后,在⼩图中以⼀定步长按照公式计算出粗略的中⼼位置,再放⼤到原图中
去。
计算出上述a、b、c以及中⼼点后,就可以再次按照校正公式来进⾏校正了,注意暗⾓的影响对每个通道都是等同的,因此,每个通道都应该乘以相同的值。
下⾯贴出⼀些⽤论⽂中的算法处理的结果图:
>电力建设