admin管理员组

文章数量:817295

图像视频去雨的几种主流方法

图像视频去雨的几种主流方法

对图像或者视频进行去噪的研究一直以来都是计算机视觉和图像处理领域内的一个重要课题。特别是在现实生活中,因为雨或者雪会对道路上的路况造成一定程度的遮挡,驾驶车辆行驶在下大雨或大雪的恶劣天气下是非常危险的;不仅如此,在重要位置设置的摄像头也会因为风沙雨雪的遮挡,导致无法提供给公安人员足够的信息来进行对罪犯的身份确定;人们在出去旅游的时候会拍摄很多美景的照片,但是有的照片会因为天气状况等原因无法得到清晰的效果。以上所描述的情况都需要对图像进行后期的处理,因此,对视频图像噪音去除的研究是非常有现实意义的。

一些现实生活中拍摄的含雨噪声影响了图片物体清晰度的图像如下:

        

现如今,对雨水去除的论文中,引用量比较高的,效果比较理想的主要有三种方法:

1.基于纯粹物理模型和数学推导的去雨模型。

2.基于图像处理知识的去雨方法。

3.基于稀疏编码字典学习和分类器的去雨方法。

4.基于深度卷积神经网络的深度去雨方法。

其中,第一个是基于纯物理模型的方法,模型种类繁多且涉及物理专业知识较多,这里不进行具体的介绍,后面的篇章会进行单独介绍。下面将会对其他三种方法进行讲解。

一、基于稀疏编码字典学习和分类器的去雨方法

去雨,实际上是一个将图像看作是两层:无雨层和雨水层,然后将雨水层从原图像中分离出来,留下无雨图的一个分类过程。在深度学习的领域,有很多种方法可以进行分类的操作,譬如使用全连接的神经网络(Fully Connected Network)、卷积神经网络(Convolutional Neural Network)等等。对于什么是深度学习的分类器和如何使用,请参考博客::

/?from=search&seid=2001509183641457290#page=4这里我们着重介绍稀疏编码字典学习。

首先,什么是稀疏编码?稀疏编码,实际上就是寻找一组"超完备"基向量来更高效地表示样本数据。稀疏编码算法的目的就是找到一组基向量 ,使得我们能将输入向量表示为这些基向量的线性组合。譬如一个矩阵A,它是m行n列的,它总是能够表达成两个矩阵的乘积:D*C,其中D是m行k列的,C是k行n列的。

现在我们需要得到一个非常稀疏的C和一个最小基的集合D。这里的C我们叫做稀疏编码(sparse coder),这里的D我们叫做数据字典。

那么什么叫做"稀疏"呢?顾名思义,一个矩阵,如果它有非常多个元素的值为"0",但是并不是全为零,而且这些零元素不是全部分布在一行上的,那么我们称这个矩阵是稀疏的。

那么什么是"最小基"呢?最小基是能够组成所有内容的最小组成部分。举个例子,将一张图片随机切割为一些小图片,然后从这些小图片中选一些图片,仅仅使用这些图片的倍数,就可以拼成原来的那张大图,则称这些小图片为这张大图的最小基集合,即数据字典:

其中I是原图,X1,X2代表最小基,上式的稀疏编码是:[2,0]和[0,0.1],而数据字典是[X1,X2],这里我们可以看到稀疏编码的本质其实是一个目标向量可以由少量的基向量经线性拟合而成。

为了训练得到数据字典和稀疏编码,一般分为两个过程:

(一)基向量的训练过程,也称为字典的学习。

在这个过程中,我们利用大量的训练样本,通过无监督学习方法学习获得一组冗余的基向量,这组基向量通常反映了训练样本中一些带有本质特性的基元,如图像中的边界、角点。其算法过程是:(1)首先固定U,然后算出最优的V(2)然后固定V,得到最优的U,重复执行之前的这两个步骤,直到得到最优的数据字典U,现在我们已经得到了训练后的数据字典U。

(二)接着将需要稀疏化的数据集带入公式

其中,C的一范式最小化会保证稀疏编码C朝着最稀疏的方向前进。

通过对每一个张需要表示的图片进行上述的运算后得到最优的C,则这些C就代表着每一张图片的稀疏编码。

那么为什么我们需要稀疏编码呢?稀疏编码有什么好处呢?

这里我们从两方面来进行解释:首先,在进行图像去噪或者图像分类的时候,神经网络都会首先进行对图像的特征提取,但是我们并不能规定它去提取什么特征,而是给它一个优化函数,让这个神经网络自己学习提取什么特征能够对结果影响最大,换句话说,让神经网络自己学习那些能够影响输出结果的特征。但是在这个过程中,有绝大多数的特征都是与结果无关的,神经网络在考虑了这些无关的特征后,输出的结果反而会变差,这个现象叫做过拟合(overfitting),譬如你用一个二次函数来拟合一个直线,结果反而变差了。通过稀疏编码,将原数据中很多位置的值都变成了"0",这相当于在数据方面解决了过饱和现象。另一个青睐于稀疏的理由是,模型更容易解释。例如患某种病的概率是y,然后我们收集到的数据x是1000维的,也就是我们需要寻找这1000种因素到底是怎么影响患上这种病的概率的。假设我们这个是个回归模型:y=w1*x1+w2*x2+…+w1000*x1000+b,医生对于这1000个可能影响患病的因素都需要去检测一遍,累觉不爱。

然而通过稀疏化以后,模型仅仅剩下几个因素需要考虑,医生仅仅需要检测这少数几个因素就可以得到结果,极大的方便了他们的工作。

上面介绍完了字典学习和稀疏编码,那么如何使用这个功能来进行对图像的雨水去除呢?

一般情况下,我们会将稀疏编码当作一个数据的预处理,然后将处理后的稀疏数据放入一个卷积神经网络去进行学习,卷积神经网络相关的内容将在以后详细的介绍。另外一种方法,是使用有雨的图直接进行字典学习和稀疏编码,学习的过程中,它设定了一个假设:即假设雨水和背景的特征是可分的,通过不断进行对字典和编码的优化,最终把一个图片分成一个字典的两个编码之和,这两个编码分别代表雨水的编码和背景的编码。

(Luo Y, Xu Y, Ji H. Removing Rain from a Single Image via Discriminative Sparse Coding[C]// IEEE International Conference on Computer Vision. IEEE, 2016:3397-3405.)PDF原文地址

图一:该论文的测试结果图

通过观察测试的结果,我们可以认为这样的处理方法是非常有效的。但是它有一个缺点,就是当雨水和背景是非常相似的形状时,它是没办法分离开两者的(譬如带有雨水图案的墙壁和真实的雨水)

二、基于图像处理的去雨方法

我们都知道,当雨水低落到地面后,会产生一层水雾的效果,这种效果和一般的雨水并不相同,而是类似气溶胶,会对光线造成折射的效果。下面介绍到的这一篇是基于暗通道先验信息进行去雾处理的。虽然雨水并不是雾,但是雨雾的效果跟雾是类似的,所以该论文也可以应用在去雨的范畴内。

《Single Image Haze Removal Using Dark Channel Prior》链接点击这里

首先,作者通过对图像的分析,发现了一个现象:在绝大多数非天空的局部区域里,某一些像素总会有至少一个颜色通道具有很低的值。换言之,该区域光强度的最小值是个很小的数。在这里,我们所说的颜色通道是指RGB三个颜色的通道。而且这个暗通道的数值应该是逼近于零的。

                              (1)

                      

为了验证作者提出的这个理论,作者在论文中统计了5000多张图像的特性,发现基本符合了这一特征,因此,可以认定这是一条定理。

下面是一些没有雾的暗通道效果图:

可以发现除了天空以外,实物的暗通道基本上都是趋近0的。

下面再看看有雾的图片的暗通道:

可以发现,因为雾气的存在,暗通道值会变得非常的大,导致背景被遮挡住。

上面介绍的就是这篇论文的中心思想:暗通道先验。

有了上面的知识,下面文章进行了一系列的推导,从而最终来解决问题:

首先是带雾图像的模型:

其中I(x)代表待去雾的图像,J(x)代表需要恢复的无雾图像,t(x)为透射率,A为全球大气光。其中全球大气光A代表的是由气溶胶或者其他胶粒引起的光线透射折射等效果,在这里可以认为是雾的影响。已知条件是I(x),需要求J(x),显然是一个无限解的方程,需要一些限制和先验来进行求解。

将(1)进行变形:

C表示R/G/B三个通道。假设透射率t(x)在每个图片X内是不变的常熟,接着对等式两边求两次最小值:

又因为暗通道理论:

将(8)和(9)结合,得到

这就是对透射率的预估值。

现在仅需要得到A,就可以得到t(x),从而等式(1)中的所有参数都是已知的了。

可以通过暗通道来从原始图像中计算得到A,步骤是:

1) 从暗通道图中按照亮度的大小取前0.1%的像素。

2) 在这些位置中,在原始有雾图像I中寻找对应的具有最高亮度的点的值,作为A值。

得到A之后,通过之前的(1)式既可以得到去雾后的图像。

图二:去雾前后的效果图

通过测试结果可以看到,本论文方法可以得到很好的效果,但是有一个缺点就是模型建立的太简单了,导致透射率太过粗糙。为了解决这个问题,该作者使用了导向滤波的方法求透射率,得到的结果非常好,而且速度非常快。

图三:使用导向滤波进行透射率求取

三、基于卷积神经网络的深度去雨

首先介绍一下什么是卷积神经网络(CNN):

在深度学习的浪潮中,有很多研究方向,其中卷积神经网络是图像处理和视觉领域内非常热门的研究方向,因为CNN非常善于对图像的特征进行提取,是权值共享的,极大的减少了各层中的参数,从而能够很好的避免反向传播的时候出现梯度消失的现象。

图四:一个典型的卷积神经网络

我们知道,每一层神经网络其实就是对一个输入的数据做了一个线性或者非线性的映射,类似于矩阵的乘法,每一个位置(神经元)都有一个权值,通过对输入的数据进行这样的映射后,就可以达到期望的效果。但是因为每一层都有非常多的神经元,同时神经网络可能有很多层,如果将一张2000*2000的图片传入这个神经网络,那么需要考虑的信息太多了,需要调整的参数也太多了,而且其中的一些参数对结果的影响是非常小的。所以为了解决这个问题,我们使用一个卷积核来对图像进行卷积操作。

图五:左边数输入的数据,中间是一个卷积核,右边是卷积核对输入图片的左上角进行卷积得到的结果。

其实卷积核就是一个小的正方形矩阵,其大小、移动步数以及各个点的取值都是自定义的。所谓卷积操作,就是将这个卷积核在输入数据上滑动,滑动的同时,做点积运算,得到的结果就是一次卷积的结果:

上图即是对输入数据的第一行进行卷积元算得到的结果。

其实可以把卷积核当作一个刷子,它对图片进行了一次模糊处理,去除了个别部位不重要的极端数据,而是模糊过滤出了小范围内的整体特征。随着网络结构进一步加深,卷积核矩阵提取的特征会越来越复杂,这时候特征结果人类往往理解不了,但是这是机器自己学习的,对结果影响最大的特征。

图六:当对图片进行五层的卷积后,得到的特征结果

上图可以看到,当进行到第五层卷积的时候,机器对图片中边缘上的无用信息都忽略掉了,仅仅留下了图中最独特的部分。

那么如何使用卷积神经网络来进行去雨的操作呢?

我们知道,对于一个深度学习来说,最主要的是三个步骤:

(一)模型:所谓模型的建立,就是如何对输入数据进行函数映射,得到需要的结果。在这里,一个卷积神经网络即是一个模型。

(二)损失函数:对于损失函数我们该如何确定呢,要知道其实损失函数就是一个强迫神经网络向着预期的结果方向进行学习的约束,现在我们手上有一张相同物体的无雨图和有雨图,我们希望这张有雨的图通过神经网络处理后输出的结果无限的逼近无雨的图。

(三)优化:反向传播后更新权值:

反向传播是一个链式法则的使用,现在热门的深度学习语言tensorFlow和pytorch都已经把反向传播权值更新这一优化步骤封装成一个函数了,可以无脑直接使用,但是具体的推导步骤和反向传播在神经网络中的具体计算方法,那就另外再谈了。

所以现在利用卷积神经网络进行去雨的操作就变成了这样:

不断的重复上述2,3步骤,直到权值变化为0或者小于一个阀值。

在这篇论文中,作者使用这种方法进行了实验:点击这里:

Fu X, Huang J, Ding X, et al. Clearing the Skies: A deep network architecture for single-image rain streaks removal[J]. IEEE Transactions on Image Processing, 2016, PP(99):1-1.

图七:有雨图和经过CNN的去雨图

作者发现,仅仅经过CNN并不能得到非常理想的结果,缩进后发现雨水的细纹仍然没有去掉。原因是作者的神经网络不够复杂,造成了函数欠拟合(under -fitting)的情况。

自然而然的,我们会考虑建立一个更加复杂的模型来增加神经网络的适用性。一般来说有两种方法:1.通过增加隐含层(hidden layers)来增加神经网络的深度,一般情况下,增加深度可以使网络获取更加深层次的特征,但是去雨是一个低等级的图像处理任务,不需要获取深度的图形特征,所以没有必要增加隐含层,而且增加隐含层容易导致梯度归零,从而导致结果坏掉,所以这里文章没有采取这样的方法。

图八:可以看到,在增加深度后,结果反而变差了

另一种方法是不增加隐含层,而是在每一层中增加神经元的数量。然而这么做需要更多的训练集进行训练、更加耗时,并且很容易造成over-fitting的情况。

为了解决这个问题,文章采取了使用"detail image"来进行训练的方式。

通过一个low-pass filter(来自论文:K. He, J. Sun, and X. Tang, "Guided image filtering," IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 35, no. 6, pp. 1397– 1409, 2013.),我们可以得到一个base图像,这个base图像有一个特征:无雨图和有雨图在经过low-pass filter后产生的base image是相似的。

即:

即:将原图与base图相减后得到的图像就是detail图。

因为base图是相似的,所以我们可以仅仅训练detial图,然后将训练后的detail图加上 base图即可得到较好的结果。

原因是当原图中去除base图的部分后,发现剩下的detial图是是非常稀疏的。

稀疏的训练集可以让卷积神经网络更容易、更快的收敛。所以使用这样的方法是有效且合理的。

接着训练神经网络,结构如下:

图九:神经网络的结构

其中,有两层卷积神经网络,还有一层全连接网络。

我们需要卷积神经网络来进行feature extracting, 通过全连接网络来进行Reconstruction. 这些结构和一般的CNN相似。

在多次训练后得到输出,接着我们可以直接将输出与base图相加。

从而得到去雨后的效果图。

图十:处理后的结果

在对结果的分析中发现,该图很好的去掉了雨的线条,但是针对雨雾的处理并不是很理想,为了解决这个问题,该作者使用了一些增强对比度的算法,当然也可以在建模的过程中考虑到雨雾的影响,这样最后就可以得到一个比较良好的结果。

 

本文转载修改自

本文标签: 图像视频去雨的几种主流方法