《Single Image Haze Removal Using Dark Channel Prior》阅读笔记

2024-01-27 20:20

本文主要是介绍《Single Image Haze Removal Using Dark Channel Prior》阅读笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Single Image Haze Removal Using Dark Channel Prior》

前言

这篇文章是何大神于09发表在cvpr上的传统图像处理方向的文章,直到现在其效果任然不输于深度网络。
论文连接:https://ieeexplore.ieee.org/document/5567108/
代码连接:见文章末

Abstract

在本文中,我们提出了一个简单但有效的图像先验暗通道,以去除单一输入图像的雾霾。暗通道先验是一种无雾霾户外图像的统计数据。它是基于一个关键的观察—— 在无雾的户外图像中的大多数局部斑块包含一些在至少一个颜色通道中强度非常低的像素。 利用此先验的雾霾成像模型,我们可以直接估计雾霾的厚度,恢复一个高质量的无雾霾图像。对各种户外雾霾图像的研究结果表明了所提出的先验的能力。此外,一个高质量的深度图也可以获得作为去除雾霾的副产品。

1. Introduction

雾霾、雾和烟雾是大气吸收和散射产生的现象。摄像机从场景点接收到的辐照度沿着视线被衰减。
雾霾去除在计算机视觉上的应用:

  • 首先,去除雾霾可以显著提高场景的能见度,纠正由空气光造成的颜色变化。
  • 其次,大多数计算机视觉算法,从低级图像分析到高级目标识别,通常假设输入图像(经过辐射校准后)是场景亮度
  • 最后,去除雾霾可以产生深度信息,有利于多种视觉算法和先进的图像编辑。雾霾或雾霾可以作为理解场景的一个有用的深度线索。

然而,由于雾霾是一个未知的深度信息,因此雾霾去除是一个具有挑战性的问题。如果输入只是一个雾霾图像,则该问题是欠约束的。因此,许多方法被提出通过使用多个图像或附加信息。基于偏振的方法通过拍摄两幅或多张不同偏振程度的图像来消除雾霾效应。在中,从不同天气条件下同一场景的多个图像中获得更多的约束。基于深度的方法需要从用户输入或已知的3D模型的粗略深度信息。
近年来,单图像雾霾去除取得了重大进展。

  • 无雾霾图像必须比输入的雾霾图像具有更高的对比度,通过最大化恢复图像的局部对比度来消除雾霾。结果在视觉上引人注目,但可能在物理上无效。
  • 估计场景的反照率,然后推断出介质传输,假设是传输和表面阴影是局部不相关的。该方法在物理上是健全的,可以产生令人印象深刻的结果。然而,这种方法不能很好地处理严重的雾霾图像,在打破假设的情况下可能会失败。
  • 在本文中,我们提出了一种新的先验-暗通道先验,用于去除单幅图像的雾霾。暗通道先验是基于无雾霾户外图像的统计数据。我们发现,在大多数不覆盖天空的局部区域,通常一些像素(称为“暗像素”)在至少一种颜色(rgb)通道中具有非常低的强度。在雾霾图像中,该通道中这些暗像素的强度主要是由空气光贡献的。因此,这些暗像素可以直接提供对雾霾传输的准确估计。结合雾霾成像模型和软匹配插值方法,我们可以恢复高质量的无雾霾图像,并产生良好的深度图(最高尺度)。

与任何使用强假设的方法一样,我们的方法也有它自己的局限性。当场景对象在一个大的局部区域上与空气相似,并且没有在对象上投射阴影时,暗通道先验可能无效。 虽然我们的方法对大多数户外雾霾图像都很有效,但在一些极端情况下可能会失败。

2. Background

在计算机视觉和计算机图形学中,广泛用于描述雾霾图像形成的模型如下:在这里插入图片描述
其中I是观测到的强度,J是场景辐射,A是全球大气光,t是描述未散射到达相机的部分的介质透射。去除雾霾的目标是从I中恢复J、A和t
方程(1)右侧的第一项J(x)t(x)称为直接衰减,第二项A(1−t(x))称为空气光。直接衰减描述了场景辐射及其在介质中的衰减,而空气光是由先前的散射光产生的,并导致场景颜色的变化。当大气均匀时,传输t可以表示为:在这里插入图片描述
其中,β为大气的散射系数。这表明场景亮度随场景深度d呈指数衰减
几何上,雾霾成像方程(1)表示在RGB颜色空间中,向量A、I(x)和J(x)是共面的,它们的端点是共线的,传输t为两个线段之比:在这里插入图片描述
在这里插入图片描述
其中,c∈{r,g,b}是颜色通道索引。

3. Dark Channel Prior

暗通道先验是基于以下对无雾霾户外图像的观察:在大多数非天空斑块中,至少有一种颜色通道在某些像素处的强度非常低。换句话说,这样一个补丁的最小强度应该有一个非常低的值。在形式上,对于图像J,我们进行了定义:在这里插入图片描述
其中 J c J^c Jc J J J的颜色通道, Ω ( x ) Ω(x) Ω(x)是一个以 x x x为中心的局部补丁。我们的观察表明,除了天空区域外,如果J是一个无雾霾的户外图像,那么 J d a r k J^{dark} Jdark的强度较低,且趋于零。我们称 J d a r k J^{dark} Jdark J J J的暗通道,我们称上述统计观察或知识为暗通道。
(自认为暗通道可以理解为某目标像素的指定领域内,综合考量RGB通道的最低像素值)
暗通道中的低强度主要是由于三个因素:a)阴影。 例如,城市景观图像中汽车、建筑物和窗户内部的阴影,或景观图像中树叶、树木和岩石的阴影;b)丰富多彩的物体或表面。 例如,任何颜色通道中缺乏颜色的物体(例如,绿草/树/植物、红色或黄色的花/叶和蓝色水面)将导致黑暗通道中的低值;c)深色物体或表面。 例如,深色的树干和石头。由于自然的户外图像通常是充满了阴影和丰富多彩的,这些图像的黑暗通道真的是黑暗的!

4. Haze Removal Using Dark Channel Prior

使用黑暗通道预先去除雾霾

4.1. Estimating the Transmission

这里首先可以假设大气光A已知;在局部范围内(patch) Ω ( x ) Ω(x) Ω(x)是恒定的。我们将patch的传输表示为 t ′ ( x ) t'(x) t(x)。最小化公式(1):
在这里插入图片描述
变形:
在这里插入图片描述
然后,我们对上述公式取三个颜色通道之间的最小运算,得到:
在这里插入图片描述
根据暗通道公式,无雾霾的辐射场J应该趋向于0:
在这里插入图片描述
由于A总为正常数,所以:在这里插入图片描述
将(10)带入(8)有:
在这里插入图片描述
正如我们之前提到的,黑暗通道先验对天空区域并不是一个好的先验。幸运的是,天空的颜色通常与雾霾图像中的大气光A非常相似,我们有:在这里插入图片描述
由于天空是无限的,并且趋向于零传输,方程(11)可以优雅地处理天空区域和非天空区域。我们不需要事先分开天空区域。
此外,雾霾的存在是人类感知深度的基本线索。这种现象被称为空中透视现象。如果我们彻底去除雾霾,图像可能会看起来不自然,深度的感觉可能会消失。
因此,我们可以通过在方程中引入一个常数参数ω(0<ω≤1)来为遥远的物体保持非常少量的雾霾在这里插入图片描述

4.2. Soft Matting

用t(x)表示精确的传输图。将t(x)和t˜(x)以它们的向量形式重写为t和˜t,我们最小化以下代价函数:在这里插入图片描述
其中L为Levin提出的马丁拉普拉斯矩阵,λ为正则化参数。第一项是光滑项,第二项是数据项。
通过求解以下稀疏线性系统,可以得到最优t:
在这里插入图片描述
其中U是一个与L大小相同的单位矩阵。这里,我们在λ上设置一个小值(在我们的实验中是 1 0 − 4 10^{−4} 104),使t受到˜t的软约束。

4.3. Recovering the Scene Radiance

利用传输图,我们可以根据公式(1)恢复场景亮度。但是,当传输t(x)接近于零时,直接衰减项J(x)t(x)可以非常接近于零。直接恢复的场景辐射J容易产生噪声。因此,我们将传输t(x)限制在一个下界t0,这意味着在非常密集的雾霾区域保留了少量的雾霾。最终场景亮度J(x)恢复:
在这里插入图片描述
t0的典型值是0.1。由于场景的亮度通常不如大气光明亮,去除雾霾后的图像看起来很暗淡。因此,我们增加了J(x)的曝光率来进行显示。

4.4. Estimating the Atmospheric Light

我们可以利用暗通道来改进大气光的估计。我们首先选择暗通道中最亮的0.1%的像素。这些像素是最模糊不透明的。在这些像素中,选择输入图像I中强度最高的像素作为大气光。

CODE

代码参考:https://blog.csdn.net/wsp_1138886114/article/details/95012769

import cv2
import numpy as npdef zmMinFilterGray(src, r=7):'''最小值滤波,r是滤波器半径'''return cv2.erode(src, np.ones((2 * r + 1, 2 * r + 1)))def guidedfilter(I, p, r, eps):height, width = I.shapem_I = cv2.boxFilter(I, -1, (r, r))m_p = cv2.boxFilter(p, -1, (r, r))m_Ip = cv2.boxFilter(I * p, -1, (r, r))cov_Ip = m_Ip - m_I * m_pm_II = cv2.boxFilter(I * I, -1, (r, r))var_I = m_II - m_I * m_Ia = cov_Ip / (var_I + eps)b = m_p - a * m_Im_a = cv2.boxFilter(a, -1, (r, r))m_b = cv2.boxFilter(b, -1, (r, r))return m_a * I + m_bdef Defog(m, r, eps, w, maxV1):                 # 输入rgb图像,值范围[0,1]'''计算大气遮罩图像V1和光照值A, V1 = 1-t/A'''V1 = np.min(m, 2)                           # 得到暗通道图像Dark_Channel = zmMinFilterGray(V1, 7)cv2.imshow('20190708_Dark',Dark_Channel)    # 查看暗通道cv2.waitKey(0)cv2.destroyAllWindows()V1 = guidedfilter(V1, Dark_Channel, r, eps)  # 使用引导滤波优化bins = 2000ht = np.histogram(V1, bins)                  # 计算大气光照Ad = np.cumsum(ht[0]) / float(V1.size)for lmax in range(bins - 1, 0, -1):if d[lmax] <= 0.999:breakA = np.mean(m, 2)[V1 >= ht[1][lmax]].max()V1 = np.minimum(V1 * w, maxV1)               # 对值范围进行限制return V1, Adef deHaze(m, r=81, eps=0.001, w=0.95, maxV1=0.80, bGamma=False):Y = np.zeros(m.shape)Mask_img, A = Defog(m, r, eps, w, maxV1)             # 得到遮罩图像和大气光照for k in range(3):Y[:,:,k] = (m[:,:,k] - Mask_img)/(1-Mask_img/A)  # 颜色校正Y = np.clip(Y, 0, 1)if bGamma:Y = Y ** (np.log(0.5) / np.log(Y.mean()))       # gamma校正,默认不进行该操作return Yif __name__ == '__main__':m = deHaze(cv2.imread('fog1.jpg') / 255.0) * 255cv2.imwrite('1.jpg', m)

这篇关于《Single Image Haze Removal Using Dark Channel Prior》阅读笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/651378

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个