资源简介
基于暗通道和导向滤波的图像去雾算法C++实现
代码片段和文件信息
#include“ImageDefogging.h“
int main()
{
//效果参数
double omega = 0.95;
double numt = 0.3;
int rectSize = 15;
clock_t startTime endTime;
startTime = clock();//计时开始
Mat src = imread(“1.png“);
Mat dst;//(src.rows src.cols CV_32FC3)
Mat dst1(src.rows src.cols CV_32FC3);
ImageDefogging(src dst rectSize omega numt);
endTime = clock(); //计时结束
cout << “The run time is: “ << (double)(endTime - startTime) / CLOCKS_PER_SEC << “s“ << endl;
imwrite(“dst.jpg“ dst);
imwrite(“dst1.jpg“ dst1);
/*float scale = 0.15;
resize(src src Size(src.cols*scale src.rows*scale));
resize(dst dst Size(dst.cols*scale dst.rows*scale));
resize(dst1 dst1 Size(dst1.cols*scale dst1.rows*scale));*/
dst /= 255;
dst1 /= 255;
imshow(“src“ src);
imshow(“dst“ dst);
imshow(“dst1“ dst1);
waitKey();
return 0;
}
void ImageDefogging(Mat src Mat& dst int rectSize double omega double numt)
{
//对原图进行归一化
Mat I;
src.convertTo(I CV_32F);
I /= 255;
float A[3] = { 0 };
Mat dark = DarkChannel(I rectSize);
AtmLight(I dark A);
Mat te = TransmissionEstimate(I A rectSize omega);
Mat t = TransmissionRefine(src te);
dst = Defogging(I t A numt);
}
Mat DarkChannel(Mat srcImg int size)
{
vector chanels;
split(srcImg chanels);
//求RGB三通道中的最小像像素值
Mat minChannel = (cv::min)((cv::min)(chanels[0] chanels[1]) chanels[2]);
Mat kernel = getStructuringElement(MORPH_RECT Size(size size));
Mat dark(minChannel.rows minChannel.cols CV_32FC1);
erode(minChannel dark kernel); //图像腐蚀
return dark;
}
template vector argsort(const vector& array)
{
const int array_len(array.size());
vector array_index(array_len 0);
for (int i = 0; i < array_len; ++i)
array_index[i] = i;
sort(array_index.begin() array_index.end()
[&array](int pos1 int pos2) {return (array[pos1] < array[pos2]); });
return array_index;
}
void AtmLight(Mat src Mat dark float outA[3])
{
int row = src.rows;
int col = src.cols;
int imgSize = row*col;
//将暗图像和原图转为列向量
vector darkVector = dark.reshape(1 imgSize);
Mat srcVector = src.reshape(3 imgSize);
//按照亮度的大小取前0.1%的像素(亮度高)
int numpx = int(max(floor(imgSize / 1000) 1.0));
vector indices = argsort(darkVector);
vector dstIndices(indices.begin() + (imgSize - numpx) indices.end());
for (int i = 0; i < numpx; ++i)
{
outA[0] += srcVector.at(dstIndices[i] 0)[0];
outA[1] += srcVector.at(dstIndices[i] 0)[1];
outA[2] += srcVector.at(dstIndices[i] 0)[2];
}
outA[0] /= numpx;
outA[1] /= numpx;
outA[2] /= numpx;
}
Mat TransmissionEstimate(Mat src float outA[3] int size float omega)
{
Mat imgA = Mat::zeros(src.rows src.cols CV_32FC3);
vector chanels;
split(src chanels);
for (int i = 0; i < 3; ++i)
{
chanels[i] = chanels[i] / outA[i];
}
merge(chanels imgA);
Mat transmission = 1 - omega*DarkCha
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 287946 2019-09-26 13:15 1.png
文件 5168 2019-12-07 10:52 ImageDefogging - 副本.cpp
文件 1326 2019-11-22 16:08 ImageDefogging.h
文件 4394 2019-12-07 10:52 ImageDefogging.vcxproj
文件 1091 2019-12-07 10:52 ImageDefogging.vcxproj.filters
文件 165 2019-11-28 10:24 ImageDefogging.vcxproj.user
- 上一篇:操作系统银行家算法源码
- 下一篇:华容道基本功能c++实现
相关资源
- 华容道基本功能c++实现
- 根据原图和二值图得到分割彩图
- qt界面化实现各种滤波函数
- 学生社团管理系统数据结构课程设计
- c#通过dll读取opencv里的mat图片
- python35_d.lib
- C++十进制加减法
- K近邻算法c/c++
- C++实现8方向A*算法
- Pthread 多线程C++动态库+静态库+头文件
- VC++的.cpp文件调用CUDA的.cu文件中的函
- WOA鲸鱼优化算法 C++实现
- 黄金矿工游戏源码c++
- C++API中文版CHM
- windows后台监听键盘事件vs mfc版
- icp C++实现包含测试数据
- 多项式计算
- 诊所信息管理系统C++课程设计报告
- DICOM医学图像格式转换的C++实现
- C++代码提取LBP特征
- 个人银行账户管理程序C++
- 编写并调试一个模拟的进程调度程序
- C++编写的有界面的扫雷游戏
- 遗传算法.cpp
- C++编写的第三人称视角小球Ploygon风格
- C++ Primer Plus第6版源码.zip
- 小甲鱼98集全套数据结构视频
- c++制作黄金矿工
- C/C++:Windows编程—代码获取本地所有
- c++ 课程设计报告多个题目合集 完整
评论
共有 条评论