用於實時視頻和圖像去霧的優化對比度增強算法

1. 簡介

該算法由一個韓國人提出,論文原文pdf版地址:https://download.csdn.net/download/HIVAN1/12188573,該論文中提出的優化對比度增強算法即可用於圖像去霧,也可用於視頻去霧,本文主要講解圖像去霧核心思想和方法,視頻去霧只是增加臨時一致性因子來消除去霧後的幀間差異。

2. 算法思想

算法還是基於以下大氣散射模型
在這裏插入圖片描述
根據上式,最終無霧圖像由下式得到:
在這裏插入圖片描述
由上式可知,要得到無霧圖像J,需要先求出透射率t,以及大氣光A。整個算法就圍繞如何求上述兩個量而展開。
作者認爲霧的存在降低了圖像對比度,因此,去霧實際上是增加圖像對比度,但是增加對比度的同時,會導致圖像像素值超出0-255這個範圍,導致信息量的損失。因而,作者要提出的去霧算法必須權衡這兩者的關係,最大限度提升對比度的同時,帶來最小信息量的損失。
基於上述兩點考慮,作者提出兩個公式,如下圖所示:
在這裏插入圖片描述
上圖是優化對比度公式
在這裏插入圖片描述
上圖是信息損失公式,最終的權衡函數如圖所示:
在這裏插入圖片描述
算法的目標就是最小化這個E值。

下面對上面幾個公式進行漢語解釋,可能有點拗口,就是記錄一下便於下次看的時候理解。

在講解之前,我們先做這樣一個假設,假設已經求出了大氣光A值,然後隨便取了一個t值,該t值對整幅圖像都相同,通過去霧公式,計算去霧之後的圖像J。
優化對比度公式就是圖像J每個通道、每個位置的像素值,減去對應通道均值的平方和,再對平方和求均值。即求彩色圖像的方差。 作者代碼中爲了優化計算速度,實現上並不是計算的方差,而是各通道各位置像素值的平方和的均值減去所有通道所有像素值的和求平均的平方。
信息損失公式就是圖像J超出0-255的各個位置、各個通道像素值的超出部分的平方和的均值,比如(0,0)位置、(R,G,B)值爲(260,50,-10),則該位置超出部分值爲(260-255)2+(-10)2),將圖像中所有這樣的像素計算出的結果全部相加然後除以像素數量(像素數量=寬通道數)就是信息損失公式。

3. 算法流程

3.1 求取大氣光

該論文求取大氣光A值的方法和暗通道去霧算法不同,更加具有魯棒性。求大氣光算法主要分爲以下幾步:

  1. 將圖像srcImage均分爲四部分,分別爲左上:ulImage,右上:urImage,右下:brImage,左下:blImage。
  2. 計算每部分得分,方法如下:先計算每部分每通道的均值和標準差(例如:左上部分ulImage:ulMeanR,ulMeanG,ulMeanB,ulStdR,ulStdG,ulStdB)。然後計算得分Score(例如左上部分:ulScore=(ulMeanR-ulStdR)+(ulMeanG-ulStdG)+(ulMeanB-ulStdB))。
  3. 將得分最高的圖像部分賦給srcImage。
  4. 重複1-3步,直到最高得分區域面積小於預先設定值。作者代碼中設置的是200。
  5. 取該區域最亮點的RGB值作爲大氣光值,方法如下min(||(R,G,B)-(255,255,255)||)。即每點distance=sqrt((255-R)2+(255-G)2+(255-B)2),distance最小的點即爲最亮點。

注意我認爲該計算大氣光方法的前提是假設天空區域圖像亮度值較大且較爲均勻,因此,各通道均值較大,而標準差較小,這樣得分纔會最大化。
但是實踐證明此方法計算的大氣光也可能存在問題,對於工業應用,一般是光源打光,沒有天空部分,在鏡頭起霧的情況下,若圖像中有較爲鮮豔的顏色,我的實踐圖像中存在較大塊明亮黃色區域(RG通道值較大,B通道值較小),其餘部分爲灰白色(RGB通道值相似),導致黃色區域中最亮的像素被計算爲大氣光值,最後去霧後,圖像灰白色部分都變爲暗紫色,整個圖像顏色偏色嚴重。
因此,我認爲要麼找到一種更具魯棒性的方法,要麼根據自己圖像的特點進行大氣光值修正,我就是用的後者,由於圖像大部分區域爲灰白色,因此,我將計算得到的大氣光RGB值中與其他兩個相差較大的值修正爲另外兩個值的和的均值。

3.2 求粗透射率圖

粗投射率的求取是一個迭代的過程:

  1. 先對圖像分塊,分塊大小爲30*30,每塊圖像的初始投射率是相同的,初始值爲trans = 0.3。
  2. 然後對各個通道利用公式
    在這裏插入圖片描述
    計算出圖像J。
  3. 計算圖像J每塊的對比度:對每一個圖像塊(width, height),其通道數爲n,其像素數量爲nNumofPixels = width*height*n,然後計算其每個通道、每個位置像素值的平方和fSumofSquaredOuts,然後計算每個通道、每個位置像素值的和fSumofOuts。對比度 Econtrast = -(fSumofSquaredOuts/nNumofPixels - (fSumofOuts/nNumofPixels)2)。 可以看出這不是計算的方差,本文代碼利用計算方差後發現,與作者代碼效果差異不大,但是在色彩豔麗部分失真比作者的代碼要小一點。
    計算對比度的同時計算信息損失:對每個通道、每個位置的像素值value,若超出255,則計fSumofSLoss += (value-255)2,若小於0,則計fSumofSLoss += value2。信息損失 Eloss= fSumofSLoss/nNumofPixels。
  4. 計算代價函數:根據引入的懲罰係數λ,代價函數fCost = λ*Eloss+Econtrast。若fCost爲首次計算或非首次計算但fMinCost>fCost,則fMinCost = fCost,該圖像塊的transmission = trans。然後該塊的trans += 0.1。
  5. 循環迭代2-4步,迭代次數<7。

3.3 細化透射率圖

本步驟使用導向濾波實現,將原圖像的灰度圖作爲導向圖,粗投射率圖像作爲待濾波圖像,進行導向濾波,得到細化後的透射率圖像。

3.4 恢復無霧圖像

利用本文最開始的無霧圖像計算公式恢復出無霧圖像J即可。恢復得到的無霧圖像一般比原圖暗,可以適當利用gamma校正等手段校正圖像亮度。

4. 代碼

作者論文和代碼鏈接:http://mcl.korea.ac.kr/projects/dehazing/#userconsent#,論文下載要收費,可以在本文開頭下載鏈接中下載論文。
本人代碼鏈接:https://github.com/EthanAndEvan/DeHazeByContrastEnhance,若訪問不了github,還可以在本站下載:https://download.csdn.net/download/HIVAN1/12230497

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章