饱和度增强指的是通过调整图片和视频画面的饱和度特性,使得画面色彩得以还原真实色彩更加逼真或相比原画面更加丰富,从而提升人的视觉主观感受。对视频图像等后处理具有重要的意义。
1. 饱和度
饱和度是指色彩的鲜艳程度,也称色彩的纯度。
饱和度取决于该色中含色成分和消色成分(灰色)的比例。含色成分越大,饱和度越大;消色成分越大,饱和度越小。
其中,HSV模式中饱和度(Saturation)的计算公式(基于RGB色彩通道):
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> h s v . s a t = m a x ( r , g , b ) − m i n ( r , g , b ) m i n ( r , g , b ) hsv.sat=\frac{max(r,g,b)-min(r,g,b)}{min(r,g,b)} </math>hsv.sat=min(r,g,b)max(r,g,b)−min(r,g,b)
饱和度也可定义为彩度除以明度,与彩度同样表征彩色偏离同亮度灰色的程度。计算公式如下:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> s a t ( r , g , b ) = m a x ( ( r , g , b ) − g r a y 1 − g r a y , g r a y − ( r , g , b ) g r a y ) sat(r,g,b)=max(\frac{(r,g,b)-gray}{1-gray},\frac{gray-(r,g,b)}{gray}) </math>sat(r,g,b)=max(1−gray(r,g,b)−gray,graygray−(r,g,b))
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> s a t = m a x ( s a t ( r , g , b ) ) sat=max(sat(r,g,b)) </math>sat=max(sat(r,g,b))
2. 自然饱和度增强模型
有了前面对饱和度的定义和计算公式,我们知道当拿到当前任意一个像素点,我们知道如何获取这个像素点的饱和度。
接下来,我们的目标是,对饱和度进行增强调节,首先,给出定义饱和度增强的数学模型,如下:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> c o l o r = r g b + f ( s a t ) ⋅ ( r g b − g r a y ) color=rgb+f(sat)\cdot(rgb-gray) </math>color=rgb+f(sat)⋅(rgb−gray)
以上公式关键有2点:
(1) 利用了第1节中关于彩度定义中,彩色偏离灰色的程度,我们对饱和度增强就是在加大这个偏离程度。
(2) 通过什么样的数学模型表征这个偏离程度,线性模型还是非线性模型。如果使用线性,可能会存在对一些色彩过度增强导致色偏。
基于以上第2点,自然饱和度(Vibrance)的概念早已被提出。在调整自然饱和度时,会自适应提升画面中即饱和度低的颜色,而使原本饱和度够的颜色保持原状。自然饱和度的概念最先由 photoshop 提出,重点在于适应性,自然饱和度调整后一般比直接饱和度调整要更自然。
如何实现自然饱和度,这个时候主要看上面公式中 <math xmlns="http://www.w3.org/1998/Math/MathML"> f ( k ) f(k) </math>f(k)如何定义。本文提出一种简化的基于Gamma曲线的自然饱和度数学模型:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> f ( s a t ) = k ( 1 − s a t ) 1.7 f(sat)=k(1-sat)^{1.7} </math>f(sat)=k(1−sat)1.7
其中,sat的计算由第一节两个饱和度计算公式的出。 该数学模型的曲线如下图:
从以上曲线看出,该模型根据当前像素点的饱和度,很好地自适应调整了对应的饱和度系数。饱和度越高的点,增强效果越弱,饱和度越低的点,增强效果越强。
3. 肤色保护模型
在短视频或直播视频中,人像作为画面的主要内容的场景频率较高,以上的自然饱和度模型并没有考虑肤色情况,如果不加区别进行调节,可能会导致人像肤色偏红失真。因此,我们需要针对肤色区域进行识别,并对肤色区域做特殊处理,进而减轻饱和度的调整强度。
此时,新的饱和度增强模型更新为,其中, <math xmlns="http://www.w3.org/1998/Math/MathML"> s k i n ( r g b ) skin(rgb) </math>skin(rgb)代表肤色模型:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> c o l o r = r g b + s k i n ( r g b ) ⋅ f ( s a t ) ⋅ ( r g b − g r a y ) color=rgb+skin(rgb)\cdot{f(sat)\cdot(rgb-gray)} </math>color=rgb+skin(rgb)⋅f(sat)⋅(rgb−gray)
常用的肤色模型,包括基于RGB,YCrCb,YCgCr,HSV等色彩模型。针对肤色识别,已经有很多文章,本文限于章节内容,不做具体介绍。可以参考文献[1];
以上每一种模型都有自己的局限性,无法保证各种场景有100%的正确肤色识别正确率,和错判为肤色误判率。比如,RGB彩色模型受亮度影响较大;以上模型基本模型都有一个一个共同特征,按照区别判断,比如,以常用的YCrCb为例,可能的肤色区别为(最好根据自己的数据源调整范围):
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> { 133 ≤ C r < 173 77 ≤ C b < 127 \left\{ \begin{aligned} 133 \leq C_r <173\\ 77 \leq C_b < 127 \end{aligned} \right. </math>{133≤Cr<17377≤Cb<127
直接应用以上数学模型判断,会导致二值效应,即强烈的边际效应。所以改进的模型,可以基于YCrCb椭圆模型,使得 <math xmlns="http://www.w3.org/1998/Math/MathML"> s k i n ( C r , C b ) skin(C_r,C_b) </math>skin(Cr,Cb)的输出改为连续的函数,调整后的模型如下,表示的含义是,离肤色中心点越接近,值越接近1,即代表为肤色的概率越高,否则,越远离肤色点值越小,表示为肤色的概率越低。从而保证, <math xmlns="http://www.w3.org/1998/Math/MathML"> s k i n ( C r , C b ) skin(C_r,C_b) </math>skin(Cr,Cb)的输出是连续的变化的函数。
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> s k i n ( C r , C b ) = 1 − k ⋅ ( ( C r − C r 0 ) 2 a 2 + ( C b − C b 0 ) 2 b 2 ) skin(C_r,C_b)=1 - k\cdot{({\frac{(C_r-C_{r0})^2}{a^2}+\frac{(C_b-C_{b0})^2}{b^2}})}\\ </math>skin(Cr,Cb)=1−k⋅(a2(Cr−Cr0)2+b2(Cb−Cb0)2)
其中,C_rmax,C_bmax代表阀值上界,C_rmin,C_bmin代表阀值下界:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> a = C r m a x − C r m i n 2 a=\frac{{C_{rmax}-C_{rmin}}}{2}\\ </math>a=2Crmax−Crmin
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> b = C b m a x − C b m i n 2 b=\frac{{C_{bmax}-C_{bmin}}}{2}\\ </math>b=2Cbmax−Cbmin
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> C r 0 = C r m a x + C r m a x 2 C_{r0}=\frac{{C_{rmax}+C_{rmax}}}{2}\\ </math>Cr0=2Crmax+Crmax
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> C b 0 = C b m a x + C b m a x 2 C_{b0}=\frac{{C_{bmax}+C_{bmax}}}{2}\\ </math>Cb0=2Cbmax+Cbmax
经以上优化后,新的模型为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> c o l o r = r g b + ( 1 − s k i n ( C r , C b ) ) ⋅ f ( s a t ) ⋅ ( r g b − g r a y ) color=rgb+(1-skin(C_r,C_b))\cdot{f(sat)\cdot(rgb-gray)} </math>color=rgb+(1−skin(Cr,Cb))⋅f(sat)⋅(rgb−gray)
其中, <math xmlns="http://www.w3.org/1998/Math/MathML"> ( C r , C b ) (C_r,C_b) </math>(Cr,Cb)根据RGB计算得到。
参考文献:
[1]Human Skin Detection Using RGB, HSV and YCbCr Color Models`