图像去雾算法

雾霾是由空气中的灰尘和烟雾等小的漂浮颗粒产生的常见大气现象。这些漂浮的颗粒极大地吸收和散射光,导致图像质量下降。在雾霾影响下,视频监控,远程感应,自动驾驶等许多实际应用很容易受到威胁,检测和识别等高级计算机视觉任务很难完成。因此,图像去雾(除雾)成为一种越来越重要的技术。

暗通道去雾算法

Kaiming(何凯明)早在09年以MSRA实习生的身份发布的Single Image Haze Removal Using Dark Channel Prior获得CVPR best paper,其内容就是给图像去雾。当时并没有用深度学习,却能实现让人震惊的效果。

1、雾图模型

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



其中I(x)是现有的图像(待去雾),J(x)是要恢复的原无雾图像,A是全球大气光成分,t(x)是大气折射率。
变形可得:


2、暗通道与折射率预估

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




可以发现,有雾的时候会呈现一定的灰色,而无雾的时候则会呈现大量的黑色(像素为接近0)。
所以暗通道是什么呢?其实比较简单,作者认为暗通道是:



暗通道先验理论指出:

由此可以用于预估折射率

但是现实生活中,即使是晴天白云,空气中也会存在一些颗粒,看远方的物体还是能够感觉到雾的影响,另外,雾的存在可以让人们感觉到景深的存在,所以我们保留一部分的雾,上式修正为:



其中w是[0-1]之间的一个值,一般取0.95差不多。

3、计算全球大气光

现在唯一未知的就是全球大气光A了。实际中,我们可以借助暗通道图来从有雾图像中来获取该值:
第一步,从暗通道图中按照亮度大小取前0.1%的像素。
第二步,在这些位置中,在原始图像中寻找对应具有最高亮度点的值,作为A值。

4、代码实现

# coding=utf-8
import numpy as np
from PIL import Image
import cv2 as cv
import matplotlib.pyplot as plt
import math

def guidedfilter(I, p, r, eps):
    '''
    引导滤波
    '''
    height, width = I.shape
    m_I = cv.boxFilter(I, -1, (r,r))
    m_p = cv.boxFilter(p, -1, (r,r))
    m_Ip = cv.boxFilter(I*p, -1, (r,r))
    cov_Ip = m_Ip-m_I*m_p
  
    m_II = cv.boxFilter(I*I, -1, (r,r))
    var_I = m_II-m_I*m_I
  
    a = cov_Ip/(var_I+eps)
    b = m_p-a*m_I
  
    m_a = cv.boxFilter(a, -1, (r,r))
    m_b = cv.boxFilter(b, -1, (r,r))
    return m_a*I+m_b

def get_dc_A(I, r, eps, w, maxGray):
    '''
    计算暗通道图dc和光照值A:V1 = 1-t/A
    INPUT -> 归一化图像数组, 滤波器半径, 噪声, 灰度范围, maxGray
    '''
    # 分离三通道
    B,G,R = cv.split(I)
    # 求出每个像素RGB分量中的最小值, 得到暗通道图
    dc = cv.min(cv.min(R,G), B)
    # 使用引导滤波优化
    dc = guidedfilter(dc, cv.erode(dc, np.ones((2*r+1, 2*r+1))), r, eps)
    bins = 2000
    # 计算大气光照A
    ht = np.histogram(dc, bins)
    d = np.cumsum(ht[0])/float(dc.size)
    for lmax in range(bins-1, 0, -1):
        if d[lmax]<=0.999:
            break
    A  = np.mean(I, 2)[dc>=ht[1][lmax]].max()
    # 对值范围进行限制
    dc = np.minimum(dc*w, maxGray)
    return dc, A

if __name__ == '__main__':
    src = np.array(Image.open('231.jpg'))
    I = src.astype('float64')/255
    
    # 得到遮罩图像和大气光照
    dc, A = get_dc_A(I, 111, 0.001, 0.95, 0.80)
    # 调用雾图模型
    J = np.zeros(I.shape)
    for k in range(3):
        J[:,:,k] = (I[:,:,k]-dc)/(1-dc/A)
    J =  np.clip(J, 0, 1)
    # 伽马校正
    J = J**(np.log(0.5)/np.log(J.mean()))
    # 拼接结果
    output = np.hstack((I, J))
    plt.imshow(Image.fromarray(np.uint8(output*255)))
    plt.show()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352