去雾算法的代码实现(不含Soft Matting)

暗通道去雾(何恺明的成名作):简洁与效果并存的传统图像处理算法 本篇博客主要作用为学习代码段与快应用的使用,内容浅显,还请路过的大佬见谅>_< 暗通道去雾算法(Single image haze removal using dark channel prior)可以说是恺明大佬厚积薄发之作,作为其博士期间的第一篇投稿作品,可谓出道即触及巅峰,一举斩获CVPR2009最佳论文奖。 1.论文链接: https://ieeexplore.ieee.org/document/5206515 2.论文的知识图谱链接: ... 阅读详情

代码有部分改动

int main()
{

	
	Mat image = imread(line);
	if (image.empty()){
		cout <<line<< " 文件不存在" << endl;
		return -1;
	}
	Mat darkmat(image.size(), CV_8UC1);
	//区域大小
	const int RECT = 17;
	Mat txMat(darkmat.size(), CV_32FC1);
	Mat dst(image.size(), CV_8UC3);




	HazeRemoval(image, darkmat, txMat, dst, RECT, 0.95);






	imshow("原图", image);
	imshow("还原图",dst);


	waitKey(0);
	
	
	return 0;
}



#include<iostream>
#include<opencv2/opencv.hpp>

using namespace cv;
using namespace std;



void getDarkChannel(Mat& src, Mat& darkmat,const int RECT)
{
	for (int i = 0; i < src.rows; ++i)
	{

		for (int j = 0; j < src.cols; ++j)
		{
			int startPosX = i - (RECT - 1) / 2;
			int startPosY = j - (RECT - 1) / 2;
			if (startPosX < 0)
				startPosX = 0;
			if (startPosY < 0)
				startPosY = 0;

			int endPosX = i + (RECT - 1) / 2;
			int endPosY = j + (RECT - 1) / 2;
			if (endPosX >= src.rows)
				endPosX = src.rows - 1;
			if (endPosY >= src.cols)
				endPosY = src.cols - 1;



			uchar minValue = 255;
			for (int m = startPosX; m <= endPosX; ++m)
			{
				uchar b, g, r, min_perPiex = 255;
				Vec3b* ptr = src.ptr<Vec3b>(m);
				for (int n = startPosY; n <= endPosY; ++n)
				{
					b = ptr[n][0];
					g = ptr[n][1];
					r = ptr[n][2];
					if (b > g){
						min_perPiex = ((g < r) ? g : r);
					}
					else{
						min_perPiex = ((b < r) ? g : r);
					}
					if ((int)minValue>(int)min_perPiex)
						minValue = min_perPiex;
				}
			}

			darkmat.at<uchar>(i, j) = minValue;

		}
	}

}



float getA(Mat& image, Mat& darkmat)
{

	int total_num = darkmat.rows*darkmat.cols;
	int reference_value = total_num / 1000;


	int *light_num = new int[256]{0};
	if (light_num == NULL)
		cout << "申请内存不成功!" << endl;

	for (int i = 0; i < darkmat.rows; ++i)
	{
		for (int j = 0; j < darkmat.cols; ++j)
		{

			int index = (int)darkmat.at<uchar>(i, j);
			++(light_num[index]);
		}
	}


	int count = 0;
	vector<int> piexValue;
	for (int i = 255; i >= 0; --i)
	{
		if (light_num[i] != 0){
			count += light_num[i];
			piexValue.push_back(i);
			if (count >= reference_value)
				break;
		}
	}


	vector<int> point(reference_value*2);
	int cal_point = 0;
	for (int k = 0; k < piexValue.size(); ++k)
	{
		for (int i = 0; i < darkmat.rows; ++i)
		{
			for (int j = 0; j < darkmat.cols; ++j)
			{

				int index = (int)darkmat.at<uchar>(i, j);

				if (index == piexValue[k])
				{
					if (cal_point < (reference_value * 2))
					{
						point[cal_point] = i;
						point[cal_point+1] = j;
						cal_point += 2;
					}
				}
			}
		}
	}



	//计算A值
	float a;
	float sum = 0;
	for (auto i = point.cbegin(); i != point.cend(); i = i + 2)
	{
		int b, g, r;
		b = image.at<Vec3b>(*i, *(i + 1))[0];
		g = image.at<Vec3b>(*i, *(i + 1))[1];
		r = image.at<Vec3b>(*i, *(i + 1))[2];
		//这个是取最大值的方式
		//a = (b > g ? (b > r ? b : r) : (g > r ? g : r));
		//取均值方式
		sum += (b + g + r);
	}
	//均值
	a = sum * 2 / (3 * point.size());
	delete []light_num;

	//if (a > 220.0)
	//	a = 220.0;
	return a;
}

void getT_x(Mat& darkmat, Mat &txMat, float a, float w, float threshold = 0.1)
{
	
	for (int i = 0; i < darkmat.rows; ++i)
		for (int j = 0; j < darkmat.cols; ++j)
		{
			txMat.at<float>(i, j) = 1 - w*((int)darkmat.at<uchar>(i, j)) / a;
			if (txMat.at<float>(i, j) < threshold)
				txMat.at<float>(i, j) = threshold;
		}
}

void get_dst(Mat& image, Mat& dst, Mat& txMat, float a)
{
	for (int i = 0; i < image.rows; ++i)
		for (int j = 0; j < image.cols; ++j)
		{
			for (int k = 0; k < 3; ++k)
			{
				int ss = ((image.at<Vec3b>(i, j)[k] - a) / txMat.at<float>(i, j)) + a;
				if (ss > 255)
					dst.at<Vec3b>(i, j)[k] = 255;
				else if (ss < 0)
					dst.at<Vec3b>(i, j)[k] = 0;
				else
					dst.at<Vec3b>(i, j)[k] = ss;
			}	
		}
	
}



void HazeRemoval(Mat &image, Mat &darkmat, Mat &txMat,Mat &dst, const int RECT,float w)
{
	//得到暗通道图
	getDarkChannel(image, darkmat, RECT);
	//得到A值
	float a = getA(image, darkmat);
	//计算t(x)
	getT_x(darkmat, txMat, a, w);
	//得到目标图
	get_dst(image, dst, txMat, a);


	
}







        
opencv 图像雾检测_基于OpenCV的图像去雾程序 去雾算法参考了一篇论文:Kaiming He, Jian Sun, Xiaoou Tang.Single Image Haze Removal Using Dark Channel Prior大致内容是提出了一个叫做暗原色先验的东西来对有雾图像进行处理,十分巧妙,有兴趣者可以看看。这里使用OpenCV实现文中的去雾算法,然而论文提到的softmatting未在本程序中实现。代码如下:#includ... 阅读详情

相关推荐

Dark Channel Prior 基于暗原色通道理论的去雾方法

参考论文Single Image Haze Removal Using Dark Channel Prior---Kaiming He        暗原色先验理论(dark-channel prior)是 Kaiming He 等人发现的,并提出了基于暗原色先验的单幅图像去雾方法。在自然图像已被研究了几十年的今天,发现全新的图像本质特性是视觉领域的重大突破。该项成果发表在 2009 年IEEE

muzhiai的专栏 6307

opencv之图像去雾

将各位大佬的实现代码粘出来,供大家学习!参考公众号:GiantPandaCV。

lrzss的博客 1117

暗通道去雾算法 python实现

暗通道去雾算法的python实现

jacke121的专栏 6905

什么是soft matting方法_NMS、 soft-nms、softer-nms

NMS检测框合并策略一.NMS1.NMS算法过程NMS主要就是通过迭代的形式,不断的以最大得分的框去与其他框做IoU操作,并过滤那些IoU较大(即交集较大)的框。①根据候选框的类别分类概率做排序,假如有4个 BBox ,其置信度A>B>C>D。②先标记最大概率矩形框A是算法要保留的BBox;③从最大概率矩形框A开始,分别判断ABC与D的重叠度IOU(两框的交并比)是否大于某个设定...

weixin_39548490的博客 869

soft_matting.zip_Soft!_softmatting_引导滤波去雾_暗通道_软抠图去雾

在暗通道先验原理的图像去雾中,广泛使用的软抠图法滤波、引导滤波的的matalab源程序

Python地理空间数据库之geopandas使用详解

地理空间数据分析在许多领域中都有着广泛的应用,包括地理信息系统(GIS)、城市规划、环境科学、地质勘探等。Python GeoPandas是一个强大的库,旨在简化地理空间数据的处理和分析。本文将深入介绍GeoPandas库,包括其基本概念、功能特性、示例代码以及在实际应用中的应用场景。

Rocky006的博客 1万+

使用opencv 进行图像去雾

背景 近年来国内的雾霾天气逐渐由中东地区向全国蔓延。雾霾自2013年起开始成为人们对天气关注的关键词。雾霾是特定气候条件与人类活动相互作用的结果。 高密度人口的经济及社会活动必然会排放大量细颗粒物(PM2.5),一旦排放超过大气循环能力和承载度,细颗粒物浓度将持续积聚,此时如果受静稳天气 等影响,极易出现大范围的雾霾。 雾天时,弥漫在空中的雾气和尘埃模糊了人们的视线,使得景物的能见度大幅降低。...

weixin_NineDays66 1万+

CoaXPress协议入门(1)---- CXP测试套件

CoaXPress (简称CXP)是指一种采用同轴线缆进行互联的相机数据传输标准,主要用于替代之前的Camera Link协议,常见于科学相机、工业相机、医学图像、航空防务等场景。CXP是一个非对称的高速点对点串行传输协议,主要用于传输视频和静态图像,线缆多使用单条或多条同轴电缆。CXP易于集成,可以获得灵活可靠的性能,通过使用标准的同轴线缆,比如RG59 和 RG6规格(推荐使用RG6),并且图像、控制通讯、触发、电源都可以使用同一条线缆。

素手挽剑 9512

暗通道去雾法

一、算法背景   暗通道先验去雾算法是大神何恺明2009年发表在CVPR上的一篇论文,还获得了当年的CVPR最佳论文。   根据论文的介绍,暗通道去雾算法是基于一个关键的观察:在没有雾霾的室外图像中,大多数局部区域包含一些像素,这些像素在至少一个颜色通道中具有非常低的强度(原文:It is based on a key observation - most local patches in haz...

上善若水,为而不争 1万+

ADB命令解锁Android手机屏幕的3种实用方法(附详细步骤)

本文详细介绍了在Android手机屏幕失灵或密码遗忘时,利用ADB命令解锁屏幕的三种实用方法。包括通过ADB模拟输入事件、移除锁屏认证文件(需Root权限)以及结合恢复模式抢救数据。文章提供了详细的操作步骤与风险提示,强调提前开启USB调试的重要性,是Android用户应对紧急锁屏情况的有效技术指南。

weixin_29229055的博客 918

自动驾驶技术路线之争:纯视觉与多模态融合的成本与性能博弈

本文深入剖析了自动驾驶领域两大主流技术路线——纯视觉与多模态融合的本质差异。文章从成本结构、性能博弈与商业逻辑等多维度展开,揭示了纯视觉方案在硬件成本与数据算力投入上的权衡,以及多模态融合方案在安全冗余与感知稳定性方面的优势。这场技术路线之争,实则是车企在性能、成本与商业化落地之间寻求平衡的综合博弈。

weixin_29038303的博客 390

何凯明图像去雾--包含soft matting的matlab代码

img_name='333.jpg'; % 原始图像 I=double(imread(img_name))/255; % 获取图像大小 [h,w,c]=size(I); win_size = 7; img_size=w*h; dehaze=zeros(img_size*c,1); dehaze=reshape(dehaze,h,w,c); figure, imsh

燕子lovinglife 7748

FreeModbus从入门到实战:手把手教你用STM32实现工业级Modbus RTU通信

本文详细介绍了如何使用STM32和FreeModbus实现工业级Modbus RTU通信,涵盖硬件搭建、协议栈移植及优化技巧。重点解析了FreeModbus的移植过程,包括串口驱动适配、定时器配置和工业级稳定性优化,为开发者提供了一套完整的工业通信解决方案。

weixin_33737774的博客 348

图像去雾--包含soft matting的matlab代码

<br />img_name='333.jpg';<br />% 原始图像<br />I=double(imread(img_name))/255;<br />% 获取图像大小<br />[h,w,c]=size(I);<br />win_size = 7;<br />img_size=w*h;<br />dehaze=zeros(img_size*c,1);<br />dehaze=reshape(dehaze,h,w,c);<br /><br />figure, imshow(I);<br />win_

4961

eLabRadio软件无线电虚实结合仿真开发平台简介

在使用仿真平台时,不要关闭设备或断开设备与PC机之间的网络连接,否则,仿真平台将无法正常工作。注:采用eNodeX设备认证方式,当出现“设备不存在”的报错时,请检查计算机IP是否和硬件设备IP处于同一网段,或者是否是先连接好网线,再开启硬件设备的。①此登录方式下,需要先建立软件与硬件的通信:在登录窗口点击【网络配置】,参照下图输入设备IP,服务器地址无需设置,设置完成后点击确认,此时登录界面无需设置账号密码;,拷贝到电脑上,使用管理员权限运行setup.exe,下一步直到安装完成,桌面会生成快捷方式。

weixin_55349105的博客 6319

车载以太网-组播

车载以太网-组播

天赐好车的博客 252

图片去雾

最近看图片去雾挺有意思的,于是乎就研究了一下 转载地址图片去雾 先看一下别人的效果, 感觉还不错 看了一些别人写的算法 于是就收了一下 PYthon的 d代码果然有 这个是MATLAB语言版本的 %%%%暗原色去雾算法是建立在户外自然场景暗通道优先法则的基础上的去雾方法,其实就是解一个方程 %%I(x)=J(x)t(x)+A(1-t(x));其中I(x)是受到雾气污染的图像。J(x)是我们需要...

freedom_fd的博客 1849

华为OD机试真题 新系统2026-04-01 C++ 实现【勇攀数字高峰】

请你在给定的数字地形图中寻找登山路径,数字代表当前位置的海拔高度,要求从最低海拔出发,不断攀登,最终到达最高山峰。你需要寻找所有满足条件的登山路径。地图已经保证最低海拔和最高山峰都只有一个。

MISAYAONE的博客 381

夜间图像去雾matlab代码,图像去雾–包含soft matting的matlab代码 | 学步园

img_name='333.jpg';% 原始图像I=double(imread(img_name))/255;% 获取图像大小[h,w,c]=size(I);win_size = 7;img_size=w*h;dehaze=zeros(img_size*c,1);dehaze=reshape(dehaze,h,w,c);figure, imshow(I);win_dark=zeros(img_s...

weixin_42388680的博客 679

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

图像去雾算法_基于暗通道先验条件图像去雾算法

基于暗通道先验条件图像去雾算法香港大学何凯明博士于2009发表了一篇论文《Single Image Haze Removal Using Dark Channel Prior 》。在文章中,何凯明博士提出了一种简单而有效的图像先验暗通道消除单输入图像雾的算法。暗通道先验是一种无雾室外图像的统计。这是基于一个关键的观察——大多数无雾室外图像的局部区域包含一些像素,这些像素在至少一个颜色通道...

weixin_39994806的博客 1396

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

一年去雾算法研究的总结

本篇博文来自博主Imageshop,打赏或想要查阅更多内容可以移步至Imageshop。 转载自:https://www.cnblogs.com/Imageshop/p/3515871.html 侵删   从最开始的Crimm Imageshop中最简单的去雾功能开始,到前不久为止研究的诸多去雾算法,再到近日和一些朋友的关于去雾经验的交流,感觉自己对这个方面的研究已经止步了,现对这些算法做个简单的总结。 本博客中共给出了6种有去雾功能的算法:   (1)基于何凯明博士提出的暗通道去雾算法...

weixin_39450742的博客 377

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

高级图像去雾算法的快速实现

FROM:http://blog.youkuaiyun.com/occupy8/article/details/40322683最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html       可处理视频的示例:视频去雾效果    在图像去雾这个领域,几乎没有人不知道《Single Image Haze Removal Using Dar...

storm的博客 612

MATLAB图像去雾实战:基于暗通道先验的算法实现与优化

图像增强是计算机视觉与数字图像处理中的基础技术,旨在改善图像的视觉质量或提取更有用的信息。其核心原理通常涉及对图像退化模型的建模与逆过程求解,通过算法补偿或去除成像过程中引入的噪声、模糊、光照不均等干扰。在工程实践中,图像增强技术具有极高的价值,广泛应用于自动驾驶的环境感知、安防监控的目标识别、无人机航拍分析以及医学影像诊断等领域。其中,针对雾、霾等大气散射导致的图像退化问题,图像去雾技术尤为关键。本文聚焦于经典的暗通道先验去雾算法,详细解析其物理模型与实现步骤,并探讨在MATLAB平台上的工程实践与参数调

weixin_34167819的博客 423

从暗通道到清晰世界:单幅图像去雾算法的工程实践与优化

本文深入探讨了基于暗通道先验(Dark Channel Prior)的单幅图像去雾算法(Single Image Haze Removal)的工程实践与优化。从理论解析到代码实现,详细介绍了大气光估计、透射率优化等关键技术,并针对天空区域处理、实时性优化等挑战提出解决方案。同时探索了与深度学习结合的混合方案,在保持算法可解释性的同时提升处理效果。

weixin_30920597的博客 518

图像去雾成果

http://yueyue1105.blog.163.com/blog/static/43111768201011160563445/ 一个多星期,我几乎把全部的心思都放在如何做好图像去雾上,这中间遇到了很多困难,每解决一个问题都让我有所收获,多少次似乎快要成功,但得到的数据却不尽如人意,多少次将要放弃,却又让我找到新的线索继续尝试下去。我觉得很有必要把这一个多星期发生的事记录下来: 11月2

ye_song的专栏 3928

保姆级教程:用Python复现何恺明暗通道去雾算法(附完整代码与避坑指南)

本文提供了一份详细的Python教程,教你如何复现何恺明的暗通道去雾算法(Dark Channel Prior)。从环境配置到核心代码实现,包括暗通道计算、大气光估计、透射率优化等关键步骤,并提供了完整的代码示例和避坑指南。通过导向滤波替代耗时的Soft Matting,大幅提升算法效率,适合计算机视觉开发者和图像处理爱好者实践应用。

weixin_30797199的博客 265
上一篇: DeepLearnToolbox-master CNN源码拙见
下一篇: C++多线程join
ListenAlone
博客等级 码龄11年 47粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ListenAlone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值