OpenCV實踐之路 暗通道去霧簡單實現

2021-08-11 01:56:39 字數 3158 閱讀 6182

參考:

環境引數:

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 利用全圖最暗點來去除全域性...