本文参靠何凯明博士,暗通道理论论文及网上大量代码.
暗通道原理可参考博文:

白马负金羁: 链接:https://blog.csdn.net/baimafujinji/article/details/27206237
和蔼的zhxing:链接:https://www.jianshu.com/p/df9c963a392a

  • 暗通道
    所谓暗通道是一个基本假设,这个假设认为,在绝大多数的非天空的局部区域中,某一些像素总会有至少一个颜色通道具有很低的值。这个其实很容易理解,实际生活中造成这个假设的原因有很多,比如汽车,建筑物或者城市中的阴影,或者说色彩鲜艳的物体或表面(比如绿色的树叶,各种鲜艳的花,或者蓝色绿色的睡眠),颜色较暗的物体或者表面,这些景物的暗通道总是变现为比较暗的状态。
    所以暗通道是什么呢?其实比较简单,作者认为暗通道是:


暗通道先验指出:

暗通道实际上是在rgb三个通道中取最小值组成灰度图,然后再进行一个最小值滤波得到的。如下程序演示效果:


from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from skimage.morphology import disk  #生成扁平的盘状结构元素,其主要参数是生成圆盘的半径
import skimage.filters.rank as sfrdef min_box(image,kernel_size=15):min_image = sfr.minimum(image,disk(kernel_size))  #skimage.filters.rank.minimum()返回图像的局部最小值return min_imagedef calculate_dark(image):if not isinstance(image,np.ndarray):raise ValueError("input image is not numpy type")  #手动抛出异常dark = np.minimum(image[:,:,0],image[:,:,1],image[:,:,2]).astype(np.float32) #取三个通道的最小值来获取暗通道dark = min_box(dark,kernel_size=15)return dark/255haze = np.array(Image.open("/path/1118.jpg"))[:,:,0:3]/255
clear = np.array(Image.open("/path/clear.png"))[:,:,0:3]/255
dark_haze = calculate_dark(haze)
dark_clear = calculate_dark(clear)plt.figure()
plt.subplot(2,2,1)
plt.imshow(haze)plt.subplot(2,2,2)
plt.imshow(dark_haze,cmap="gray")plt.subplot(2,2,3)
plt.imshow(clear)plt.subplot(2,2,4)
plt.imshow(dark_clear,cmap="gray")plt.show()

以上程序基于Python3实现,运行效果如图所示:

上面部分为有雾图像,右边是该图像的暗通道分布.下面时无雾图像,右边是其暗通道分布.
可以发现,有雾的时候会呈现一定的灰色,而无雾的时候咋会呈现大量的黑色(像素为接近0),作者统计了5000多副图像的特征,基本都符合这样一条先验定理。

  • 雾图模型
    计算机视觉中,下面这个雾图形成模型是被广泛使用的:

    其中I(x)是现有的图像(待去雾),J(x)是要恢复的原无雾图像,A是全球大气光成分,t(x)是透射率,现在的条件就是已知I(x),来求J(x),显然不加任何限制的话是有无穷多个解的。
    但是现实生活中,即使是晴天白云,空气中也会存在一些颗粒,看远方的物体还是能够感觉到雾的影响,另外,雾的存在可以让人们感觉到景深的存在,所以我们保留一部分的雾,上式修正为:其中w是[0-1]之间的一个值,一般取0.95差不多。


上面的推导都是假设全球大气光是已知的,实际中,我们可以借助暗通道图来从有雾图像中来获取该值:

 1.从暗通道图中按照亮度大小取前0.1%的像素。2.在这些位置中,在原始图像中寻找对应具有最高亮度点的值,作为A值。

之后,我们就可以进行有雾图像的恢复了:

当投射图t很小时,会导致J的值偏大,会导致图片某些地方过爆,所以一般可以设置一个阈值来限制,我们设置一个阈值:一般设置较小,0.1即可。

但是这个去雾效果还是挺粗糙的,主要原因是由于透射率图过于粗糙了,何凯明在文章中提出了soft matting方法,然后其缺点是速度特别慢,不适用在实时场合,2011年,又提出可以使用导向滤波的方式来获得更细腻的结果,这个方法的运算主要集中在方框滤波(均值滤波),而这种操作在opencv或者其他的图像库中都有快速算法。可以考虑使用。

我的实现效果如下所示:
先上论文原图效果演示:

网上随机找的图片进行测试效果如下:
这幅时开车时拍的雨天,蓝色区域时挡风玻璃贴的膜,算法略微有改动,使远处天空区域失真效果减弱了!

原算法1,不可去除大片白色区域的图片.2,不可去除大片天空区域.3,对于处理结果会有失真现象.接近天空部分区域会出现过曝.4,使用soft matiing方法使算法速度慢,所以后来改进为引导滤波算法获得透射率图像,这个后面我会再出一篇博客进行讲解.至此,看过原论文的大概基本都理解了!以上效果是改进一些参数后得到的图像.

公式推导建议自己推一遍,该算法基本原理来源于何凯明大神的CVPR09的论文Single Image Haze Removal Using Dark Channel Prior,何凯明博士论文原文链接: https://pan.baidu.com/s/1OfsUvMdNLDHvEtjDVanPPw 提取码: dvpn 复制这段内容后打开百度网盘手机App,操作更方便哦!
(第一次写博客,慌得一P,还是上班溜号写的,哈哈哈,就这样吧,以后常更新!)
**注意:研究无雾图像暗通道是为了了解图像暗通道的分布情况,但是实际情况中,此方法不可能对有雾图像进行除雾.**

暗通道理论详解及的Python实现相关推荐

  1. 手机摄影中多摄融合理论详解与代码实战

    转载AI Studio项目链接https://aistudio.baidu.com/aistudio/projectdetail/3465839 手机摄影中多摄融合理论详解与代码实战 前言   从20 ...

  2. 基于导向滤波的暗通道先验去雾算法(Python,可直接运行)

    基于导向滤波的暗通道先验去雾算法(Python语言,可直接运行) 1 编译环境 2 原理介绍 2.1 暗通道先验 2.1.1 暗通道先验理论与去雾模型 2.1.2 处理步骤 2.2 导向滤波求t(x) ...

  3. python英语字典程序修改_详解如何修改python中字典的键和值

    我们知道python中字典是无序的,它们都是通过hash去对应的.一般的如果我们需要修改字典的值,只需要直接覆盖即可,而修改字典的键,则需要使用字典自带的pop函数,示例如下: t = {} t['a ...

  4. 大数据时代 | 数据分析方法及理论详解

    大数据时代 | 数据分析方法及理论详解 1 数据分析前,我们需要思考 像一场战役的总指挥影响着整个战役的胜败一样,数据分析师的思想对于整体分析思路,甚至分析结果都有着关键性的作用. 2 分析问题和解决 ...

  5. python java混合编程_详解java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

  6. centos7安装python3_详解Centos7升级python 2.7至Python 3.7

    详解Centos7升级python 2.7至Python 3.7 龙行 个人随笔 2019-6-6 3451 0评论 centos7版本默认安装的是python2.7,对于强迫症的我来说,忍受不了啊. ...

  7. 【机器学习】【隐马尔可夫模型-3】后向算法:算法详解+示例讲解+Python实现

    0.前排提示 csdn有些数学公式编辑不出来,所以本博用容易书写的表达式来表示专业数学公式,如: (1)  在本博客中用α<T>(i)来表示 (2)在本博客中用[i=1, N]∑来表示 注 ...

  8. python字典修改键所对应值_详解如何修改python中字典的键和值

    我们知道python中字典是无序的,它们都是通过hash去对应的.一般的如果我们需要修改字典的值,只需要直接覆盖即可,而修改字典的键,则需要使用字典自带的pop函数,示例如下: t = {} t['a ...

  9. 回撤率 python 平台_详解如何使用python计算一只股票的最大回撤率?

    详解如何使用python计算一只股票的最大回撤率? 一.什么是最大回撤率? 最大回撤率:在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值.最大回撤用来描述买入产品后可能出现 ...

  10. 详解如何使用python计算一只股票的最大回撤率?

    详解如何使用python计算一只股票的最大回撤率? 一.什么是最大回撤率? 最大回撤率:在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值.最大回撤用来描述买入产品后可能出现 ...

最新文章

  1. idea设置新增文件,自动添加到git
  2. Java黑皮书课后题第10章:*10.5(显示素数因子)编写一个程序,提示用户输入一个正整数,然后以降序显示它的所有最小因子
  3. 如何用cocos2d-x来开发简单的Uphone游戏:(二) 移动的精灵
  4. JFinal整合CKFinder
  5. 使用 hexo-git-backup 插件备份你的 Hexo 博客
  6. linux手机用什么购物支付,商城系统的微信支付应该如何配置?
  7. 使用screen的时候出现了如下错误: Cannot open your terminal '/dev/pts/0' - please check.
  8. 漫画:分布式缓存服务器扛不住了怎么办?| 技术头条
  9. mysql关闭显示无权限_如何关闭mysql远程登录权限
  10. js去掉a链接点击后产生的虚线(兼容火狐)
  11. Golang1.6 官方支持embed 替换掉statilk
  12. 【Xamarin挖墙脚系列:卸载不彻底的解决】
  13. UITableView(二)
  14. Java8 实战系列-06-lambda 方法引用
  15. 正弦波形多波形叠加的音频文件生成工具v1.0使用说明
  16. QGIS编译---QGIS3.10.6 + Qt5.11.2 + VS2015 ---32位版本
  17. MIMO技术杂谈(四):OFDM那些事(二)
  18. 帝国php漏洞,帝国cms远程代码执行漏洞-1
  19. 用什么擦地最干净脑筋急转弯_小学生语文试卷:为什么秋天大雁要飞回南方?答案让人“喷饭”...
  20. Vue—使用canvas实现电子签名

热门文章

  1. Azure云centos7安装图形化界面
  2. PyTorch学习之误差反向传播
  3. 软件项目风险控制-公益讲座视频,供大家学习参考。
  4. C++解题报告:连续的“包含”子串长度——(线段树+尺取法)
  5. SpringBoot整合腾讯云直播,生成推拉流配置及工具类详细讲解!
  6. html入住登记源码,酒店客户入住登记管理系统设计与实现.doc
  7. 保研之路——北邮网研院交换中心夏令营
  8. 雪球网股票用户评论爬虫
  9. c语言 特征码思路来破植物大战僵尸
  10. 连接游戏服务器网络延迟高,玩游戏网络延迟高怎么办 网络卡Ping值很高的解决方法...