• 大小: 5KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-14
  • 语言: C/C++
  • 标签: opencv4.3.0  去雾  

资源简介

基于暗通道先验的去雾算法,去雾算法目前也有着众多其他的方式,不过我所接触的,很多都是以这个为基础,因此,先弄会这个为研究其他的去雾算法能奠定坚实的基础。

资源截图

代码片段和文件信息

#include
#include
#include
#include
#include
#include 

using namespace cv;
using namespace std;

//求暗通道
Mat darkChannel(Mat src)
{
Mat rgbmin = Mat::zeros(src.rows src.cols CV_8UC1);
Mat dark = Mat::zeros(src.rows src.cols CV_8UC1);
Vec3b intensity;

for (int m = 0; m {
for (int n = 0; n {
intensity = src.at(m n);
rgbmin.at(m n) = min(min(intensity.val[0] intensity.val[1]) intensity.val[2]);
}
}

//模板尺寸
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++)
{
for (int j = 0; j < src.rows; j++)
{
//选取兴趣区域
Mat roi;
roi = border(Rect(i j scale scale));

//求兴趣区域的最小值
double minVal = 0; double maxVal = 0;
Point minLoc = 0; Point maxLoc = 0;
minMaxLoc(roi &minVal &maxVal &minLoc &maxLoc noArray());

dark.at(Point(i j)) = (uchar)minVal;
}
}
return dark;
}
uchar light(vector inputIamgeMax)
{
uchar maxA = 0;
for (int i = 0; i < inputIamgeMax.size() - 1; i++)
{

if (maxA < inputIamgeMax[i + 1])
{
maxA = inputIamgeMax[i + 1];
}
}
return maxA;
}



//Mat dark(Mat image)
//{
//  Mat minColor(image.rows image.cols CV_8UC1 Scalar(180 120 50));
//  Mat darkChannel(image.rows image.cols CV_8UC1 Scalar(180 120 50));
//
//  //求每个像素BGR三通道最小值
//  for (int i = 0; i < image.cols; i++)
//  {
//      for (int j = 0; j < image.rows; j++)
//      {
//          uchar blue green red;
//          blue = image.at(Point(i j))[0];
//          green = image.at(Point(i j))[1];
//          red = image.at(Point(i j))[2];
//          minColor.at(Point(i j)) = minBGR(blue green red);
//      }
//  }
//
//  //模板尺寸
//  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++)
//  {
//      for (int j = 0; j < image.rows; j++)
//      {
//          //选取兴趣区域
//          Mat roi;
//        

评论

共有 条评论