"""
1.去雾算法介绍博客:
http://blkstone.github.io/2015/08/20/single-image-haze-removal-using-dark-channel/
2.论文地址(2009 CVPR best paper):
https://paperswithcode.com/paper/single-image-haze-removal-using-dark-channel
3.资源下载(镜像)地址:
pip install [The Package You Want to Download] -i https://pypi.tuna.tsinghua.edu.cn/simple
ps. cv2 means opencv-python
"""
import timeimport cv2
import numpy as np
import argparse# 计算雾化图像的暗通道
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# 去雾主程序
def DeHaze(opt):path, output, photo, t0, w = opt.input, opt.output, opt.photo, opt.threshold_value, opt.dehaze_degree# 读取待处理图像im = cv2.imread(path)# 压缩RGB通道值于0到1img = im.astype('float64') / 255img_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY).astype('float64') / 255atom = GetAtmo(img)trans = GetTrans(img, atom, w)trans_guided = GuidedFilter(trans, img_gray, 20, 0.0001)"""1.t0 最小透射率值,一般取0.252.投射图t 的值过小——>图像会整体向白场过度3.因此一般设置一阈值t0:当t值小于t0时,令t=t0"""trans_guided = cv2.max(trans_guided, t0)result = np.empty_like(img)for i in range(3):result[:, :, i] = (img[:, :, i] - atom) / trans_guided + atom# #显示&保存结果# cv2.imshow("source", img)# cv2.imshow("result", result)# cv2.waitKey()photoName = r'{}\{}'.format(output, photo)if output is not None:# TODO 重名照片问题处理 现已解决:在名字后添加保存时间 %d%H%M(日、时、分)if photoName is not None:photo = photo.split(".")photo_temp = str(photo[0] + f'_{time.strftime("%m%d%H%M", time.localtime())}')photo = str(photo_temp + '.' + photo[1])cv2.imwrite("{}\\{}".format(output, photo), result * 255)else:cv2.imwrite("{}\\{}".format(output, photo), result * 255)return photo_temp# # 可通过命令行传递参数
# parser = argparse.ArgumentParser()
# parser.add_argument('-i', '--input', default=ImgInput)
# parser.add_argument('-o', '--output', default=ImgFile)
# parser.add_argument('-p', '--photo', default=photo_name)
# # t为最小透射率,一般取0.25。投射图t 的值过小——>图像会整体向白场过度
# parser.add_argument('-t', '--threshold_value', default=0.50)
# # w为去雾程度,一般取0.95。w的值越大,去雾效果越明显
# parser.add_argument('-w', '--dehaze_degree', default=0.20)
# opt = parser.parse_args()
# print(f'parser.parse_args(解析器的参数):\n{opt}')class opt:def __init__(self):self.input = Noneself.output = Noneself.photo = Noneself.threshold_value = 0.90self.dehaze_degree = 0.25def opt(self, ImgInput, ImgFile, photo_name):self.input = ImgInputself.output = ImgFileself.photo = photo_namedef hyp(self):print(f't为最小透射率,一般取0.25。投射图t 的值过小——>图像会整体向白场过度')self.threshold_value = float(input(f't:'))print(f'w为去雾程度,一般取0.95。w的值越大,去雾效果越明显')self.dehaze_degree = float(input(f'w:'))# TODO 提醒三:quwu()可被方便调用,传入图片名称,输出去雾后图片相对路径
# 主程序
def quwu(img):img_ed = None# 图片相关参数:# 1.默认图片#TODO 提醒一:在此设置默认检测图片Defeat = r'canon3.bmp'defeat_photo = 'Input\\haze\\{}'.format(Defeat)if img is None:# 待处理图片photo_name = f'{Defeat}.jpg'# 处理后图片保存地址imgFile = 'Output\\HazeRemove'ImgInput = defeat_photoImgFile = r'{}'.format(imgFile)else:# TODO 提醒二:在此分别设置待检测图片的名称,所在目录,保存目录# 2.待处理图片photo_name = f'{img}.jpg'# 3.待处理图片所在目录地址imgInput = r'Input/emotion'# 4.处理后图片保存地址imgFile = r'Output/haze_test_310'ImgInput = r'{}\{}'.format(imgInput, photo_name)ImgFile = r'{}'.format(imgFile)Opt = opt()Opt.opt(ImgInput, ImgFile, photo_name)if input('是否修改超参数:[y/n]') == 'y':Opt.hyp()if __name__ == '__main__':  # 这里必须是__main__(在本模块执行的时候__name__会保存为__main__),不能是__DeHaze__或__dehaze__(函数/模块名)img_ed = DeHaze(Opt)print('[1]去雾算法正在dehaze模块中被测试')else:img_ed = DeHaze(Opt)print('[2]去雾算法正在被调用')img_Ed = r'{}/{}'.format(imgFile, img_ed)return img_Ed+'.jpg'if __name__ == '__main__':img_trans = NoneImgEd = quwu(img_trans)print('去雾后的图片地址和名称:{}'.format(ImgEd))

最近在学习python,初略看完了面向对象编程部分,便以练手的心态改进了之前的去雾算法模块:

TODO 提醒一:在此设置默认检测图片
TODO 提醒二:在此分别设置待检测图片的名称,所在目录,保存目录
TODO 提醒三:quwu()可被方便调用,传入图片名称,输出去雾后图片相对路径

可以直接在其他模块中调用dehaze(),比如:

if input('是否去雾:[y/n]') == 'y':img_path = quwu(photo_name)

针对可能存在的同名图片: 采取在原始名字后添加保存时间 %d%H%M(日、时、分)的方法,如不满意,可自行修改

    if output is not None:# TODO 重名照片问题处理 现已解决:在名字后添加保存时间 %d%H%M(日、时、分)if photoName is not None:photo = photo.split(".")photo_temp = str(photo[0] + f'_{time.strftime("%m%d%H%M", time.localtime())}')photo = str(photo_temp + '.' + photo[1])cv2.imwrite("{}\\{}".format(output, photo), result * 255)else:cv2.imwrite("{}\\{}".format(output, photo), result * 255)return photo_temp

初学者所写代码,还请见谅,如有路过的大佬愿意指教,十分感谢!

去雾模块dehaze.py(可直接调用)相关推荐

  1. 基于MATLAB的图像去雾系统

    基于MATLAB的图像去雾系统 (一)图像去雾基础原理 1.雾霭的形成机理 雾实际上是由悬浮颗粒在大气中的微小液滴构成的气溶胶,常呈现乳白色,其底部位于地球表面,所以也可以看作是接近地面的云.霭其实跟 ...

  2. 基于图像去雾处理的雾霾污染程度评估(任务书+lunwen+翻译及原文+答辩PPT)

    目 录 1 引言 1 2 图像去雾算法 1 2.1 基于同态滤波的图像去雾算法 2 2.1.1 算法概述 2 2.1.2 同态滤波 3 2.1.3 模型简介 3 2.1.4 偏微分方程求解 4 2.2 ...

  3. Domain Adaptation for Image Dehazing(图像去雾的域自适应算法CVPR2020)

    摘要:现有的去雾方法大多是在合成的雾霾图像上训练去雾模型,但由于域的偏移,对真实的雾霾图像的泛化效果较差.故提出一种领域自适应模式,该模式由一个图像平移模块和两个图像去雾模块组成.具体来说,首先应用一 ...

  4. Python 还能实现图片去雾?FFA 去雾算法、暗通道去雾算法用起来!(附代码)...

    授权自AI科技大本营(ID:rgznai100) 本文约3600字,建议阅读7分钟. 本文为你介绍FFA去雾算法和暗通道去雾算法搭建. 在过去的几十年中,单图像去雾作为基本的低级视觉任务已引起了计算机 ...

  5. Python 还能实现图片去雾?FFA 去雾算法、暗通道去雾算法用起来! | 附代码

    在过去的几十年中,单图像去雾作为基本的低级视觉任务已引起了计算机视觉社区和人工智能公司的越来越多的关注.其中最为典型的便是北大&北航提出FFA-Net去雾新网络和何凯明博士提出的暗通道去雾算法 ...

  6. Python图像去雾

    ** Python图像去雾 ** 引言: 在过去的几十年中,单图像去雾作为基本的低级视觉任务已引起了计算机视觉社区和人工智能公司的越来越多的关注.其中最为典型的便是北大&北航提出FFA-Net ...

  7. 1.AOD-Net去雾论文阅读

    AOD-Net 文章DOI:10.1109/ICCV.2017.511 源代码可以在:AODnet-by-pytorch中找到,其中有些代码过期或者命令行有错误,需要完整能跑的可以留言我看到会回复 A ...

  8. 图像去雾----暗通道

    暗通道去雾算法原理及实现 1. 算法原理. 基本原理来源于何凯明大神的CVPR09的论文Single Image Haze Removal Using Dark Channel Prior 暗通道. ...

  9. 图像去雾毕业论文准备01-python中time标准库

    2021年第一篇博文,很高兴又回到博文! 先说说后面我需要做的工作 我的毕业论文是<基于卷积神经网络的去雾> 关于论文,我打算从以下5章进行展开 第1章 1.1 背景 1.2 国内外研究现 ...

最新文章

  1. jenkins自动化工具使用教程(转)
  2. pywebio和stylecolud 做的词云gui
  3. Oracle里面的用户smsdb无法登录 LOCKED(TIMED)
  4. WARN ServletController:171 - Can't find the the request for xxxx's Observer
  5. 内存溢出和内存泄漏的区别、产生原因以及解决方案 转
  6. java内存区域_JVM学习之—Java内存区域
  7. JavaScript学习总结(3)——JavaScript函数(function)
  8. qtreeview编辑节点文本_[我花2个月做了叙事短篇游戏]我是怎么做游戏编辑工具的...
  9. Gantt - attachEvent事件监听 - (必须)拥有返回值事件
  10. SmartUpload
  11. 【21天学习挑战赛】哪吒邀你参加Java研讨班
  12. 【信息检索导论】第一章 布尔检索
  13. 【AI with ML】第 8 章 :使用 TensorFlow 创建文本
  14. php添加背景图及设置格式,PHP添加PNG图片背景透明水印操作类定义与用法示例
  15. java 行列式计算_n阶行列式的全排列求解(Java)
  16. 如何查看win 10 无线密码
  17. 用它!用它!轻松实现线上线下门店一体化运营!
  18. 【数据分析】洞察业务指标体系(in)
  19. 内网穿透工具NPS安装使用
  20. BP综述:自闭症中基于功能连接体的预测模型

热门文章

  1. 《水经注地图服务》缓存管理说明
  2. php实现播放直播_php和腾讯直播的实现代码
  3. 阿里云实时音视频直播鉴权java代码示例
  4. 第 2 课 第二次鸦片战争(1856-1860 年) (咸丰帝在位)
  5. 微信小程序如何直接分享到朋友圈?
  6. Skia深入分析8——Skia的GPU绘图
  7. CentOS7 查询版本/CPU/内存/硬盘容量等命令
  8. 在Chrome 浏览器上滚动截屏
  9. 求素数个数【C语言】
  10. 隐藏滚动条css3实现滚动同时隐藏滚动条