去雾去雨算法

简单版

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设计与优化、基于…

在ubuntu系统中对于msg文件编译后生成的头文件,在程序中include时是用<>还是““,哪个检索文件的效率更高

在 Ubuntu 系统中&#xff0c;对于 ROS 中的消息&#xff08;msg&#xff09;文件编译后生成的头文件&#xff0c;在程序中包含&#xff08;include&#xff09;时应使用 ""&#xff0c;而不是 <>。 通常&#xff0c;在 C/C 中&#xff0c;使用 <> 来包…

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

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

Python单例模式:深入解析与应用

在软件开发中&#xff0c;设计模式是解决问题和构建软件架构的模板和最佳实践。单例模式&#xff08;Singleton Pattern&#xff09;是设计模式中最简单也是最常用的一种。它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。这种模式在需要控制资源访问…

Error: Can not import paddle core while this file exists

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

【模板方法】设计模式:构建可扩展软件的基石

本文主要介绍模板方法设计模式的定义、作用及使用场景 引言 在软件开发中&#xff0c;设计模式是解决常见问题的经过验证的解决方案。模板方法设计模式&#xff0c;作为行为型设计模式的一种&#xff0c;提供了一种在不牺牲灵活性的前提下定义算法框架的方法。 本文将深入探讨…

Vant 组件库在Vue3的使用

Vant 是一个轻量、可靠的移动端组件库&#xff0c;专为 Vue.js 框架设计&#xff0c;提供了丰富的组件来加速移动端应用的开发。以下是关于 Vant UI 组件库以及在 Vue 3 中的使用方法的介绍。 Vant 组件库介绍 Vant 组件库拥有以下特点&#xff1a; 轻量化&#xff1a;组件平…

第五题:最长回文子串(Longest Palindromic Substring)

题目描述&#xff1a; 给定一个字符串 s&#xff0c;找到 s 中最长的回文子串。 示例&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 或 "aba" 输入&#xff1a;s "cbbd" 输出&#xff1a;"bb" 要求…

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

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

【芯片设计- RTL 数字逻辑设计入门 9.4 -- Power Gating 在SoC 芯片电源完整性中的详细介绍】

文章目录 电源完整性简介电源完整性重要性电源完整性主要问题电源完整性问题优化什么是Power Gating?Power Gating的优势与挑战浪涌电流的产生与影响设计中的折中与优化电源完整性简介 电源完整性(Power Integrity, PI)是指在系统级设计中,确保电源分配网络(Power Distri…

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…

Python中的变量:作用域与生命周期的秘密探索

引言 在编程的世界里&#xff0c;变量如同舞台上的演员&#xff0c;它们有着自己的“角色”——存储数据&#xff0c;也有着特定的“登场”和“退场”时刻&#xff0c;即作用域和生命周期。理解这些概念对于编写高效、可维护的代码至关重要。本文将带你一起探索Python中变量的…

一款好看的WordPress REST API 主题

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