重映射

作者: 徒劳的写 | 来源:发表于2015-03-09 23:13 被阅读0次

    一种优化照片辨识度的HDR自适应颜色映射方法
    ** @gmail.com
    中国
    大学 4300**

    摘要 现在的照片拍摄,其原始数据可以达到14bit以上的亮度分辨率,也就是214种亮度,而一般的存储格式中,jpg等格式仅能存储8bit即256种亮度,这就涉及到颜色的重映射。普通的映射方法是取一个窗口进行线性映射,但是在逆光(亮度分布过宽)、雾霾(亮度分布过窄)等情况下会出现高光溢出死白、照片发灰辨识度低等情况,丢失重要原始信息。本文描述了一种把亮度或饱和度通过直方图积分进行重映射的方法,可以自动适应各种极端情况,得到最优化的颜色重映射方案,尽可能保留原始重要信息。

    关键词 HDR RAW 图像优化

    1 绪论
    随着CMOS和CCD等光电感应技术的不断发展,现在数码拍照、数码摄影已经变得极其廉价而广泛普及,并随着智能手机的普及成为几乎人人拥有的应用。而我们拍照时,会出现各种原始图片曝光不够准确等造成的图片发灰、辨识度不高的现象。因此,对这些照片进行自动、自适应优化,在不改变图片大小的情况下尽可能保留原始信息、提高图形辨识度,成为一种广泛的需求。
    对于分辨率越来越高的数码照片或者影片,基于人体对颜色的辨识能力人们发明了多种照片和影片压缩方案,如JPG、MPEG等。这些压缩方案的常见共同点是把亮度压缩到了8bit,即28=256阶亮度中。把原始数据压缩到256阶亮度的过程中,最常用的算法就是线性截取,即以测光点为平均亮度(最大亮度的128/256倍)上下共256倍的亮度区间,在这个区间内进行均分为256阶亮度的线性映射。其他还有对数映射,或者基于γ值的幂函数等方案,对于人眼而言显然对数映射更为合理,但是计算量较大。

    图1 亮度直方图模式下的映射窗口图示 a 缺省映射 b 提高或者降低eV后的映射 c 提高或者降低对比度后的映射 d 改变γ值后的映射

    但是这种映射存在窗口过大或者过小的问题。拍摄的原始数据中,即自然界中,亮度变化范围远大于256阶这个范围。在逆光(物体背后即强光光源)等场合,如果把仅仅256倍亮度范围的数据纳入,就会出现低端过暗(亮度小于1或者接近1时对小数点后取整,失去信息)和高端过亮(亮度超过255被截断取整为255失去信息)的情况。而在拍摄雾中天气时,又会出现亮度范围狭窄(如32.5~57.8),原始信息包含小数点后信息,在数字化取整后丢失这些信息,如果映射时未提高对比度,即使后期进行提高对比度等数字操作也无法恢复的问题。

    对于最优化拍摄,即获取正确曝光的操作,选测光点、改变曝光时间、光圈、改变eV都仅仅是改变映射窗口的中心点位置。改变对比度,会收窄或者展宽映射窗口。对于大部分情况,可以看到直方图中,亮度呈正态分布,选择中心点就能正确曝光。常见的自动照片优化,则会通过提高对比度来提高这种照片的辨识度,但是提高对比度的算法往往是线性的而不够智能,容易出现高光区溢出死白的现象。而提高饱和度会让照片色彩更为鲜艳靓丽,但是提高饱和度造成饱和度溢出死红丢失细节,则更为常见,如市面的iPhone等手机自带的图片自动优化等。

    当亮度分布偏到直方图一边的情况下,我们会发现图片过暗或者过亮。改变gamma值,即对亮度做如公式1的重映射(其中L为亮度除以256做归一化取0~1之间的值),可以让画面更好看,或者说辨识度更高,或者说,在直方图中分布更均匀。当gamma<1时,整体画面变亮,可以让暗部更清晰。当gamma>1时,整体画面变暗,可以让亮部更清晰。我们可以看出,直方图中亮度分布越均匀,相对人眼的辨识度就越高,看起来也就越好看。

    公式1 Map(L)=Lgamma

    图2 gamma校正后的图像与直方图

    2 直方图均衡化算法
    从对gamma值调整的结果来看,我们可以看到,通过调节亮度映射的密度,使得让不同亮度的点的数目尽可能一致,能够使得在画面中尽可能保留原始信息。为此我们可以作如下映射:
    令 c(x)为亮度为x的点的数目,即直方图所代表的函数。s(x)为亮度小于x的点的数目占画面总像素点的比例,那么假设f(x)为原始亮度为x的像素点在重映射后的亮度(对最大亮度做归一化),则显然有当s(x)=p时,f(x)=p。而s(x)为c(x)的积分除以常数,所以有公式2:

    $Map(x)=\frac \Sigma i=0,x Count(i) \Sigma i=0,max Count(i) 0<x<1$

    这称为直方图均衡化。(参考文献 钴-60数字辐射成像集装箱检测系统,p111)考虑最简单的情况,对于各种HDR,或者RAW里面的映射,这种简单的映射已经足够。这种映射由于对信息密度做了最大化,因此不管是高动态范围,还是发灰的低动态范围,或者多亮度峰等复杂情况,都能够自动处理而无需人为干预。

    3 最优化均匀映射方案,及其他进一步优化的讨论

    当存在各种影响的时候,我们要给不同的亮度予以不同的权重:(公式3)

    $Map(x)=\frac \Sigma i=0,x Count(i)W(i) \Sigma i=0,max Count(i)W(i) 0<x<1$

    人眼近似可以看成对于图案,只对其相对亮度比例敏感、而不在乎绝对亮度,所以比重应该是 ln(x)的导数,即1/x,也就是说如果是裸眼看自然物体那么显然对数映射是信息密度最高的。但是由于存在噪声,所以当x接近于零时我们不能得到无穷大的信息密度。假如噪声强度为n,则从独立概率假设,有效信息强度应该近似为ln(\sqrt(x2+n2))的导数。对于数码图像,噪声大小和ISO、CCD大小、工作温度都有关系,常见的小底手机拍照,平均噪点强度大于5/256是很正常的。使用信息密度作为权重显然有利于进一步提高亮度中信息的有效利用。
    图3 γ值和对数密度之间的差异

    一般而言,我们把这种人眼对低亮度更敏感的特点用gamma值来表示(gamma=0.454),并使用类似gamma值的感光元件,和倒数gamma值(约2.2)的显示器。在日常拍摄中,这个缺省设定已经代表了信息存储的最佳密度,即已经无需调整。但是,gamma值公式和ln(\sqrt(x2+n2))的对数导数推算的信息密度虽然趋势相似、还是有一定差异的,并且在套用公式3时,对于暗部地区,显然先调整gamma值再计算和计算后调整gamma值对最后结果还是有一定影响的。

    不过,我们认为仅仅对于人眼gamma值的校正准确程度,对公式3的影响并不值得付出对应的巨大计算量的代价。但是对于显示器则不然。大多数显示器是CRT或者液晶的,对于低光(小于15/255)或者高光(240/255)的像素点,由于已经超出显示器亮度的线性区,并不能完美表现正确的亮度,所以,我们认为应该避开这些区域,具体而言就是给予这个区间的像素更高的权重,让他们占据更多的亮度区间。

    另外一个需要考虑的就是直方图均衡化,面积大并不一定总代表重要。当画面背景有大片的纯色背景时,可能少数非背景的图案才是重要的,如果完全靠数量决定,这些非背景的像素亮度宽度可能会被压缩到过小的地步。因此,公式3中的权重应该做截断处理,当Count(i)大于阈值时截断为阈值。作为经验值,我认为阈值每1/255亮度间隔取1%~5%面积比较好。

    克服上述现象的另外一个办法,就是使用和相邻点的相对亮度差异作为权重。考虑到每点都进行计算相对差异计算量较大,也容易引进噪点带来的虚假权重,我认为对原图做1/8尺寸比例缩略图进行绝对亮度差异(以10/255为截断上限)为权重的直方图均衡化是一个比较好的选择。

    4 伪代码
    init();
    for i=1 to picsize
    begin
    lum=pixal[i];//取某点的亮度
    d=abs(lum-pixal[next(i)]);//和邻近点的亮度差异
    if(d>threshhold_delta)d=10;//亮度差异过高会造成畸形矫正
    count[lum]=count[lum]+d;//累计本亮度的重要性
    end

    for i=0 to max_lum
    begin
    if(sigma_lum>threshhold_lum)sigma_lum=threshhold_lum;//扣除特殊情况
    //也可以对sigma_lum做对数处理以消除过高估计
    sigma_lum[i]=sigma_lum[i-1]+count[lum];//
    end

    total_lum=sigma_lum[max_lum];

    for i=0 to max_lum
    begin
    map_lum[i]=sigma_lum[i]*255/total_lum;
    end

    如果原始亮度带有小数点后精度,我们首先对亮度取整,用上述方法得到映射表后进行线性插值即可。如果原始亮度是分红绿蓝三原色,可以考虑取三分量中最大值作为上述算法的count的下标亮度值,d作为亮度差异可以选三原色亮度差异的总和。

    5 对于饱和度调整的改进

    本方法对于亮度的调整,已经有人探讨。但是对于图像饱和度的调整,如果仅仅根据HSL空间做线性增加,很容易出现高光色彩溢出的现象。解决的办法是对饱和度增加,不是采用直接原饱和度乘增加量的方法,而是用一个简单的映射函数,这个函数命名为f的话,有f(0)=0,f(1)=1且单调上升且可参数调整。最简单的函数就是幂函数,即类似亮度的gamma调整,即公式1,可调参数即γ值。
    其他可用的函数有倒数函数等,如f(x)=a-c/(x+1)。网页(http://blog.csdn.net/maozefa/article/details/1781208)描述了一种根据photoshop处理结果猜测的算法。
    而能够自适应处理,自动做最大饱和度,但是不出现饱和度溢出和亮度溢出,从而使得色彩自然的,上述的直方图均衡化方法显然更为适合,只不过均衡化的不是亮度而是饱和度而已。

    6 结论

    本方法通过直方图均衡化,可以将灰度图和彩色图的饱和度进行辨识度最高为目标的自适应优化,替代常见的各种照片自动优化方法,避免自动提高亮度和对比度时出现高光溢出现象,和提高过饱和度时的色彩溢出现象。同时,本算法考虑了处理速度的问题,并且对简单的根据亮度分布直方图可能造成的错误调整做了改进,

    相关文章

      网友评论

          本文标题:重映射

          本文链接:https://www.haomeiwen.com/subject/ldfvxttx.html