暗通道理论详解及的Python实现
本⽂参靠何凯明博⼠,暗通道理论论⽂及⽹上⼤量代码.
暗通道原理可参考博⽂:
暗通道
所谓暗通道是⼀个基本假设,这个假设认为,在绝⼤多数的⾮天空的局部区域中,某⼀些像素总会有⾄少⼀个颜⾊通道具有很低的值。
这个其实很容易理解,实际⽣活中造成这个假设的原因有很多,⽐如汽车,建筑物或者城市中的阴影,或者说⾊彩鲜艳的物体或表⾯(⽐如绿⾊的树叶,各种鲜艳的花,或者蓝⾊绿⾊的睡眠),颜⾊较暗的物体或者表⾯,这些景物的暗通道总是变现为⽐较暗的状态。
所以暗通道是什么呢?其实⽐较简单,作者认为暗通道是:
暗通道先验指出:
公玳瑁猫
函数trim的功能是暗通道实际上是在rgb三个通道中取最⼩值组成灰度图,然后再进⾏⼀个最⼩值滤波得到的。如下程序演⽰效果:
from PIL import Image
import numpy as np
c语言w和w+
import matplotlib.pyplot as plt
phology import disk  #⽣成扁平的盘状结构元素,其主要参数是⽣成圆盘的半径
import skimage.filters.rank as sfr
def min_box(image,kernel_size=15):
min_image = sfr.minimum(image,disk(kernel_size))#skimage.filters.rank.minimum()返回图像的局部最⼩值return min_image
def 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)
nomogram模型的解释return dark/255
haze = 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)
python入门教程网盘
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,何凯明博⼠论⽂原⽂链接: pan.baidu/s/1OfsUvMdNLDHvEtjDVanPPw 提取码: dvpn 复制这段内容后打开百度⽹盘⼿机App,操作更⽅便哦!
(第⼀次写博客,慌得⼀P,还是上班溜号写的,哈哈哈,就这样吧,以后常更新!)
**注意:研究⽆雾图像暗通道是为了了解图像暗通道的分布情况,但是实际情况中,此⽅法不可能对有雾图像进⾏除雾.**

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。