背景
色彩增強作為視訊後處理中畫質增強技術的一部分,指的是通過調整圖片和視訊畫面的飽和度特性,使得畫面色彩更加豐富和逼真,提升人的視覺主觀感受。由於裝置攝像頭的多樣性,部分攝像頭在視訊採集時存在飽和度不足,畫面發灰,色彩寡淡等問題,這些情況在拍攝室外景物和顏色豐富的場景時尤其容易出現。這些問題可以通過演算法的後處理調整進行改善。色彩增強配合視訊降噪,暗光增強,對比度調整,邊緣增強等技術,可以對視訊畫質起到較大的提升作用。
■色彩增強效果示意圖(左:原圖 右:增強後)
原圖來源:HEVC 標準測試碼流
色彩增強演算法的設計
後處理對於顏色的調整,一般有兩個不同的目標,“還原”和“好看”。“還原”指的是使畫面能夠真實呈現場景的真實顏色,不偏色。“好看”指的是畫面的顏色層次足夠豐富和自然,能夠提升人視覺的舒適感,使天空更藍草地更綠,出來的畫面更符合人的喜好,是一個相對主觀的指標。色彩增強主要關注在“好看”這一目標上。目前針對色彩增強的客觀評價標準和公共資料集都比較缺乏,根據蒐集到的一些資料,大約可以歸納出以下色彩增強演算法的設計目標:
1.調整後能夠提高人對畫面質量的主觀感受。這個目標是否達成,主要依賴於開發人員、評測人員和使用者的主觀判斷打分。
2.演算法具有適應性。適應性是指對於不同影像,或者同一影像的不同部分,調節強度因應影像特性而有差異。避免導致原來已經較為鮮豔的色彩出現過飽和的現象。
3.調整後不產生明顯瑕疵。色彩增強比較容易產生的問題是過飽和,畫面細節的丟失,偏色,或者導致顏色分層等瑕疵。另外也很容易強化畫面暗部的彩色噪聲。
4.對於視訊幀序列來說,色彩增強的處理不能造成畫面顏色突變。比如一些依賴於全域性統計量的演算法,光源的突然出現可能會造成畫面效果的突變,造成畫面效果的跳變。
5.對人像的膚色進行保護。單純的色彩增強演算法容易導致人像膚色變“橙”的問題。由於人的膚色與物體的顏色不同,存在一個經驗合理範圍,調整超出這個範圍之後就會使人像看上去不真實。所以需要對人的膚色進行一定的保護。
6.需要考慮色彩增強在整個視訊處理流程中與其他畫質調整模組的配合,會否造成整體效果變差的情況。
以上的各點可以看做是演算法設計時的一個自檢表,並非必要全部嚴格滿足,但是如果其中的一項出現了比較嚴重的問題,那麼這個演算法的可用性會大打折扣。
顏色模型的選擇
色彩增強方法一般通過將 RGB 顏色轉換到合適的顏色模型,比如HSV,YUV,Lab 顏色模型等,再套用設計好的演算法對特定通道進行調整。一般希望將表徵色彩鮮豔程度的分量提取出來進行單獨調整,這樣調整的時候就不會對明暗造成影響,也不會造成偏色。
■調整流程示意
除此之外,目前還有使用基於神經網路的方法去做影像增強,由網路自己完成對影像的調整,而不需要由人來設計公式。深度學習的增強方法一般會將色彩,對比度,亮度增強同時實現在一個網路中同時調整,達到畫質增強的效果,而其中又分為黑盒方法和白盒方法等。
由於我們色彩增強的工程需求是快速落地,在移動端實現實時、輕量級,並且效果高度可控的演算法,同時需要效果與美顏、暗光增強、去噪等模組解耦並相互配合,因此非神經網路的色彩增強方法是更好的選擇。
色彩增強方法面臨的第一個問題是如何選擇合適的顏色模型去進行演算法設計。
基於 HSV 顏色模型的飽和度調整
基於 HSV 飽和度的調整方法是將 RGB 顏色模型轉換為 HSV 顏色模型,其中 HSV 分別表示(Hue)色相,(Saturation)飽和度和(value)明度。只調整飽和度可以在不影響明暗和色相的情況下增強色彩的鮮豔程度。
常見的調整方法有整體抬升,按比例增加,或者曲線調整,達到將整體飽和度提高的目的。如下圖的 gamma 曲線就是比較常用的調整曲線。
■曲線調整示意圖
但是飽和度調整同時提升所有顏色的強度,比較粗暴,有可能導致區域性過飽和,區域性細節的消失。
■膚色發生了一定的過飽和現象(左:原圖 右:增強後)
■調整後衣服皺褶細節丟失(左:原圖 右:增強後)
原圖來源:HEVC標準測試碼流
這對這個問題,自然飽和度(Vibrance)的概念被提出。在調整自然飽和度時,會智慧提升畫面中比較柔和(即飽和度低)的顏色,而使原本飽和度夠的顏色保持原狀。
基於自然飽和度的調整
自然飽和度的概念最先由 photoshop 提出,重點在於適應性,自然飽和度調整後一般比飽和度調整要自然。下面分別介紹兩種自然飽和度調整的演算法。
第一種直接在 RGB 通道上進行統計與調整。其自然飽和度調整的流程是:
1.計算每個畫素 r、g、b 的均值和最大值,分別記為 rgb_avg 以及 rgb_max。
2.計算 k 值:k = ( abs( rgb_max - rgb_avg ) / 127.0 ) * Vibrance。其中 Vibrance v為調節強度係數,範圍為 0~100。
3.對 r、g、b 分別用同一公式進行調整,以 R 為例,r = (rgb_max - r) * k + r。
該種調節方式可以針對飽和度不同的畫素進行不同的調整,能夠比較好避免過飽和的情況發生。但是從公式上可以知道,其調整傾向於將 rgb 值往同一個 rgb_max 值進行靠近,可能無法保證顏色保持穩定,不同顏色的調整力度差異較大,會發生偏色的情況。
第二種通過亮度和飽和度進行自適應調節。其自然飽和度的調整流程是:
1.從 RGB 計算 luma 值:luma = 0.2126 r + 0.7152 g + 0.0722 *b。
2.從 rgb 計算 satuation 值:satuation = max(r ,g, b) - min(r, g, b)。
3.計算 k 值:k = 1.0 + Vibrance * (1.0 - satuation / 255.0),其中Vibrance為調節強度 0~1。
4.對 r、g、b 分別用同一公式進行調整,以 r 為例,r = luma (1.0 - k) + r k。
同樣地,從公式上可以知道,其調整傾向於將 rgb 值往同一個 luma 值進行靠近,也是無法保證顏色保持穩定,會發生偏色的情況。
■基於自然飽和度的增強(左:原圖 右:增強後)
從顏色模型上看,基於 RGB、HSV 等顏色空間的顏色調整,對於人的視覺感知是非均勻的,很可能會產生偏色的情況,因此需要一個更合適的顏色模型。Lab 顏色模型是 CIE 在 1976 年改進並且命名的一種色彩模式。它是一種裝置無關的顏色模型,也是一種基於生理特徵的顏色模型,更適合應用在色彩增強上。
基於 Lab/Lch 顏色模型的調整
Lab 顏色模型由三個要素組成,一個要素是亮度(L),a 和 b 是兩個顏色通道。而 Lch 顏色模型採用了同 Lab 一樣的顏色空間,但它採用 c 表示飽和度值及 h 表示色調角度。可以認為,ch 是 ab 的極座標表示方式。由於 Lch 模型是基於生理特徵建立的,意味著如果只調節 c 飽和度值的話,就可以起到保證不偏色的效果。
開源影像處理軟體 Gimp 的自動色彩增強演算法是使用 Lch 顏色模型進行調整的,其處理流程為:
1.將 RGB 轉換到 LCH。
2.遍歷影像畫素,找到 C 的最大值 c_max 和最小值 c_min。
3.對每個畫素的 C 進行拉伸:c = (c - c_min) / (c_max - c_min) * 100。
4.將 LCH 轉換回 RGB。
■處理前
■處理後
在 Lch 空間進行調節要比 HSV 上調節科學得多,從實際效果上看,基本上沒有出現偏色的情況。不過 Gimp 的方法主要針對的是圖片,當用在視訊上時,由於存在全域性統計,求最大最小值,會增加一定的運算量,同時它會受影像最強點和最弱點的影響較大,若有最強點和最弱點突然離開或進入螢幕,效果可能出現突變,所以這個方法不適用於視訊處理。在實際工程化的時候,需要重新設計調整公式,去除對於全域性統計點的依賴。
彩色噪聲抑制
影像採集的噪聲從色彩空間上劃分,可以分為 luma noise 亮度噪聲與 chroma noise 彩色噪聲。色彩增強的應用場景中,比較容易出現的問題是同時把畫面中的彩色噪聲放大,因此在演算法的設計過程中要儘量避免。
同樣強度的噪聲,在飽和度較低的平坦區域遠比在顏色鮮豔的區域看起來要明顯。在彩色影像灰色區域中,噪聲往往以彩色噪點的形式出現,色彩增強如果不加區分的話,會同時將這些噪點也一併增強,如下圖:
■彩色噪聲被增強示意圖(左:原圖 右:增強後)
針對彩色噪聲的統計特性,在工程化的時候,需要進行噪聲的判斷,並降低色彩增強在這些地方的調整強度。經過噪聲抑制之後的效果如下圖:
■噪聲抑制效果
膚色保護
由於人的膚色存在一個經驗合理範圍,調整超出這個範圍之後就是使得人像看上去不真實。所以在色彩增強的時候,需要對人的膚色進行一定的保護,避免調整過度。要對膚色進行保護,首先要對膚色進行識別,然後對於膚色的部分減弱色彩增強的影響。膚色識別演算法大部分是基於某顏色空間下的統計特徵,包含大量的經驗值。一般主流的有以下的膚色識別方法:
基於 RGB 色彩模型的膚色識別
直接使用 RGB 色彩模型是比較簡便的手段,因為一般傳入的資料都是 RGB 為主。較為常用的方法是條件判斷法,對 RGB 的值進行條件判斷,落入經驗範圍中則判斷為膚色。其中分為均勻光照和側光兩種判斷條件,實際操作時一般會將這兩個判斷條件同時使用,只要符合其中一個,即判斷為膚色。
除此之外,在 RGB 色彩模型中還可以使用二次多項式模式檢測。模型由兩個歸一化 R-G 平面的二次多項式和一個圓方程構成,只要這三個公式的值落入一定經驗範圍則判斷為膚色。
基於 RGB 的膚色識別方法操作最為簡便,一般不需要進行色彩模型的轉換。但是由於該色彩沒有將亮度和顏色進行分離,判斷公式一般都比較煩冗,膚色識別的準確性受光照條件的影響較大。
基於 YCbCr 色彩模型的膚色識別
一般我們聽到的 YUV 實際就是指 YCbCr。YCbCr 色彩模型將色彩分解為亮度值 Y 與二維色度值 CbCr,能夠只對色度進行判斷,避免光照條件的影響。使用 YCbCr 色彩模型,比較直接的膚色識別方法是範圍判斷法。從 RGB 轉換到 YCbCr 之後,對於 CbCr 組成的二維平面,只要落在經驗範圍之內,都認為是膚色。文獻上能查到不同經驗範圍,一般選擇其中一種使用即可,例如 133 <= Cr <= 173,77 <= Cb <= 127。
除了直接判斷範圍,YCbCr 也可以使用基於橢圓的膚色識別方法。該方法基於經驗統計資料,對於 CbCr 組成的二維平面,只要落在橢圓之內,都認為是膚色,準確性比單純的範圍判斷更高。這個膚色檢測方法被 opencv 所採用。在 opencv 中的橢圓引數為:[113,155.6]為橢圓中心,[23.4,15.6]為長軸和短軸,傾斜角度為 43.0。
■橢圓膚色CbCr區域示意
基於 HSV 色彩模型的膚色識別
HSV 色彩模型也同樣將亮度與顏色進行了分離,因此對於光照變化也有很強的抗干擾能力。
基於 HSV 的膚色識別方法常見的有基於高斯模型的方法。這個方法被開源處理庫 GPUImage 所採用的。其基本思路為:將 RGB 轉換到 HSV 空間,並計算 h 與 skinHue 距離:dist = abs(h – skinHue) / 0.5,其中 skinHue 為高斯模型統計均值,一般使用 0.05。高斯模型方差相關統計引數為 skinHueThreshold,一般取 40。高斯權重通過 exp(-dist dist skinHueThreshold)公式求得。這個方法只計算出膚色識別的權重(概率),後面可以通過設定閾值(比如>0.95)來獲得膚色檢測結果。
另外,基於 HSV 的膚色識別方法也有範圍判斷法,一般通過文獻上提供的 H、S、V 經驗範圍進行判斷,操作比較簡單,在此不詳細列出。
■膚色識別結果示意(上:原圖 下:膚色識別結果)
■膚色保護下色彩增強效果
色彩增強演算法落地效果
在加入了噪聲抑制和膚色保護之後,我們得到了最終的色彩增強演算法效果。
■加入噪聲抑制和膚色保護之後的色彩增強演算法效果(左:原圖 右:增強後)
原圖來源:HEVC 標準測試碼流
總結
總體來說,在我們色彩增強演算法的落地過程中,加入了噪聲抑制和膚色保護的演算法能夠在大部分場景下的獲得更好的更穩定的效果。不過依然有不少可以改進的方向,例如如何把針對場景和畫面特性的適應性做得更好,如何把膚色識別做得更精準等等。另外,目前這裡討論的只是色彩增強,要做到比較好的畫質增強,還需要配合對比度亮度的調整,去噪演算法,甚至是偽 HDR 演算法等,如何通過融合不同的演算法輸出一個更好的結果,也是一個需要不斷迭代研究的課題。
Dev for Dev專欄介紹
Dev for Dev(Developer for Developer)是聲網Agora 與 RTC 開發者社群共同發起的開發者互動創新實踐活動。透過工程師視角的技術分享、交流碰撞、專案共建等多種形式,匯聚開發者的力量,挖掘和傳遞最具價值的技術內容和專案,全面釋放技術的創造力。