參考:
環境引數:
vs2010
opencv 2.4.13
i(x) ——待去霧的影象
j(x)——無霧影象
a——全球大氣光成分
t——折射率(大氣傳遞係數)
在無霧影象中,每乙個區域性區域都很有可能會有陰影,或者是純顏色的東西,又或者是黑色的東西。因此,每乙個區域性區域都很有可能有至少乙個顏色通道會有很低的值。把這個統計規律叫做dark channel prior。
jc表示彩色影象的每個通道
ω(x)表示以畫素x為中心的乙個視窗
意義:首先求出每個畫素rgb分量中的最小值,存入一副和原始影象大小相同的灰度圖中,然後再對這幅灰度圖進行最小值濾波
對於兩個最小化的順序,我看了下,何凱明的兩遍**用了不同的順序。
右邊第二項其實就是有霧影象的暗通道。
由於空間透視現象/濃淡遠近,部分霧的存在有助於我們感知距離和深度,加權值修正:
1.選取暗通道影象暗通道最亮的0.1%的畫素(一般來說,這些畫素表示霧濃度最大的地方)
2.取輸入影象裡面這些畫素對應的畫素裡面最亮的作為大氣光
注:選中的畫素未必是全圖最亮的,而且要比選取全圖最亮的方式魯棒性更好。
大致就是這個流程:
1.求影象暗通道
2.利用暗通道計算出折射率
3.利用暗通道估計大氣光
4.代回霧圖公式去霧
#include
#include
#include
#include
#include
#include
using
namespace cv;
using
namespace
std;
//求暗通道
mat darkchannel(mat src)
}//模板尺寸
int scale = 7;
//cout << "please enter the mask scale: " << endl;
//cin >> scale;
//邊界擴充
int radius = (scale - 1) / 2;
mat border;
//由於要求最小值,所以擴充的邊界可以用複製邊界填充
copymakeborder(rgbmin, border, radius, radius, radius, radius, border_replicate);
//最小值濾波
for (int i = 0; i < src.cols; i++)
}return dark;
}uchar light(vector
inputiamgemax)
}return maxa;
}//mat dark(mat image)
//// }
//// //模板尺寸
// int scale;
// cout << "please enter the mask scale: " << endl;
// cin >> scale;
//// //邊界擴充
// int radius = (scale - 1) / 2;
// mat border;
// //由於要求最小值,所以擴充的邊界可以用複製邊界填充
// copymakeborder(mincolor, border, radius, radius, radius, radius, border_replicate);
//// //最小值濾波
// for (int i = 0; i < image.cols; i++)
//
// }
// return darkchannel;
//}int main(int argc, char* argv)
uchar a = light(inputmax);
double w = 0.65;
//createtrackbar("w1", "dehazed", &w1, 100, null);
//求折射率
mat t = mat::zeros(image.rows, image.cols, cv_8uc3);
scalar intensity;
for (int m = 0; mfor (int n = 0; n(m, n);
t.at(m, n)[0] = (1 - w * intensity.val[0] / a) * 255;
t.at(m, n)[1] = (1 - w * intensity.val[0] / a) * 255;
t.at(m, n)[2] = (1 - w * intensity.val[0] / a) * 255;}}
//去霧
mat j(image.rows, image.cols, cv_8uc3, scalar(180, 120, 50));
mat temp1(image.rows, image.cols, cv_8uc3, scalar(180, 120, 50));
//subtract(image, scalar(a, a, a), temp1);
temp1 = abs(image - scalar(a, a, a));
double t0 = 0.1;
scalar t1;
vec3b intsrc;
for (int i = 0; i < image.cols; i++)}}
imshow("dehazed", j);
while (char(waitkey(1)) != 'q') {}
return
0;}
瞎搞系列 暗通道去霧
基於暗通道先驗的去霧演算法實際上是一種統計演算法,發現了無霧影象中區域性存在一些畫素,這些畫素至少有乙個顏色通道的亮度值非常非常低 但是當影象區域白色的時候,這種演算法則存在缺陷 在計算機圖形學中,存在乙個比較重要的模型,這種模型的廣泛應用於霧圖中 其中i x 表示觀測到的亮度,j x 表示恢復後的...
暗通道去霧演算法的python實現
import cv2 as cv import numpy as np import matplotlib.pyplot as pyplot def darkchannel for i in range 0,rows 1 for j in range 0,cols 1 min rgb img arr...
暗通道先驗原理 DCP去霧演算法
一 霧圖形成模型 變形 c為r g b三通道。二 dark channel prior 統計規律 對於乙個無霧影象,每個區域性區域很可能至少乙個顏色通道會有很低的值,或黑色東西。非天空區域 每個區域性區域都總有一些很暗的東西。dark object subtraction 利用全圖最暗點來去除全域性...