一種消除局部自適應對比度加強算法方塊效應的方法

一種基於腐蝕膨脹運算實現的局部自適應對比度加強算法中,提出了一種能夠分開自適應的調整局部亮部和暗部對比度的方法。可是就象在評論中提到的,這種方法會產生方塊效應。特別是在對比度已經比較大的邊緣附近,這種方塊效應會比較明顯。這是由於在邊緣附近,對比度原本就是比較大的,偏均方差也就響應的比較大。那麼調整的時候給出自適應的調整量就會相應地變小。一旦離開邊緣附近,領域不包括邊緣,對比度就會相對陡然變小,那麼自適應的調整量就會相應變大。那麼在邊緣同一側就可能會比較明顯地出現不均勻的變化,也就是咱們所說的方塊效應。不均勻變化的位置離邊緣的位置之間的距離就是所使用的高光半徑或者暗影半徑大小。html

看一下示例。這裏爲了明顯顯示方塊效應,選擇了一張前景和背景反差比較大的圖片。同時這裏我特地把高光半徑和暗影半徑選的不同,這樣咱們就能夠看到在不一樣半徑的地方有兩個明顯的不均勻變化。c++

原始圖片  

                                      原始圖片(1024x701)                           高光半徑100,高光數量30,暗影半徑50,暗影數量30,產生方塊效應redis

消除方塊效應的辦法,一個是在作完對比度調整後,再作一個高斯模糊之類的低通濾波平滑這種不均勻。這種方法不可避免地會減少圖像總體清晰度。另外一個簡單的應對方法是,擴大所使用的領域。領域越大,包含像素越多,那麼移動領域時對比度變化幅度就不會特別劇烈(即便在邊緣附近),這樣使得調整量的變化幅度也會大幅減小,極大地減小了方塊效應。但同時,領域的擴大,也使得不一樣像素的領域不論是腐蝕仍是膨脹結果都更加趨同,失去了所謂的局部自適應的效果。極限狀況咱們想象一下,若是領域半徑接近甚至超過圖像大小,那麼全部像素的腐蝕或者膨脹結果都是同樣的了。那麼自適應調整量也就都同樣了,那就是一個全局的調整量了。算法

那麼有沒有一種方法既能減少方塊效應,又避免這些反作用呢?方塊效應產生的根源是在圖像邊緣附近對比度的變化過大致使的。那是否能過濾這種變化呢?這讓我想到了有保邊效果的選擇性平滑所使用的方法。好比選擇性均值平滑,不是把領域內的全部像素一塊兒求平均值,而是選擇領域內和中心像素的差值小於必定閾值的全部像素求平均值。假設在領域內有一個邊緣,若是設定合適的閾值,就能把和中心像素在邊緣另外一側的像素都排除掉,只使用和中心像素同側的像素參與計算,結果既保留了邊緣,也起到了平滑效果。若是應用這種思想,在計算自適應調整量時,具體就是在計算膨脹或腐蝕結果的偏方差的時候,只選擇和膨脹或腐蝕結果像素差值小於必定閾值的像素參與計算偏方差,理論上應該就能消除方塊效應了。ide

原理上來講和原始方法沒有大的區別,就是須要多設置一個閾值post

  • 膨脹腐蝕計算時也是選擇性的,選擇領域內和中心像素差值小於閾值的全部像素中的最大值(膨脹)和最小值(腐蝕)。
  • 計算偏方差也是選擇性的,選擇領域內和中心像素差值小於閾值的全部像素參與計算。公式是同樣的,只是求和不是全部像素總數n。

剩下的其餘步驟都是同樣的。測試

如何計算選擇性膨脹腐蝕,還有選擇性偏方差的方法也是一個問題。其中須要計算領域極值,均值和平方均值。原始算法是用積分圖來計算領域平方和和領域和,如今選擇性求和,積分圖再也不適用了。在選擇性平滑方法中常用的是O(1)複雜度的領域直方圖更新算法,原始論文能夠在Median Filtering in Constant Time找到。咱們在這裏也能夠用它,它的計算量基本和領域半徑無關。並且使用領域直方圖更新算法,能夠計算多種選擇性領域值,好比平均值,中值,極值,平方和均值,還能夠應用表面模糊算法,局部直方圖均衡等等。領域直方圖更新算法的主要思想是,計算領域內全部像素直方圖。當咱們從左到右,從上到下移動時,每次移動更新一次領域直方圖。更新時減去移出領域的全部像素的直方圖,加上新進入領域的全部像素的直方圖,這隻須要較少的計算量。具體的爲加快計算,還保持更新和領域高度相同的全部列的直方圖,這樣更新領域直方圖時,只需加減相應的列直方圖便可。具體算法這裏很少作討論了。url

有了領域直方圖,就能夠很簡單地計算選擇性平均值和平方和均值。以下代碼計算選擇性均值。選擇性平方和均值,還有極值也很簡單。spa

{ /* int cen: 中心像素 * int threshold: 閾值 * Hist[]: 領域直方圖 */
    int l; unsigned long weight = 0, sum = 0; int low, high; low = cen - threshold; if (low < 0) low = 0; high = cen + threshold; if (high > 255) high = 255; for (l = low; l <= high; l++) { sum += Hist[l] * l; weight += Hist[l]; } return sum / weight; }
選擇性計算領域均值

 對於高光調整計算,一次直方圖更新算法能夠獲得選擇性平方和均值,均值和最小值。再作一次直方圖更新算法能夠獲得暗影調整所需的值。若是高光和暗影半徑是同樣的話,只須要一次直方圖更新算法就能夠獲得高光暗影調整全部須要的結果。再遍歷一次圖像,應用到全部像素便可。3d

看一下效果。無閾值至關於領域內全部像素都參與計算,如前所述會產生方塊效應。保持高光和暗影半徑不變,隨着閾值減少,方塊效應也會減少,達到咱們但願的結果了。

原始圖片   

                                        原始圖片(1024x701)                                高光半徑100,高光數量30,暗影半徑50,暗影數量30,無閾值

  

高光半徑100,高光數量30,暗影半徑50,暗影數量30,閾值50        高光半徑100,高光數量30,暗影半徑50,暗影數量30,閾值10

分享一個測試程序https://files.cnblogs.com/files/mightycode/edcontrast.7z,須要安裝vc++ 2015-2019 redistributable。

相關文章
相關標籤/搜索