半年以來的圖像去霧總結-圖像去霧(一)暗通道去霧

圖像去霧最好的算法原型最好的莫過於何凱明博士的論文--好好閱讀,必有靈感

在接下來的博客中,我會分步介紹各個圖像去霧算法的研究和對比,在這裏,首先介紹最經典的何凱明博士的暗通道去霧算法了,後面的博客有關於何博士算法的改進,有其他去霧算法的測試對比。

暗通道去霧算法

暗通道去霧算法,在其他博客都有詳細的介紹,在這裏我也是借鑑其他各位總結的東西,寫點內容。

       一、實驗原理

       在絕大多數非天空的局部區域裏,某一些像素總會有至少一個顏色通道有很低的值。換言之,該區域光強度的最小值是個很小的數。

  我們給暗通道一個數學定義,對於任意的輸入圖像J,其暗通道可以用下式表達:

                                                                                          (1)

式中Jc表示彩色圖像的每個通道 ,Ω(x)表示以像素X爲中心的一個窗口。式(1)的意義用代碼表達也很簡單,首先求出每個像素RGB分量中的最小值,存入一副和原始圖像大小相同的灰度圖中,然後再對這幅灰度圖進行最小值濾波,濾波的半徑由窗口大小決定,一般有WindowSize = 2 * Radius + 1;         

      暗通道先驗的理論指出:

                                                                                                                         (2)

實際生活中造成暗原色中低通道值主要有三個因素:a)汽車、建築物和城市中玻璃窗戶的陰影,或者是樹葉、樹與岩石等自然景觀的投影;b)色彩鮮豔的物體或表面,在RGB的三個通道中有些通道的值很低(比如綠色的草地/樹/植物,紅色或黃色的花朵/葉子,或者藍色的水面);c)顏色較暗的物體或者表面,例如灰暗色的樹幹和石頭。總之,自然景物中到處都是陰影或者彩色,這些景物的圖像的暗原色總是很灰暗的。首先,在計算機視覺和計算機圖形中,下述方程所描述的霧圖形成模型被廣泛使用:

                                                                                                 (3)

其中,I(X)就是我們現在已經有的圖像(待去霧的圖像),J(x)是我們要恢復的無霧的圖像,A是全球大氣光成分, t(x)爲透射率。現在的已知條件就是I(X),要求目標值J(x),顯然,這是個有無數解的方程,因此,就需要一些先驗了。將式(3)稍作處理,變形爲下式:

                                                                                   (4)

 如上所述,上標C表示R/G/B三個通道的意思。首先假設在每一個窗口內透射率t(x)爲常數,定義它爲 \widetilde{t}(x),並且A值已經給定,然後對式(4)兩邊求兩次最小值運算,得到下式:

                (5)

 上式中,J是待求的無霧的圖像,根據前述的暗原色先驗理論有:

                                                                          (6)

 因此,可推導出:

                                                                                                 (7)

 把式(7)帶入式(5)中,得到:

                                                                          (8)

 這就是透射率 \widetilde{t}(x) 的預估值。

    在現實生活中,即使是晴天白雲,空氣中也存在着一些顆粒,因此,看遠處的物體還是能感覺到霧的影響,另外,霧的存在讓人類感到景深的存在,因此,有必要在去霧的時候保留一定程度的霧,這可以通過在式(8)中引入一個在[0,1]之間的因子,則式(8)修正爲:

                                                                         (9)

 本文中所有的測試結果依賴於: ω=0.95。

     上述推論中都是假設全球大氣光A值時已知的,在實際中,我們可以藉助於暗通道圖來從有霧圖像中獲取該值。具體步驟如下:

         1) 從暗通道圖中按照亮度的大小取前0.1%的像素。

         2) 在這些位置中,在原始有霧圖像I中尋找對應的具有最高亮度的點的值,作爲A值。

     到這一步,我們就可以進行無霧圖像的恢復了。由式(3)可知: J = ( I - A)/t + A  ,現在I,A,t都已經求得了,因此,完全可以進行J的計算。當投射圖t 的值很小時,會導致J的值偏大,從而使淂圖像整體向白場過度,因此一般可設置一閾值T0,當t值小於T0時,令t=T0,本文中所有效果圖均以T0=0.1爲標準計算。

         因此,最終的恢復公式如下:

                                                                                          (10)

二、實驗步驟

1、找出每個像素的RGB三通道的最小值、形成圖像的暗通道圖像。

2、在暗通道圖片中每個像素的周圍15*15的矩形中找像素最小的值,作爲該像素的值。

3、由(9)式算出投射圖。

具體代碼如下:

void dark_channel(unsigned char* des,const unsigned char* img,int width,int height)

{
    int A = 0;
    for(int y = 0; y < height; y++)
    {
        for(int x = 0; x < width; x++)
        {
             int B = img[y * width * 3 + x * 3 + 0];
             int G = img[y * width * 3 + x * 3 + 1];
             int R = img[y * width * 3 + x * 3 + 2];
             if(B<G)
                des[y * width + x]=B;
             else
                des[y * width + x]=G;
             if(R<des[y * width + x])
                des[y * width + x]=R;
        }
    }
    for(int y = 0; y < 5; y++)
    {
        for(int x = 0; x < width; x++)
        {
            if(des[y * width + x]>A)
                A=des[y * width + x];
        }
    }                
    int patch= 6;
    printf("A的值%d",A);
    double w=0.95*A/255;
    unsigned char* ocl = new unsigned char[width * height];
    memcpy(ocl,des,width * height);
    for(int y = patch; y < height-patch; y++)
    {
        for(int x = patch; x < width-patch; x++)
        {
            for(int i = -patch; i < patch+1; i++)
            {
                for(int j = -patch; j < patch+1; j++)
                {
                    if(des[(y + i) * width + (x + j)]<ocl[y * width + x])ocl[y * width + x]=des[(y + i) * width + (x + j)];
                }
            }
             ocl[y * width + x]=int(255-w*ocl[y * width + x]);
        }
    }
    memcpy(des,ocl,width * height);

}

 三、最終實驗結果

可以清楚的看出來,左邊的是原圖,右邊是去霧後的圖片,去霧效果還算理想。

另外附上何博士的原文地址:

http://xueshu.baidu.com/s?wd=paperuri%3A%2882db63209f43fcf5add7b429e6b37e23%29&filter=sc_long_sign&tn=SE_xueshusource_2kduw22v&sc_vurl=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Ficp.jsp%3Farnumber%3D5206515&ie=utf-8&sc_us=6975395480982385039

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