#define _CRT_SECURE_NO_WARNINGS
#include "main.h"
#include "guidedfilter.h"
#pragma comment( lib, "opencv_world340d.lib" )
using namespace std;
using namespace cv;
int _PriorSize = 15; //窗口大小 15
double _topbright = 0.001;//亮度最高的像素比例
double _w = 1; //w0.95
float t0 = 0.1; //T(x)的最小值 因为不能让tx小于0 等于0 效果不好 0.1
int SizeH = 0; //图片高度
int SizeW = 0; //图片宽度
int SizeH_W = 0; //图片中的像素总 数 H*W
Vec<float, 3> a;//全球大气的光照值
Mat trans_refine;
Mat dark_out1;
char img_name[100] = "11.jpg";//文件名
//读入图片
Mat ReadImage()
{
Mat img = imread(img_name);
SizeH = img.rows;
SizeW = img.cols;
SizeH_W = img.rows*img.cols;
Mat real_img(img.rows, img.cols, CV_32FC3);
img.convertTo(real_img, CV_32FC3);
real_img = real_img / 255;
return real_img;
//读入图片 并其转换为3通道的矩阵后
//除以255 将其RBG确定在0-1之间
}
//计算暗通道
//J^{dark}(x)=min( min( J^c(y) ) )
Mat DarkChannelPrior(Mat img)
{
Mat dark = Mat::zeros(img.rows, img.cols, CV_32FC1);//新建一个所有元素为0的单通道的矩阵
for (int i = 0; i<img.rows; i++)
{
for (int j = 0; j<img.cols; j++)
{
dark.at<float>(i, j) = min(
min(img.at<Vec<float, 3>>(i, j)[0], img.at<Vec<float, 3>>(i, j)[1]),
min(img.at<Vec<float, 3>>(i, j)[0], img.at<Vec<float, 3>>(i, j)[2])
);//就是两个最小值的过程
}
}
erode(dark, dark_out1, Mat::ones(_PriorSize, _PriorSize, CV_32FC1));
//这个函数叫腐蚀 做的是窗口大小的模板运算 ,对应的是最小值滤波,即 黑色图像中的一块块的东西
return dark_out1;//这里dark_out1用的是全局变量,因为在其它地方也要用到
}
Mat DarkChannelPrior_(Mat img)
//这个函数在计算tx用到,因为与计算暗通道一样都用到了求最小值的过程,变化不多,所以改了改就用这里了
{
double A = (a[0] + a[1] + a[2]) / 3.0;//全球大气光照值 此处是3通道的平均值
Mat dark = Mat::zeros(img.rows, img.cols, CV_32FC1);
Mat dark_out = Mat::zeros(img.rows, img.cols, CV_32FC1);
for (int i = 0; i<img.rows; i++)
{
for (int j = 0; j<img.cols; j++)
{
dark.at<float>(i, j) = min(
min(img.at<Vec<float, 3>>(i, j)[0] / A, img.at<Vec<float, 3>>(i, j)[1] / A),
min(img.at<Vec<float, 3>>(i, j)[0] / A, img.at<Vec<float, 3>>(i, j)[2] / A)
);//同理
}
}
erode(dark, dark_out, Mat::ones(_PriorSize, _PriorSize, CV_32FC1));//同上
return dark_out;
}
/*
我们可以借助于暗通道图来从有雾图像中获取该值。具体步骤如下:
1) 从暗通道图中按照亮度的大小取前0.1%的像素。
2) 在这些位置中,在原始有雾图像I中寻找对应的具有最高亮度的点的值,作为A值。
*/
/*
原始论文中的A最终是取原始像素中的某一个点的像素,我实际上是取的符合条件的所有点的平均值作为A的值,
因如果是取一个点,则各通道的A值很有可能全部很接近255,会造成处理后的图像偏色和出现大量色斑。
原文作者说这个算法对天空部分不需特备处理,我实际发现该算法对有天空的图像的效果一般都不好。
天空会出现明显的过渡区域。作为解决方案,增加一个参数,最大全球大气光值,当计算的值大于该值时,则就取该值。
*/
//计算A的值
Vec<float, 3> Airlight(Mat img, Mat dark)//vec<float ,3>表示有3个大小的vector 类型为float
{
int n_bright = _topbright*SizeH_W;
Mat dark_1 = dark.reshape(1, SizeH_W);//这里dark_1是一个有图片像素那么多行的矩阵 方便下面循环计算
vector<int> max_idx;
float max_num = 0;
Vec<float, 3> A(0, 0, 0);
Mat RGBPixcels = Mat::ones(n_bright, 1, CV_32FC3);
for (int i = 0; i<n_bright; i++)
{
max_num = 0;
max_idx.push_back(max_num);
for (float * p = (float *)dark_1.datastart; p != (float *)dark_1.dataend; p++)
{
if (*p>max_num)
{
max_num = *p;//记录光照的最大值
max_idx[i] = (p - (float *)dark_1.datastart);//位置
RGBPixcels.at<Vec<float, 3>>(i, 0) = ((Vec<float, 3> *)img.data)[max_idx[i]];
//对应 的三个通道的值给RGBPixcels
}
}
((float *)dark_1.data)[max_idx[i]] = 0;//访问过的标记为0,这样就不会重复访问
}
for (int j = 0; j<n_bright; j++)
{
A[0] += RGBPixcels.at<Vec<float, 3>>(j, 0)[0];
A[1] += RGBPixcels.at<Vec<float, 3>>(j, 0)[1];
A[2] += RGBPixcels.at<Vec<float, 3>>(j, 0)[2];
}//将光照值累加
A[0] /= n_bright;
A[1] /= n_bright;
A[2] /= n_bright;//除以总数 即取所有符合的点的平均值。
return A;
}
//Calculate Transmission Matrix
Mat TransmissionMat(Mat dark)
{
double A = (a[0] + a[1] + a[2]) / 3.0;
for (int i = 0; i < dark.rows; i++)
{
for (int j = 0; j < dark.cols; j++)
{
double temp = (dark_out1.at<float>(i, j));
double B = fabs(A - temp);
if (B - 0.3137254901960784 < 0.0000000000001)
//K=80 80/255=0.31 这里浮点数要这样做减法才能正确的比较
{
dark.at<float>(i, j) = (1 - _w*dark.at<float>(i, j))*
(0.3137254901960784 / (B));//此处为改过的式子部分
}
else
{
dark.at<float>(i, j) = 1 - _w*dark.at<float>(i, j);
}
if (dark.at<float>(i, j) <= 0.2)//保证Tx不失真,因为会以上除出的结果会有不对
{
dark.at<float>(i, j) = 0.5;
}
if (dark.at<float>(i, j) >= 1)//同上
{
dark.at<float>(i, j) = 1.0;
}
}
}
return dark;
}
Mat TransmissionMat1(Mat dark)
{
double A = (a[0] + a[1] + a[2]) / 3.0;
for (int i = 0; i < dark.rows; i++)
{
for (int j = 0; j < dark.cols; j++)
{
dark.at<float>(i, j) = (1 - _w*dark.at<float>(i, j));
}
}
return dark;
}
//Calculate Haze Free Image
Mat hazefree(Mat img, Mat t, Vec<float, 3> a, float exposure = 0)//此处的exposure的值表示去雾后应该加亮的值。
{
double AAA = a[0];
if (a[1] > AAA)
AAA = a[1];
if (a[2] > AAA)
AAA = a[2];
//取a中的最大的值
//新开一个矩阵
Mat freeimg = Mat::zeros(SizeH, SizeW, CV_32FC3);
img.copyTo(freeimg);
//两个迭代器,这样的写法可以不用两层循环,比较快点
Vec<float, 3> * p = (Vec<float, 3> *)freeimg.datastart;
float * q = (float *)t.datastart;
for (; p<(Vec<float, 3> *)freeimg.dataend && q<(float *)t.dataend; p++, q++)
{
(*p)[0] = ((*p)[0] - AAA) / std::max(*q, t0) + AAA + exposure;
(*p)[1] = ((*p)[1] - AAA) / std::max(*q, t0) + AAA + exposure;
(*p)[2] = ((*p)[2] - AAA) / std::max(*q, t0) + AAA + exposure;
}
return freeimg;
}
void printMatInfo(char * name, Mat m)
{
cout << name << ":" << endl;
cout << "\t" << "cols=" << m.cols << endl;
cout << "\t" << "rows=" << m.rows << endl;
cout << "\t" << "channels=" << m.channels() << endl;
}
//Main Function
int main(int argc, char * argv[])
{
Mat dark_channel;
Mat trans;
Mat img;
Mat free_img;
char filename[100];
while (_access(img_name, 0) != 0)//检测图片是否存在
{
std::cout << "The image " << img_name << " don't exist." << endl << "Please enter another one:" << endl;
cin >> filename;
}
clock_t start, finish;
double duration1, duration3, duration4, duration7;
//读入图片
cout << "读入图片 ..." << endl;
start = clock();
img = ReadImage();
imshow("原图", img);
//printMatInfo("img", img);
finish = clock();
duration1 = (double)(finish - start) / CLOCKS_PER_SEC;
cout << "Time Cost: " << duration1 << "s" << endl;//输出这一步的时间
cout << endl;
//计算暗通道
cout << "计算暗通道 ..." << endl;
start = clock();
dark_channel = DarkChannelPrior(img);
imshow("Dark Channel Prior", dark_channel);
printMatInfo("dark_channel", dark_channel);
finish = clock();
duration3 = (double)(finish - start) / CLOCKS_PER_SEC;
cout << "Time Cost: " << duration3 << "s" << endl;
cout << endl;
//计算全球光照值
cout << "计算A值 ..." << endl;
start = clock();
a = Airlight(img, dark_channel);
cout << "Airlight:\t" << " B:" << a[0] << " G:" << a[1] << " R:" << a[2] << endl;
finish = clock();
duration4 = (double)(finish - start) / CLOCKS_PER_SEC;
cout << "Time Cost: " << duration4 << "s" << endl;
cout << endl;
//计算tx
cout << "Reading Refine Transmission..." << endl;
trans_refine = TransmissionMat(DarkChannelPrior_(ReadImage()));
//printMatInfo("trans_refine", trans_refine);
//imshow("Refined Transmission Mat",trans_refine);
没有合适的资源?快使用搜索试试~ 我知道了~
去雾代码vs+opencv
共57个文件
tlog:14个
pdb:5个
obj:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 19 下载量 172 浏览量
2021-10-20
18:35:04
上传
评论 6
收藏 66.54MB ZIP 举报
温馨提示
去雾代码vs+opencv,配置好后可以直接运行。
资源推荐
资源详情
资源评论
收起资源包目录
去雾.zip (57个子文件)
去雾
haze-remove-master
haze-remove
22.png 94KB
Debug
vc140.pdb 1.02MB
vc140.idb 771KB
haze-remove.log 3KB
main.obj 300KB
haze-remove.tlog
unsuccessfulbuild 0B
CL.read.1.tlog 45KB
link.read.1.tlog 2B
link.write.1.tlog 2B
CL.write.1.tlog 2KB
link.command.1.tlog 2B
CL.command.1.tlog 2KB
haze-remove.lastbuildstate 231B
guidedfilter.obj 261KB
haze-remove.vcxproj.filters 1KB
11.jpg 775KB
guidedfilter.h 425B
guidedfilter.cpp 6KB
x64
Debug
vc140.pdb 1.03MB
vc141.pdb 1.9MB
vc140.idb 771KB
haze-remove.log 470KB
vc141.idb 627KB
main.obj 697KB
haze-remove.tlog
link.delete.1.tlog 760B
CL.read.1.tlog 65KB
link.read.1.tlog 4KB
link.write.1.tlog 728B
CL.write.1.tlog 1KB
link.command.1.tlog 5KB
CL.command.1.tlog 4KB
haze-remove.lastbuildstate 223B
guidedfilter.obj 742KB
Release
vc140.pdb 140KB
haze-remove.log 415B
haze-remove.tlog
unsuccessfulbuild 0B
CL.command.1.tlog 2B
haze-remove.lastbuildstate 231B
main.cpp 10KB
haze-remove.vcxproj 8KB
main.h 656B
haze-remove.vcxproj.user 165B
Debug
haze-remove.VC.opendb 42B
.vs
haze-remove
v15
ipch
AutoPCH
27f448019481939d
MAIN.ipch 89.31MB
222d096dd9ddd9a6
MAIN.ipch 23.81MB
bd9f459a870f62fd
MAIN.ipch 89.31MB
30247c45a3c78640
GUIDEDFILTER.ipch 89.38MB
.suo 40KB
Browse.VC.db 20.95MB
v14
.suo 16KB
x64
Debug
haze-remove.ilk 1.5MB
haze-remove.exe 253KB
haze-remove.pdb 1.36MB
LICENSE 11KB
haze-remove.sdf 384KB
.gitignore 242B
haze-remove.sln 1KB
共 57 条
- 1
向阳+
- 粉丝: 6285
- 资源: 9
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页