首先是需匯入的標頭檔案和包,我覺得一些演算法不給出包的話對我這種初學者不夠友好。
本演算法使用到了vector陣列和排序的演算法所以用到了algorithm和vector
#include
#include
#include
#include
using namespace cv;
using namespace std;
首先是獲得暗通道的過程,這裡用到了兩個全域性變數,分別是影象的長和寬(rows,cols)
int rows, cols;
//得到暗通道
int**
getdarkchannel
(cv:
:mat img, int blocksize =3)
//使用指標得到乙個二維矩陣
int** imggray;
imggray =
newint
*[rows]
;for
(int i =
0; i < rows; i++
)//求每個畫素點的三通道中的最小值,存入剛建立的二維矩陣
for(int i =
0;i < rows;i++)}
imggray[i]
[j]= min;}}
//每個畫素點的三通道最小值已經求好,得到imggray矩陣
//開始求暗通道的第二部步,把剛剛求的二維矩陣進行最小值濾波
if(blocksize %2==
0|| blocksize <3)
int poolsize =
(blocksize -1)
/2;//濾波視窗大小
int newheight = rows + blocksize -1;
int newwidth = cols + blocksize -1;
//使用乙個擴充過的矩陣進行濾波
int** imgmid =
newint
*[newheight]
;for
(int i =
0;i < newheight;i++
)for
(int i =
0;i < newheight;i++
)else}}
//暗通道對應畫素值的矩陣
int** dark =
newint
*[rows]
; cv:
:mat imgdark
(rows, cols,
cv_8uc1);
//預留出來要顯示的暗通道,也就是在這個方法中顯示一下
int darkmin =
255;
//預先設定最小值
for(int i =
0;i < rows;i++
)//最小值濾波
for(int i = poolsize;i < newheight - poolsize;i++)}
} dark[i - poolsize]
[j - poolsize]
= darkmin;
imgdark.at
(i - poolsize, j - poolsize)
= darkmin;}}
cv::imshow
("暗通道"
, imgdark)
;return dark;
//返回最小值濾波的結果矩陣
}
//定乙個結構體用來儲存畫素點的位置以及對應的暗通道的值
struct node
node
(int n_x, int n_y, int n_val):x
(n_x),y
(n_y)
,val
(n_val)
bool operator<
(const node& rhs)
};
估算大氣透光率的函式
int geta
(int** dark, cv:
:mat img, float percent =
0.001)}
//給vec內的元素排序,便於尋找前面0.1%的值
sort
(vec_node.
begin()
, vec_node.
end())
;//1,取前0.1%的暗通道的畫素位置。
//2,在原始有霧影象i中尋找對應的具有最高亮度的點的值,作為a值
//當precent為0的時候就取暗通道排序後的第乙個畫素點的三通道值的最大值
int a =0;
if(int(percent * size)==0
)}}for
(int i =
0; i <
int(percent * size)
; i++)}
}return a;
}
前面方法組合其阿里的去霧
//去霧
cv::mat getfinalimg
(cv:
:mat img, float omega =
0.95
, float t0 =
0.1, int blocksize =
15, float percent =
0.001
)for
(int i =
0; i < rows; i++)}
} cv:
:mat dst
(img.rows, img.cols,
cv_8uc3);
for(int channel =
0; channel <
3; channel++)if
(temp <0)
dst.at
(i, j)
[channel]
= temp;}}
}return dst;
}
最後使用一下看看效果 暗通道先驗原理 DCP去霧演算法
一 霧圖形成模型 變形 c為r g b三通道。二 dark channel prior 統計規律 對於乙個無霧影象,每個區域性區域很可能至少乙個顏色通道會有很低的值,或黑色東西。非天空區域 每個區域性區域都總有一些很暗的東西。dark object subtraction 利用全圖最暗點來去除全域性...
何愷明經典去霧演算法
視覺機械人 個人感覺學習他的經典演算法固然很重要,但是他的解決問題的思路也是非常值得我們學習的 那是2009年4月24日的早上,我收到了一封不同尋常的email。發信人是cvpr 2009的主席們,他們說我的文章獲得了cvpr 2009的最佳 獎 best award 我反覆閱讀這封郵件以確認我沒有...
何教授去霧演算法C 實現(除錯)
前幾日有幸拜讀了何教授的一篇文章 single image haze removal using dark channel prior 的文章,結合最近接收的工作就像將去霧演算法增強dcm影象。演算法的基本思想並不複雜,詳細的原理和推導大家可以參考大牛們的部落格和何教授的 原文。這裡用幾個公式概述演...