去雾去雨算法

简单版

import cv2
import numpy as npdef dehaze(image):"""简单去雾算法,使用直方图均衡化来增强图像"""# 将图像转换为YUV颜色空间yuv_image = cv2.cvtColor(image, cv2.COLOR_BGR2YUV)# 对Y通道(亮度)进行直方图均衡化yuv_image[:, :, 0] = cv2.equalizeHist(yuv_image[:, :, 0])# 将YUV图像转换回BGRdehazed_image = cv2.cvtColor(yuv_image, cv2.COLOR_YUV2BGR)return dehazed_imagedef derain(image):"""简单去雨算法,使用高通滤波器去除细小的雨滴噪声"""# 转换为灰度图像gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用高通滤波器去除雨滴high_pass_filter = cv2.GaussianBlur(gray_image, (21, 21), 0)derained_image = cv2.subtract(gray_image, high_pass_filter)# 增强对比度derained_image = cv2.equalizeHist(derained_image)# 将灰度图转换回BGR格式derained_image = cv2.cvtColor(derained_image, cv2.COLOR_GRAY2BGR)return derained_image# 加载图像
image = cv2.imread('input_image.jpg')# 去雾处理
dehazed_image = dehaze(image)# 去雨处理
derained_image = derain(dehazed_image)# 保存或展示结果
cv2.imwrite('output_image.jpg', derained_image)
cv2.imshow('Result', derained_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

升级版

这段代码实现了一个基于**暗通道先验(Dark Channel Prior)**的图像去雾算法,主要流程是通过计算暗通道、估计大气光、推测透射率并利用引导滤波器改善透射率,然后恢复图像的对比度和清晰度。

效果:

import PIL.Image as Image
import skimage.io as io
import numpy as np
import time
from gf import guided_filter
from numba import jit
import matplotlib.pyplot as pltclass HazeRemoval(object):def __init__(self, omega=0.95, t0=0.1, radius=7, r=20, eps=0.001):passdef open_image(self, img_path):img = Image.open(img_path)self.src = np.array(img).astype(np.double)/255.# self.gray = np.array(img.convert('L'))self.rows, self.cols, _ = self.src.shapeself.dark = np.zeros((self.rows, self.cols), dtype=np.double)self.Alight = np.zeros((3), dtype=np.double)self.tran = np.zeros((self.rows, self.cols), dtype=np.double)self.dst = np.zeros_like(self.src, dtype=np.double)@jitdef get_dark_channel(self, radius=7):print("Starting to compute dark channel prior...")start = time.time()tmp = self.src.min(axis=2)for i in range(self.rows):for j in range(self.cols):rmin = max(0,i-radius)rmax = min(i+radius,self.rows-1)cmin = max(0,j-radius)cmax = min(j+radius,self.cols-1)self.dark[i,j] = tmp[rmin:rmax+1,cmin:cmax+1].min()print("time:",time.time()-start)def get_air_light(self):print("Starting to compute air light prior...")start = time.time()flat = self.dark.flatten()flat.sort()num = int(self.rows*self.cols*0.001)threshold = flat[-num]tmp = self.src[self.dark>=threshold]tmp.sort(axis=0)self.Alight = tmp[-num:,:].mean(axis=0)# print(self.Alight)print("time:",time.time()-start)@jitdef get_transmission(self, radius=7, omega=0.95):print("Starting to compute transmission...")start = time.time()for i in range(self.rows):for j in range(self.cols):rmin = max(0,i-radius)rmax = min(i+radius,self.rows-1)cmin = max(0,j-radius)cmax = min(j+radius,self.cols-1)pixel = (self.src[rmin:rmax+1,cmin:cmax+1]/self.Alight).min()self.tran[i,j] = 1. - omega * pixelprint("time:",time.time()-start)def guided_filter(self, r=60, eps=0.001):print("Starting to compute guided filter trainsmission...")start = time.time()self.gtran = guided_filter(self.src, self.tran, r, eps)print("time:",time.time()-start)def recover(self, t0=0.1):print("Starting recovering...")start = time.time()self.gtran[self.gtran<t0] = t0t = self.gtran.reshape(*self.gtran.shape,1).repeat(3,axis=2)# import ipdb; ipdb.set_trace()self.dst = (self.src.astype(np.double) - self.Alight)/t + self.Alightself.dst *= 255self.dst[self.dst>255] = 255self.dst[self.dst<0] = 0self.dst = self.dst.astype(np.uint8)print("time:",time.time()-start)def show(self):import cv2cv2.imwrite("img/src.jpg", (self.src*255).astype(np.uint8)[:,:,(2,1,0)])cv2.imwrite("img/dark.jpg", (self.dark*255).astype(np.uint8))cv2.imwrite("img/tran.jpg", (self.tran*255).astype(np.uint8))cv2.imwrite("img/gtran.jpg", (self.gtran*255).astype(np.uint8))cv2.imwrite("img/dst.jpg", self.dst[:,:,(2,1,0)])io.imsave("test.jpg", self.dst)if __name__ == '__main__':import syshr = HazeRemoval()hr.open_image(sys.argv[1])hr.get_dark_channel()hr.get_air_light()hr.get_transmission()hr.guided_filter()hr.recover()hr.show()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springsecurity 在web中如何获取用户信息(后端/前端)

一、SecurityContextHolder 是什么 SecurityContextHolder用来获取登录之后用户信息。Spring Security 会将登录用户数据保存在Session中。但是&#xff0c;为了使用方便,Spring Security在此基础上还做了一些改进&#xff0c;其中最主要的一个变化就是线程绑定。当用户登录成功…

4820道西医综合真题西医真题ACCESS\EXCEL数据库

本题库内容源自某出版物《西医综合真题考点还原与答案解析》&#xff0c;包含4千多道真题。这个数据库包含3个表&#xff0c;一个是分类表&#xff08;SECTION_BEAN&#xff09;&#xff0c;一个是题库主表&#xff08;QUESTION_INFO_BEAN&#xff09;&#xff0c;一个是选项表…

【网络】HTTP

在上一篇文章中&#xff0c;我们了解了 协议 的制定与使用流程&#xff0c;不过太过于简陋了&#xff0c;真正的 协议 会复杂得多&#xff0c;也强大得多&#xff0c;比如在网络中使用最为广泛的 HTTP/HTTPS 超文本传输协议 但凡是使用浏览器进行互联网冲浪&#xff0c;那必然…

【生物特征识别论文分享】基于深度学习的掌纹掌静脉识别

&#xff08;待更新&#xff09;基于深度学习的生物特征识别&#xff08;手掌静脉、手背静脉、手指静脉、掌纹、人脸等&#xff09;论文模型总结 。具体方法包括&#xff1a;基于特征表征、基于传统网络设计与优化、基于轻量级网络设计与优化、基于Transformer设计与优化、基于…

Leetcode 100.101.110.199 二叉树相同/对称/平衡 C++实现

Leetcode 100. 相同的树 问题&#xff1a;给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 /*** Definition for a binary tree node.* struct T…

Error: Can not import paddle core while this file exists

背景 因为工作需要&#xff0c;原来的项目部署的电脑被征用&#xff0c;重新换了一个新电脑&#xff0c;重装了系统&#xff0c;今天在给一个使用ocr的项目进行环境配置的时候发现&#xff0c;无论安装哪个版本的paddlepaddle&#xff0c;总是可以安装成功&#xff0c;但是导入…

开源接口自动化测试工具AutoMeter

AutoMeter是一款针对分布式服务和微服务API做功能和性能一体化的自动化测试平台。一站式提供项目管理&#xff0c;微服务&#xff0c;API接口&#xff0c;用例&#xff0c;环境管理&#xff0c;测试管理&#xff0c;前置条件&#xff0c;测试集合&#xff0c;变量管理&#xff…

kali安装

引言 Kali Linux 是一个基于 Debian 的 Linux 发行版&#xff0c;专门为渗透测试和安全审计而设计。它包含了大量的安全工具&#xff0c;如 Wireshark、Nmap、Metasploit 等&#xff0c;这些工具可以帮助安全专家和研究人员进行网络安全评估、漏洞检测和渗透测试。Kali Linux …

系统架构师(每日一练23)

每日一练 1.软件活动主要包括软件描述、()、软件有效性验证和()&#xff0c;()定义了软件功能及使用限制。答案与解析 问题1 A.软件模型 B.软件需求 C.软件分析 D.软件开发 问题2 A.软件分析 B.软件测试 C.软件演化 D.软件开发 问题3 A.软件分析 B.软件测试 C.软件描述 D.软…

进阶-5.锁

锁 1.概述2.全局锁3.表级锁3.1 介绍3.2 表锁3.3 元数据锁3.4意向锁 4.行级锁 1.概述 分类 按锁的粒度分类&#xff1a; 全局锁&#xff1a;锁住数据库中所有表表级锁&#xff1a;每次操作锁定整张表行级锁&#xff1a;每次操作锁定对应的行数据 2.全局锁 介绍 全局锁就是对…

第N11周:seq2seq翻译实战-Pytorch复现

任务&#xff1a; ●为解码器添加上注意力机制 一、前期准备工作 from __future__ import unicode_literals, print_function, division from io import open import unicodedata import string import re import randomimport torch import torch.nn as nn from torch impor…

一款好看的WordPress REST API 主题

介绍&#xff1a; 主题特色&#xff1a; 使用Nuxtjs WordPress Rest Api 实现前后端分离&#xff0c;可完成多端部署&#xff1b; 主题支持自动切换黑夜模式。 使用说明&#xff1a; service 目录为wordpress主题文件&#xff0c;需要拷贝到wordpress主题目录下&#xff0…

记录一次经历:使用flask_sqlalchemy集成flask造成循环导入问题

前言&#xff1a; 工作需求&#xff0c;写一个接口&#xff0c;用Python来编写&#xff0c;我首先想到用flask小型框架来支撑&#xff0c;配置sqlalchemy来实现&#xff0c;但是在实现的过程中&#xff0c;发生循环导入问题 我想到用蓝图来解决此问题&#xff0c;但是仍然会出死…

设置虚拟机使用主机以太网而不是WiF连接

虚拟机使用主机的以太网连接而不是Wi-Fi连接&#xff0c;可以通过在虚拟化软件中配置虚拟机的网络设置来实现。以下是一些常见的虚拟化软件&#xff08;如VMware和VirtualBox&#xff09;中设置虚拟机网络以使用以太网连接的步骤&#xff1a; 一、VMware中设置 1、打开虚拟网…

天猫 登录滑块 淘系滑块分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关 前言 玩了几天现在才有空研究轨迹直接用了之前的…

UEditor百度富文本后端上传文件接口

UEditor百度富文本后端上传文件接口 直接上代码 接口&#xff1a; RequestMapping("/UEditorConfig")public String list(HttpServletRequest request, HttpServletResponse response) throws IOException {String config environment.getProperty("ueditor.c…

SOMEIP_ETS_059: ResetInterface_wrong_Fire_and_forget_package_get_No_Error_back

测试目的&#xff1a; 验证设备&#xff08;DUT&#xff09;在接收到一个错误的Fire&Forget消息时&#xff0c;不会做出响应或发送错误消息。 描述 本测试用例旨在检查DUT在接收到使用无效接口版本的方法resetInterface的Fire&Forget消息时&#xff0c;是否不会回应…

打卡学习Python爬虫第五天|Xpath解析的使用

什么是Xpath&#xff1f;是在XML文档中搜索内容的一门语言&#xff0c;HTML可以看作是xml的一个子集。 目录 1、安装lxml模块 2、导入lxml中的etree子模块 3、Xpath使用方法 3.1.选择节点 3.2.选择属性 3.3.选择文本内容 3.4.使用通配符*过滤节点 3.5.使用中括号[]索引…

【STM32】一些外设通用内容

在学习各种外设的过程中&#xff0c;发现外设有一些通用的东西可以总结一下&#xff0c;后面发现再继续更新。图来源于正点原子的学习视频和PPT。 目录 1 外设的时钟的开启 2 外设初始化的回调机制 3 外设的中断服务函数 4 HAL库中断回调机制 5 函数的常见…