图像去雾-图像去雨(matlab/python代码+教程)

看到许多小伙伴想进行图像去雨,图像去雾的任务,由于以前进行了此类项目,所以在此书写博客进行交流。

去雨前言

从静止图像中去除雨水是一项复杂且具有挑战性的任务。雨滴仅影响图像的很小区域,因此导致确定应考虑哪个区域和不应考虑哪个区域的混乱。 其他市面算法如FFT去雨也已经实现!
在本文中,已经实现了一种新技术,该技术有效地使用L0梯度最小化方法来去除雨像素。
在这里插入图片描述

  1. 最小化技术可以全局控制图像中产生多少非零梯度。该方法与局部特征无关,而是全局定位重要边缘。
  2. 保留了这些显着的边缘,并且减少了低振幅和微不足道的细节。以这种方式去除雨像素。
  3. 最后,使用直方图调整技术增强了雨水去除的图像的强度,以获得更好的对比度图像。实验结果表明,该算法在去除图像去雨方面有良好的效果

算法流程

在这里插入图片描述

去雨代码部分

clear;
close all;
I=imread('youwutu.jpg'); %读入图像
R=I(:,:,1);% 取输入图像的R分量
[N1,M1]=size(R);
R0=double(R);% 对R分量进行数据转换,并对其取对数
Rlog=log(R0+1);
Rfft2=fft2(R0);% 对R分量进行二维傅里叶变换
sigma=250;% 形成高斯滤波函数
F = zeros(N1,M1);
for i=1:N1
for j=1:M1
F(i,j)=exp(-((i-N1/2)^2+(j-M1/2)^2)/(2*sigma*sigma));
end
end
F=F./(sum(F(:)));
Ffft=fft2(double(F)); %对高斯滤波函数进行二维傅里叶变换
DR0=Rfft2.*Ffft;  %对R分量与高斯滤波函数进行卷积运算
DR=ifft2(DR0);
DRdouble=double(DR); %在对数域中,用原图像减去低通滤波后的图像,得到高频增强图像
DRlog=log(DRdouble+1);
Rr=Rlog-DRlog;
G=I(:,:,2);   % 取输入图像的G分量
[N1,M1]=size(G);
G0=double(G);  %对G分量进行数据转换,并对其取对数
Glog = log(G0+1);
Gfft2=fft2(G0);  %对G分量进行二维傅里叶变换
sigma=250;
for i=1:N1
for j=1:M1
F(i,j)=exp(-((i-N1/2)^2+(j-M1/2)^2)/(2*sigma*sigma));end
end
F = F./(sum(F(:)));
Ffft=fft2(double(F));  %对高斯滤波函数进行二维傅里叶变换
DG0=Gfft2.*Ffft;  %对高斯滤波函数进行二维傅里叶变换
DG=ifft2(DG0);
DGdouble=double(DG); %在对数域中,用原图像减去低通滤波后的图像,得到高频增强图像
DGlog=log(DGdouble+1);
Gg=Glog-DGlog;
EXPGg=exp(Gg); %取反对数,得到增强后的图像分量
MIN = min(min(EXPGg)); %对增强后的图像进行对比度拉伸增强
MAX = max(max(EXPGg));end
end

去雨结果 matlab 展示

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

图像去雾

去雾概述

  1. 暗通道先验:首先说在绝大多数非天空的局部区域里,某一些像素总会有至少一个颜色通道具有很低的值,也就是说该区域光强是一个很小的值。

  2. 所以给暗通道下了个数学定义,对于任何输入的图像J,其暗通道可以用下面的公式来表示:图片其中表示彩色图像每个通道,表示以像素X为中心的一个窗口。

  3. 要求暗通道的图像是比较容易的,先求出每个像素在3个通道的最小值,存到一个二维Mat中(灰度图),然后做一个最小值滤波,滤波的半径由窗口大小决定,这里窗口大小为,公式表示为,其中表示滤波半径。

    图片暗通道先验理论得出的结论,这个我不知道如何证明,不过论文给出了几个原因:

  • a)汽车、建筑物和城市中玻璃窗户的阴影,或者是树叶、树与岩石等自然景观的投影;
  • b)色彩鲜艳的物体或表面,在RGB的三个通道中有些通道的值很低(比如绿色的草地/树/植物,红色或黄色的花朵/叶子,或者蓝色的水面)

去雾代码:

计算雾化图像的暗通道

def DarkChannel(img, size=15):"""暗通道的计算主要分成两个步骤:1.获取BGR三个通道的最小值2.以一个窗口做MinFilterps.这里窗口大小一般为15(radius为7)获取BGR三个通道的最小值就是遍历整个图像,取最小值即可"""r, g, b = cv2.split(img)min_img = cv2.min(r, cv2.min(g, b))kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (size, size))dc_img = cv2.erode(min_img, kernel)return dc_img

估算全局大气光值

def GetAtmo(img, percent=0.001):"""1.计算有雾图像的暗通道2.用一个Node的结构记录暗通道图像每个像素的位置和大小,放入list中3.对list进行降序排序4.按暗通道亮度前0.1%(用percent参数指定百分比)的位置,在原始有雾图像中查找最大光强值"""mean_perpix = np.mean(img, axis=2).reshape(-1)mean_topper = mean_perpix[:int(img.shape[0] * img.shape[1] * percent)]return np.mean(mean_topper)

估算透射率图

def GetTrans(img, atom, w):"""w为去雾程度,一般取0.95w的值越小,去雾效果越不明显"""x = img / atomt = 1 - w * DarkChannel(x, 15)return tdef GuidedFilter(p, i, r, e):""":param p: input image:param i: guidance image:param r: radius:param e: regularization:return: filtering output q"""# 1mean_I = cv2.boxFilter(i, cv2.CV_64F, (r, r))mean_p = cv2.boxFilter(p, cv2.CV_64F, (r, r))corr_I = cv2.boxFilter(i * i, cv2.CV_64F, (r, r))corr_Ip = cv2.boxFilter(i * p, cv2.CV_64F, (r, r))# 2var_I = corr_I - mean_I * mean_Icov_Ip = corr_Ip - mean_I * mean_p# 3a = cov_Ip / (var_I + e)b = mean_p - a * mean_I# 4mean_a = cv2.boxFilter(a, cv2.CV_64F, (r, r))mean_b = cv2.boxFilter(b, cv2.CV_64F, (r, r))# 5q = mean_a * i + mean_breturn q

去雾结果 matlab GUI交互展示:

同样的代码也有python版本
在这里插入图片描述
在这里插入图片描述

结论

本文只是众多流程的一部分,为目标检测 和其他应用奠定举出。

  1. 通过将所提算法与经典算法进行验证对比,结果表明本文极端环境下的目标 检测与测距方法具有良好的有效性和可行性
  2. 将处理后的图像输送到目标检测和测距模型,提高了目标检测和测距精度,为自动驾驶主动安全行为决策提供必要的技术支持,使得自动驾驶汽车应用在极端环境变得可行。

若果觉得有用的话,请帮忙点赞,也可以私信交流。

在这里插入图片描述

代码获取:全部代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1557543.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

杭州悦数参与制定的图技术国家标准项目进入公示期!

9 月 27 日,由全国智能计算标准化工作组归口,杭州悦数科技有限公司等多家知名企业及科研机构共同参与的 《智能计算 图计算性能测试方法》 国家标准项目正式进入公示期。作为第一个图技术相关的国家标准,这一里程碑式的进展,不仅标…

win11 关掉夸克网盘的自启

1、先打开夸克的设置: 打开后,发现并没有自启动项。 2、打开win11自启动,然后去掉即可: 3、通过上面的设置,再次启动,应该是不会显示夸克了。

comfyUI如何入门?comfyUI保姆级入门攻略!

前言 配置要求 一张NVIDIA显卡最好,体验的话一台电脑就可以了, 安装步骤 访问官网:https://github.com/comfyanonymous/ComfyUI,看官网的操作步骤来。 有俩种安装window方式 1.第一种直接下载exe文件进行安装,点击上图的7-zip根据自已的w…

Cannon-ES中RigidVehicle的创建与应用:结合Three.js实现车辆动态模拟

本文目录 前言1、RigidVehicle1.1 概念1.2 RigidVehicle的创建与使用1.3 RigidVehicle的特性与应用 2、前置代码准备2.1 代码2.2 效果 3、RigidVehicle结合three的使用3.1 代码3.1.2 效果 3.2 控制车子移动3.2.1 效果 4、完整代码 前言 在物理引擎与三维图形渲染技术日益融合的…

Unity UndoRedo(撤销重做)功能

需求 撤销与重做功能 思考 关于记录的数据的两点思考: 记录操作记录影响显示和逻辑的所有数据 很显然这里就要考虑取舍了: 记录操作 这种方案只需要记录每一步的操作,具体这个操作要怎么渲染和实现出来完全需要自己去实现,这…

不宜使用Selenium自动化的10个测试场景

尽管在很多情况下测试自动化是有意义的,但一些测试场景是不应该使用自动化测试工具的,比如Selenium、WebDriver。 下面有10个示例,来解释为什么自动化在这种情况下使用时没有意义的,我还将为您提供每种方法的替代方法。 01.验证…

计算机毕业设计 | SpringBoot+vue 学生成绩课程管理 教务管理系统(附源码)

1,项目背景 教育需求增长 随着社会的发展,对于教育质量的要求也在不断提高。传统的手工操作和纸质记录已经不能满足现代教学的需求。因此,一个自动化、数字化的教务管理系统成为了必然的选择。 信息化趋势 现代科技的飞速发展使得信息化成为…

通过Dockerfile 安装rabbitMq

一、编写Dockerfile Dockerfile 指令详细注释如下: # 使用带有管理插件的官方 RabbitMQ 镜像作为基础 FROM rabbitmq:3.9-management# 复制自定义模板文件到 RabbitMQ 管理插件的模板目录 # 这里假设 ./users.ejs 和 ./limits.ejs 是用于自定义管理界面的模板文件…

七、InnoDB数据存储结构

文章目录 1. 数据库的存储结构:页1.1 磁盘与内存交互基本单位:页1.2 页结构概述1.3 页的大小1.4 页的上层结构2. 页的内部结构2.1 第1部分:File Header(文件头部)和 File Trailer(文件尾部)2.1.1 File Header(文件头部)2.1.2 File tRAILER(文件尾部)2.2 第2部分:Fr…

网络知识点之—EVPN

EVPN(Ethernet Virtual Private Network)是下一代全业务承载的VPN解决方案。EVPN统一了各种VPN业务的控制面,利用BGP扩展协议来传递二层或三层的可达性信息,实现了转发面和控制面的分离。 EVPN解决传统L2VPN的无法实现负载分担、…

【优选算法】--- 分治 快速排序

分治 快速排序 一、颜色分类 / 对快排的复习1、题目解析2、算法原理3、代码 二、排序数组(快排的方法)1、题目解析2、算法原理3、代码 三、数组中的第K个最大元素1、题目解析2、算法原理3、代码 四、库存管理 III(原:剑指 Offer .…

如何使用pymysql和psycopg2连接MySQL和PostgreSQL数据库

在现代软件开发中,数据库是存储和管理数据的核心组件。Python作为一种流行的编程语言,提供了多种方式来连接和操作数据库。在这篇文章中,我们将探讨如何使用pymysql和psycopg2这两个库来连接MySQL和PostgreSQL数据库。我们将从基础概念开始&a…

Khronos:动态环境下时空度量语义SLAM的统一方法

Khronos: A Unified Approach for Spatio-Temporal Metric-Semantic SLAM in Dynamic Environments 原文 项目 引言: 人类居住环境通常是高度动态的,人、机器人和其他实体不断移动、互动和改变场景。对于机器人在这种情况下的操作,仅仅建立一…

想要加密电脑?盘点2024年企业常用的10款电脑文件加密软件

在企业数据安全的时代背景下,文件加密已经成为保护企业核心信息、应对网络安全威胁的关键举措。无论是保护机密的商业数据,还是遵守数据隐私合规性要求,企业对文件加密软件的需求日益增长。本文将盘点2024年企业常用的10款电脑文件加密软件&a…

安卓如何实现双击触摸唤醒点亮屏幕功能-源码分析linage os高通平台

背景: 前面文章已经有讲解过双击亮屏在一些方案调研情况,刚好linage os手机本身也有这个功能,刚好也有整体开源源码,所以今天带大家来对双击亮屏的源码部分进行剖析,本篇文章会一直分析到hal操作驱动节点。 设置作为…

重学SpringBoot3-集成Redis(二)之注解驱动

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(二)之注解驱动 1. 为什么选择 Redis 作为缓存?2. 如何在 Spring Boot 中启用 Redis 缓存?2.1 …

华为OD七日集训第1期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训五、精心挑选21道高频100分经典题目,作为入门。第1天、逻辑分析第2天、数组第3天、双指针第4天、滑动窗口第5天、贪心算法第6天、二分查找第7天、分治递归 六、集训总结 大家好,我是哪吒。 最…

Qt程序打包(解决找到dll问题)

1、运行Qt程序找不到dll 在Qt Creator外,运行Qt编译的exe程序,常常出现找不到xxx.dll而无法运行的问题。 解决的办法之一是找到Qt安装目录下bin文件夹中的dll文件,将该路径添加到系统环境变量path中去。 第二种办法就是对Qt程序进行打包&…

来了,使用YOLOv11目标检测教程

来了,使用YOLOv11目标检测教程 概述 YOLO11 在 2024 年 9 月 27 日的 YOLO Vision 2024 活动中宣布:https://www.youtube.com/watch?vrfI5vOo3-_A。 YOLO11 是 Ultralytics YOLO 系列的最新版本,结合了尖端的准确性、速度和效率&#xff…

【LeetCode】动态规划—72. 编辑距离(附完整Python/C++代码)

动态规划—72. 编辑距离 前言题目描述基本思路1. 问题定义2. 理解问题和递推关系3. 解决方法3.1 动态规划方法3.2 空间优化的动态规划 4. 进一步优化5. 小总结 代码实现PythonPython3代码实现Python 代码解释 CC代码实现C 代码解释 总结: 前言 编辑距离问题是字符串处理中的经…