去雾去雨算法

简单版

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.rhkb.cn/news/411098.html

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

相关文章

数据结构——队的基本操作

一、顺序队 队的用法&#xff1a;先进先出 跟平时我们遇到的大多情况一样&#xff0c;队的主要思想就是先进先出&#xff0c;比如我去食堂打饭&#xff0c;我先排那么就是我先打到饭咯 顺序队&#xff1a;其实说白了就是一块空间用两个指针去指向&#xff0c;为了实现先进先…

C语言指针重学

学习要纲:建议掌握 gdb调试(b ,d ,fin ,bt ,print ,awatch ,up ,down ,set pretty等) SourceInsight软件看代码(全局搜索 文件搜索等) git如何调取分支合并(git branch,git blame,git log,git pull,git reset --hard等) 等内容,下面是对于指针的一个重新学习. C语言的指针&…

AI工具 GPT 学术优化 (GPT Academic) 安装实践

GPT 学术优化 (GPT Academic)是一个综合的AI GPT工具包&#xff0c;可以完成各种gpt辅助的工作&#xff0c;比如代码解读、翻译、读论文等功能。官网&#xff1a;GitHub - binary-husky/gpt_academic: 为GPT/GLM等LLM大语言模型提供实用化交互接口&#xff0c;特别优化论文阅读…

2024年中国运筹学会运筹竞赛(数据驱动赛道)报名通知

竞赛组织 主办单位&#xff1a;中国运筹学会&#xff08;国家一级学会&#xff09; 承办单位&#xff1a;中国科学技术大学 支持单位&#xff1a;杉数科技、海康威视、中国科学技术大学管理学院、《运筹学学报》杂志 竞赛内容 本次竞赛&#xff08;本科生组&#xff09;由竞…

BOSS直聘财报:2024年第二季度净利润4.17亿元,同比上涨34.8%

8月28日美股盘前&#xff0c;BOSS直聘&#xff08;NASDAQ:BZ,HK:2076&#xff09;发布了2024年第二季度财报。在第二季度&#xff0c;公司经营效率不断提升&#xff0c;非通用会计准则下&#xff0c;取得净利润4.17亿元&#xff0c;同比上涨34.8%。 第二季度&#xff0c;公司持…

实习结束总结20240828

长达两个月的实习终于在今天结束了&#xff0c;不知怎的&#xff0c;心如止水&#xff0c;没有高兴&#xff0c;没有伤心&#xff0c;毫无波澜的内心甚至让自己都感觉可怕&#xff0c;也许&#xff0c;这就是成长吧。 硬件上&#xff1a; 1.cadence需要继续深入学习&#xff…

深圳保障房、商品房、小产权房子类型对比

摘要&#xff1a; 整理了我认知以内的深圳房子类型&#xff0c;有安居房&#xff0c;可售人才房&#xff0c;共有产权房、配售型保障房、商品房、统建楼、农民房的区别。如果数据存疑&#xff0c;可以多方对比论证&#xff0c;我也主要靠百度。 我发现我很多同事是非深户&#…

JS WebSocket 深度解析

JS WebSocket 深度解析 文章目录 JavaScript WebSocket 深度解析一、WebSocket 是什么二、JS 中如何使用 WebSocket1. 创建 WebSocket 对象2. 连接打开事件3. 监听消息事件4. 监听错误事件5. 关闭连接 三、WebSocket 包含哪些属性或方法 API1. 属性2. 方法 四、扩展与高级技巧1…

结果一。5.be doing表将来和 表 will的区别

be doing 表⽰近期、眼下就要发⽣的事情; will 表⽰将来的时间,则较远⼀些。如: He is going to write a letter tonight.He will write a book 。 be going to 表⽰根据主观判断将来肯定发⽣的事情。 will+ 动词原形表⽰⼀般将来时。 will ࿰

【xilinx】米联客ZYNQ MZ7100自学发现JTAG烧写失败

3-2-01米联客 2022 版 ZYNQ SOC SDK 入门篇 02 程序固化入门(SDK 方式) 生成了boot.bin 2.4.2 程序通过jtag烧不进去卡在performing erase operation 最终发现是spi的flash type 模式设置错误&#xff0c;文档和板卡没对应上 文档写的qspi-x4-single 实际用的qspi-x8-dual_par…

16:9横屏短视频素材库有哪些?横屏短视频素材网站分享

在当今这个视觉为王的时代&#xff0c;16:9横屏视频凭借其宽阔的画面和卓越的观看体验&#xff0c;已经成为许多视频创作者和营销专家的首选格式。如果你想制作出引人注目的横屏视频&#xff0c;选择高质量的视频素材库是关键。无论你是视频制作的老手还是刚入行的新手&#xf…

免费分享一套SpringBoot+Vue个人理财管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue个人理财管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringbootVue个人理财管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术在管理上越来越深入而广泛的应用&am…

【图像去噪】论文复现:代替ReLU!Pytorch实现即插即用激活函数模块xUnit,并插入到DnCNN中实现xDnCNN!

请先看【专栏介绍文章】&#xff1a;【图像去噪&#xff08;Image Denoising&#xff09;】关于【图像去噪】专栏的相关说明&#xff0c;包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总&#xff08;更新中…

文章生成用这三款伪原创软件效果好

在当今信息爆炸的时代&#xff0c;无论是网站运营者、博主、作家还是学生&#xff0c;对文章的需求量越来越大。他们需要用大理的的原创文章来满足他们工作需求。然而&#xff0c;对于许多人来说&#xff0c;写作一篇优质的文章并非易事。这就产生了一种需求&#xff0c;那就是…

3 Python开发工具:VSCode+插件

本文是 Python 系列教程第 3 篇&#xff0c;完整系列请查看 Python 专栏。 Visual Studio Code的安装非常简单&#xff0c;就不放这里增加文章篇幅了。 相比PyCharm&#xff0c;VSCode更加轻量&#xff0c;启动速度快。并且搭配Python插件就能实现和Pycharm一样的代码提示、高…

如何将平淡无奇的产品推向市场?借助ChatGPT,仅需3秒即可化身短视频创意策划大师,助你的产品一夜成名!

毫无趣味的产品要如何宣传&#xff1f;用ChatGPT&#xff0c;3秒钟成为创意短视频策划高手&#xff0c;让你的产品出圈&#xff01;© 由 ZAKER 提供 最近&#xff0c;全红婵最爱的小乌龟火了。 制作小乌龟的某位义乌商家在接受采访时&#xff0c;表示自己有了甜蜜的烦恼…

力扣刷题(2)

寻找两个正序数组的中位数 寻找两个正序数组的中位数-力扣 思路: 合并两个正序数组找中位数 double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {int arr[nums1Size nums2Size];int n1 0, n2 0;int m 0;int q;//合并两个正序数组w…

Git 远程操作

1. 理解分布式版本控制系统 我们所说的⼯作区&#xff0c;暂存区&#xff0c;版本库等&#xff0c;都是在本地&#xff01;也就是在笔记本或计算机上。⽽我们的 Git 其实是分布式版本控制系统.可以简单理解为&#xff0c;我们每个⼈的电脑上都是⼀个完整的版本库&#xff0c;这…

Java 中的抽象工厂模式:优雅地掌握对象创建

文章目录 一、概述三、抽象工厂设计模式的意图四、抽象工厂模式的详细解释及实际示例五、Java 中抽象工厂模式的编程示例六、抽象工厂模式类图七、Java 中何时使用抽象工厂模式八、抽象工厂模式 Java 教程九、抽象工厂模式的优点和权衡十、Java 中抽象工厂模式的实际应用十一、…

【Web UI自动化测试】Web UI自动化测试之框架篇(全网最全)

本文大纲截图&#xff1a; UnitTest框架&#xff1a; PyTest框架&#xff1a; 框架&#xff1a; 框架英文单词 framework&#xff0c;为解决一类事情的功能的集合。需要按照框架的规定&#xff08;套路&#xff09;去书写代码。 一、UnitTest框架介绍【文末分享自动化测试学…