半年以来的图像去雾总结-图像去雾(一)暗通道去雾
圖像去霧最好的算法原型最好的莫過于何凱明博士的論文--好好閱讀,必有靈感
在接下來的博客中,我會分步介紹各個圖像去霧算法的研究和對比,在這里,首先介紹最經典的何凱明博士的暗通道去霧算法了,后面的博客有關于何博士算法的改進,有其他去霧算法的測試對比。
暗通道去霧算法
暗通道去霧算法,在其他博客都有詳細的介紹,在這里我也是借鑒其他各位總結的東西,寫點內容。
? ? ? ?一、實驗原理
? ? ? ?在絕大多數非天空的局部區域里,某一些像素總會有至少一個顏色通道有很低的值。換言之,該區域光強度的最小值是個很小的數。
我們給暗通道一個數學定義,對于任意的輸入圖像J,其暗通道可以用下式表達:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (1)
式中Jc表示彩色圖像的每個通道?,Ω(x)表示以像素X為中心的一個窗口。式(1)的意義用代碼表達也很簡單,首先求出每個像素RGB分量中的最小值,存入一副和原始圖像大小相同的灰度圖中,然后再對這幅灰度圖進行最小值濾波,濾波的半徑由窗口大小決定,一般有WindowSize = 2 * Radius + 1;?????????
??????暗通道先驗的理論指出:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2)
實際生活中造成暗原色中低通道值主要有三個因素:a)汽車、建筑物和城市中玻璃窗戶的陰影,或者是樹葉、樹與巖石等自然景觀的投影;b)色彩鮮艷的物體或表面,在RGB的三個通道中有些通道的值很低(比如綠色的草地/樹/植物,紅色或黃色的花朵/葉子,或者藍色的水面);c)顏色較暗的物體或者表面,例如灰暗色的樹干和石頭??傊?#xff0c;自然景物中到處都是陰影或者彩色,這些景物的圖像的暗原色總是很灰暗的。首先,在計算機視覺和計算機圖形中,下述方程所描述的霧圖形成模型被廣泛使用:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (3)
其中,I(X)就是我們現在已經有的圖像(待去霧的圖像),J(x)是我們要恢復的無霧的圖像,A是全球大氣光成分,?t(x)為透射率。現在的已知條件就是I(X),要求目標值J(x),顯然,這是個有無數解的方程,因此,就需要一些先驗了。將式(3)稍作處理,變形為下式:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ?(4)
?如上所述,上標C表示R/G/B三個通道的意思。首先假設在每一個窗口內透射率t(x)為常數,定義它為?,并且A值已經給定,然后對式(4)兩邊求兩次最小值運算,得到下式:
? ? ? ? ? ? ?? ?(5)
?上式中,J是待求的無霧的圖像,根據前述的暗原色先驗理論有:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(6)
?因此,可推導出:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (7)
?把式(7)帶入式(5)中,得到:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (8)
?這就是透射率??的預估值。
????在現實生活中,即使是晴天白云,空氣中也存在著一些顆粒,因此,看遠處的物體還是能感覺到霧的影響,另外,霧的存在讓人類感到景深的存在,因此,有必要在去霧的時候保留一定程度的霧,這可以通過在式(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;elsedes[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
總結
以上是生活随笔為你收集整理的半年以来的图像去雾总结-图像去雾(一)暗通道去雾的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式之禅【六大设计原则】
- 下一篇: 【Linux】制作U-Boot烧写镜像到