經典去霧演算法DCP的c 實現

2021-09-29 11:21:39 字數 3046 閱讀 8237

首先是需匯入的標頭檔案和包,我覺得一些演算法不給出包的話對我這種初學者不夠友好。

本演算法使用到了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影象。演算法的基本思想並不複雜,詳細的原理和推導大家可以參考大牛們的部落格和何教授的 原文。這裡用幾個公式概述演...