在好久前實現對比度受限的自適應直方圖均衡化時,就曾經想過對該算法進行必定程度的擴展,以後使用自動對比度和自動色階代替直方圖均衡化也提出了新的算法,也達到了不錯的效果。本文進一步對該算法進行必定程度的擴展和補充優化。算法
1、本文算法的概述測試
根據選取的優化的水平和垂直網格數,將圖像切分紅一個一個的子塊,而後統計每一個子塊的直方圖信息,並和原圖總體的直方圖信息進行某種混合,對於彩色圖像,爲了不不一樣通道之間處理後變化過於不協調,還增長了各通道直方圖與亮度通道直方圖的信息合成,而後對合成後的直方圖進行直方圖裁剪和均衡化的,獲取各子塊新的映射直方圖,爲了不新的映射表中的數據有較大的奇點或噪音,對映射表的數據進行多點取樣,而後使用樣條插值算法對取樣點進行插值,或者對新的映射表進行必定程度的高斯模糊,獲得一張較爲平滑的映射表。最後使用相似CLAHE算法中的雙線性插值對每一個子塊之間的映射表進行插值獲得新的像素值。本方法計算量小,速度很快,對映射表進行平滑插值或高斯模糊能有效的抑制對比度調整時產生的噪聲,防止了信息的過分放大形成圖片失真,是一種高效而且效果突出的對比度加強算法。優化
2、算法過程詳解spa
一、水平和垂直網格數的肯定3d
相似於CALHE算法,對網格的合理選取也會對本算法的結果產生重要的影響,過多的網格數會使得計算量顯著加大,過少的網格數使得結果趨於接近總體的直方圖均衡化,通常狀況下,可選擇8*8個網格,這裏能夠經過如下原則來簡單的作個優化:圖像的亮度的均方差越小,即整幅圖像的明暗比較一致,使用較多的網格數,好比8*8,不然使用較少的網格,好比4*4。這是由於當圖像明暗較爲一致時,各小塊的直方圖數據差別不會很大,而若是明暗不一致,選擇較小的塊,各塊之間的直方圖信息差別可能很大,會形成插值時出現明顯的瑕疵。code
二、按規定的網格數劃分圖像,並獲取每塊的直方圖信息HistB,HistG,HistR。blog
三、獲取全圖的直方圖數據HistgramB,HistgramG,HistgramR以及亮度直方圖HistgramL。索引
其中亮度定義爲: Lightness = (R*19595 + G*38469 + B*7472) >> 16圖片
四、對子塊直方圖和全局直方圖進行融合,以下代碼所示:ip
HistB[Index] = (HistB[Index] * Adaptation + (100 - Adaptation) * HistgramB[Index]) / 100; HistG[Index] = (HistG[Index] * Adaptation + (100 - Adaptation) * HistgramG[Index]) / 100; HistR[Index] = (HistR[Index] * Adaptation + (100 - Adaptation) * HistgramR[Index]) / 100; HistL[Index] = (HistL[Index] * Adaptation + (100 - Adaptation) * HistgramL[Index]) / 100;
其中Adaptation爲融合因子,其有效範圍爲[0,100],當取值越小時,全局直方圖其主導做用,效果越接近普通的直方圖均衡。
五、對上述融合後的結果再次和亮度直方圖進行融合,融合過程以下所示:
HistB[Index] = (HistB[Index] * Correction + (100 - Correction) * HistL[Index]) / 100; HistG[Index] = (HistG[Index] * Correction + (100 - Correction) * HistL[Index]) / 100; HistR[Index] = (HistR[Index] * Correction + (100 - Correction) * HistL[Index]) / 100;
其中Correction爲顏色校訂因子,其有效範圍爲[0,100],當取值越大時,各通道之間越獨立,效果越接近普通的直方圖均衡。
上述代碼中Index表示直方圖色階的索引範圍,有效值[0,Bins – 1],Bins爲直方圖的數量,8位時爲256。
六、按照CALHE的方式對直方圖進行裁剪,以後對裁剪的直方圖進行均衡化獲得每一個小塊的映射表。
七、局部均衡化後映射表的平滑。
1) 將映射表的 Bins取K等份,獲得每等份數據對應的映射表值,構成K個二維座標點序列,亦能夠根據直方圖的累計數據,把累計數據平均分爲K等分,獲得K個二維序列點。
2)根據K個二維座標點,使用樣條插值算法擬合出一條過各個取樣點的平滑映射曲線。
3)在平滑曲線表中取0至於Bins中各色階對應的插值結果,做爲新的映射表結果。
對於Bins =256的圖像,K值建議可取32左右。
或者另一種處理方式就是對映射表進行一維方向的均值或者高斯平滑,平滑窗口可選WindowSize = 7左右。
這種平滑能夠帶來必定的好處,特別是對於圖像變換比較平緩的區域,可以在必定程度上減弱因爲加強帶來的色塊感受,並且這種方式推廣到全部基於直方圖加強技術的算法中。
八、按照CLAHE算法的過程對每一個小塊進行雙線性插值獲得最終的加強效果,固然對第一行、第一列、最後一行、最後一列的子塊靠近圖像邊緣的那一半都只使用映射表單個方向的線性插值,而這些子塊的其餘部分以及其餘子塊均使用映射表雙線性插值得到最終結果。
若是輸入圖像是灰度圖,因爲只有一個通道,則本算法中的Correction在此場景中是可捨棄的。
整個過程的流程框圖以下所示:
3、測試結果
下圖爲未通過處理的原始圖像,可見原始圖中對比度不好,圖像的細節信息不多,圖像飽和度也不好。右側是使用本算法後處理的效果圖,處理後圖像飽和度天然,色彩鮮豔,隱藏在原圖右側的一些不可易見的細節也能清楚的展現出。
原始圖像 Adaptation = 50,Correction = 50, ClipLimit = 20時的效果
Adaptation = 0,Correction = 50, ClipLimit = 20時的效果 Adaptation = 100,Correction = 50, ClipLimit = 20時的效果
Adaptation = 50,Correction = 0, ClipLimit = 20時的效果 Adaptation = 50,Correction = 100, ClipLimit = 20時的效果
下面做圖是另一副未經處理的圖像,這副圖像信息較爲完整,色彩也較爲豐富,可是通過本算法處理後,獲得的結果圖(右圖)則顯得更爲驚豔和奪目,所以對於正常的圖像,本算法也具備較強的實用性。
特別強調,該算法不適宜處理人臉圖像。
該算法難以使用SSE優化,我在考慮是否還有其餘方式優化。速度上1080P的彩圖大約30ms能夠搞定。
測試工程的地址:http://files.cnblogs.com/files/Imageshop/SSE_Optimization_Demo.rar
寫博不易,歡迎點贊或者打賞。