图像处理的降噪处理

2018-01-05 16:14:16 qq_26499769 阅读数 13647

图像降噪,是最简单也是最基础的图像处理逆问题(inverse problem)。


大多数情况下,图像降噪都是ill-posed的问题。因为通过有噪音的观察,总是无法逆向求得唯一正确的干净图片。就好像让你解一个超越方程一样,不借助其他额外的条件信息,是没有唯一解的。


降噪问题(这里只讨论additive noise),用最简单的数学语言一句话就可以描述清楚:

y = x + e


y是你观察到的带噪音的图像,e是噪音,x是干净无噪音的图像。只已知y,外加e的概率分布,降噪问题需要你去寻找最接近真实值的x。


说起来降噪问题如此简单明了,但自从信号处理开宗立派起,研究人员一直在孜孜不倦地提出各种降噪算法。我最早也没搞懂,大家何必纠结于这么简单的问题,而不去考虑更复杂,更贴近实际的花哨应用?


然而世间万物的规律,万变不离其中:不管多复杂问题,其本质往往都有简单的起源。而看似简单的问题,往往却是高手一身修行的追求:就好像考察一个书法家功力,看他写一个永字就好;看一个川菜厨师功力,看他做一道开水白菜就好。


科研之道和其他道也类似,简单的任务见到的是这个approach的潜力:这仅仅是起点,而不是终点。一个好的科研者应该要着眼于起点,追求问题的本源,然后拓展到未来,此为道。只追求花哨的应用,拼凑堆叠,舍本求末甚至本末倒置,只能为术。


好吧,扯远了。我就是想说,图像降噪问题,最简单也最困难。


那么要怎么解好这个逆问题呢?


降噪的本质,是要从观测值中分离噪音,保留图像。算法的关键,是要掌握并借助于图像本身独特的性质和结构。具体用什么性质,这个流派就多了,我在这里就先提供一个不完全总结,关于近期的一些好的图像降噪算法。


根据算法利用了什么图像性质,或者用到的手段,我大概把各种算法分成如下几类:

  1. 滤波类
  2. 稀疏表达类
  3. 外部先验
  4. 聚类低秩
  5. 深度学习


我根据我的了解,对于每一个类比总结了一个常见算法列表。


入选的算法要满足:1.近期(05年以后)提出的算法,2.有可复现的代码提供,3.可以得到很好,或者接近state-of-the-art的效果。


由于我的水平有限,希望同行高手来帮这个public repo添砖加瓦。


以下是可复现的图像降噪算法列表,包含了简要的算法介绍,若想了解算法详情,可在该链接中查看:https://github.com/wenbihan/reproducible-image-denoising-state-of-the-art


Filter
  • NLM

A non-local algorithm for e denoising (CVPR 05), Buades et al.

  • BM3D

Image restoration by sparse 3D transform-domain collaborative filtering (SPIE Electronic Imaging 2008), Dabov et al.

  • PID

Progressive Image Denoising (TIP 2014), C. Knaus et al.


Sparse Coding
  • KSVD

Image Denoising Via Sparse and Redundant Representations Over Learned Dictionaries (TIP 2006), Elad et al.

  • LSSC

Non-local Sparse Models for Image Restoration (ICCV 2009), Mairal et al.

  • NCSR

Nonlocally Centralized Sparse Representation for Image Restoration (TIP 2012), Dong et al.

  • OCTOBOS

Structured Overcomplete Sparsifying Transform Learning with Convergence Guarantees and Applications (IJCV 2015), Wen et al.

  • GSR

Group-based Sparse Representation for Image Restoration (TIP 2014), Zhang et al.


Effective Prior
  • EPLL

From Learning Models of Natural Image Patches to Whole Image Restoration (ICCV2011), Zoran et al.

  • GHP

Texture Enhanced Image Denoising via Gradient Histogram Preservation (CVPR2013), Zuo et al.

  • PGPD

Patch Group Based Nonlocal Self-Similarity Prior Learning for Image Denoising (ICCV 2015), Xu et al.

  • PCLR

External Patch Prior Guided Internal Clustering for Image Denoising (ICCV 2015), Chen et al.


Low Rank
  • SAIST

Nonlocal image restoration with bilateral variance estimation: a low-rank approach (TIP2013), Dong et al.

  • WNNM

Weighted Nuclear Norm Minimization with Application to Image Denoising (CVPR2014), Gu et al.

  • Multi-channel Weighted Nuclear Norm

Multi-channel Weighted Nuclear Norm Minimization for Real Color Image Denoising (ICCV 2017), Xu et al.


Deep Learning
  • SF

Shrinkage Fields for Effective Image Restoration (CVPR 2014), Schmidt et al.

  • TNRD

Trainable nonlinear reaction diffusion: A flexible framework for fast and effective image restoration (TPAMI 2016), Chen et al.

  • DnCNN

Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising (TIP2017), Zhang et al.


Combined with High-Level Tasks
  • Meets High-level Tasks

When Image Denoising Meets High-Level Vision Tasks: A Deep Learning Approach (Arxiv2017), Ding Liu, Bihan Wen, Xianming Liu, Thomas S. Huang.


Benchmark
  • Darmstadt

Benchmarking Denoising Algorithms with Real Photographs (CVPR 2017), Tobias Plotz, Stefan Roth.


下面对于这几类算法的一些简略地解释:


滤波类:相对比较传统的一类算法,通过设计滤波器对图像进行处理。特点是速度往往比较快,很多卷积滤波可以借助快速傅里叶变化来加速。近期的一些算法例如BM3D也结合了一些block matching来利用图片的self-similarity,达到了很棒的效果。


稀疏表达类:自然图片之所以看起来不同于随机噪音/人造结构,是因为大家发现他们总会在某一个模型(synthesis model或者analysis model)下存在稀疏表达。而我们想排除的噪音往往无法被稀疏化。基于这个判别式模型(discriminative model),用稀疏性来约束自然图像,在很多逆问题里取得了拔群的效果。


外部先验(external prior):如果从有噪音的图片本身无法找到规律,我们也可以借助其他类似但又没有噪音的图片,来总结图片具有的固有属性。这一类方法利用的外部图片来创造先验条件,然后用于约束需要预测的图片。最有代表性的工作,就是混合高斯模型(Gaussian Mixture Model)。严格来说,基于深度学习的算法也可以归于这个类。


聚类低秩(Low-Rankness):除了可稀疏性,低秩性也是自然图片常见的一个特性。数学上,可稀疏表达的数据可以被认为是在Union of low-dimensional subspaces;而低秩数据则是直接存在于一个Low-dimensional subspace。这个更严格的限制往往也可以取得很好的降噪效果。


深度学习(Deep Learning):这类可以归于外部先验的子类,但由于近期大热,我单独拿出来说说。如果说解决逆问题的关键,是寻找一个好的图像约束器(regularizer),那么我们为什么不用一个最好的约束器?深度学习方法的精髓,就在于通过大量的数据,学习得到一个高复杂度(多层网络结构)的图片约束器,从而将学习外部先验条件这一途径推到极限。近期的很多这类工作,都是沿着这一思路,取得了非常逆天的效果。


根据我的经验,基本上主流的图像降噪算法,都可以被放到这上面的5种类型中。 


具体论文下载和代码见:https://github.com/clxiao/Image-Denoising-State-of-the-art

2019-10-24 21:55:33 wujuxKkoolerter 阅读数 350

图像降噪-平滑滤波-多图像平均法

如果一幅图像包含加性噪声,这些噪声对每个坐标点不是相关的,并且其平均值为零,这种情况下就可以采用多图像平均法来达到去掉噪声的目的。其数学表达式如下:
g(x,y)=f(x,y)+n(x,y)(3-1) g(x,y) = f(x,y) + n(x,y) \tag{3-1}

其中,f(x,y)f(x,y)为原图像,n(x,y)n(x,y)为噪声。

计算平均图像的计算表达如下:

g(x,y)=1Mj=1Mgj(x,y) \overline{g}(x,y) = \frac{1}{M}\sum_{j=1}^M{g_j(x,y)}

Python代码实现如下

def image_average(src,M=100):
    dst = np.zeros_like(src).astype(np.float32)
    for i in range(M):
        dst += np.float32(noise_salt_and_pepper(src))
    dst = dst / M
    dst = np.clip(dst,0,255).astype(np.uint8)
    return dst

2019-12-23 15:48:36 weixin_39504171 阅读数 660

图像处理18:传统图像降噪算法综述

        图像预处理算法的好坏直接关系到后续图像处理的效果,如图像分割、目标识别、边缘提取等,为了获取高质量的数字图像,很多时候都需要对图像进行降噪处理,尽可能的保持原始信息完整性(即主要特征)的同时,又能够去除信号中无用的信息。

        并且,降噪还引出了一个非常热门的研究方向,即美颜磨皮,这对于中国用户来说,是非常重要的计算机视觉领域,今天就来认真讲讲传统的图像降噪算法。

1.图像降噪算法分类:

        虽然各种图像降噪算法犹如雨后春笋般不断新增,然而很多方法都存在一个通用的缺点,就是在降噪的同时往往会丢失图像的细节或边缘信息。

        一般的图像处理,微小的细节对图像降噪的后续处理程序影响不太明显,但是当处理对象为医学图像时,这样的小失误是不被允许的,因为在医疗诊断或治疗中,每一个微小的失误都会影响医师的治疗方法甚至威胁到患者的生命。这就要求更多的研究者来投入时间和精力研究新的降噪技术,以达到降噪并同时仍能保留足够细节信息的目的。

        目前常用的图像去噪算法大体上可非为两类,即空域像素特征去噪算法和变换域去噪算法。前者是直接地在图像空间中进行的处理,后者是间接地在图像变换域中进行处理。

        1.1 空域像素特征去噪算法 :

             首先说明一点就是在信号处理教科书中,虽然介绍过很多经典的图像去噪方法,但主要都是针对随机噪声的,对于sensor缺陷导致的一些脉冲噪声(impulse noise)这里我们不考虑。

             那么什么是随机噪声呢?相比于图像的真实信号来说随机噪声就是一种或高或低呈现出不确定变化的一种信号,如下图所示虚线代表真实信号,红蓝线表示的就是随机噪声信号,所有的随机噪声信号求和后结果为0。

             由于这个零和特点,目前几乎所有的空域降噪算法都是基于这个理论为出发点来进行降噪处理的。

             基于空域像素特征的方法,是通过分析在一定大小的窗口内,中心像素与其他相邻像素之间在灰度空间的直接联系,来获取新的中心像素值的方法,因此往往都会存在一个典型的输入参数,即滤波半径r。此滤波半径可能被用于在该局部窗口内计算像素的相似性,也可能是一些高斯或拉普拉斯算子的计算窗口。在邻域滤波方法里面,最具有代表性的滤波方法有以下几种:

                (1) 算术均值滤波与高斯滤波:

                     算术均值滤波用像素邻域的平均灰度来代替像素值,适用于脉冲噪声,因为脉冲噪声的灰度级一般与周围像素的灰度级不相关,而且亮度高出其他像素许多。

                     均值滤波结果A'(i,j)随着L(滤波半径)取值的增大而变得越来越模糊,图像对比度越来越小。经过均值处理之后,噪声部分被弱化到周围像素点上,所得到的结果是噪声幅度减小,但是噪声点的颗粒面积同时变大,所以污染面积反而增大。为了解决这个问题,可以通过设定阈值,比较噪声和邻域像素灰度,只有当差值超过一定阈值时,才被认为是噪声。不过阈值的设置需要考虑图像的总体特性和噪声特性,进行统计分析。自适应均值滤波算法通过方向差分来寻找噪声像素,从而赋予噪声像素与非噪声像素不同的权重,并自适应地寻找最优窗口大小,优于一般的均值滤波方法。

                     高斯滤波矩阵的权值,随着与中心像素点的距离增加,而呈现高斯衰减的变换特性。这样的好处在于,离算子中心很远的像素点的作用很小,从而能在一定程度上保持图像的边缘特征。通过调节高斯平滑参数,可以在图像特征过分模糊和欠平滑之间取得折中。与均值滤波一样,高斯平滑滤波的尺度因子越大,结果越平滑,但由于其权重考虑了与中心像素的距离,因此是更优的对邻域像素进行加权的滤波算法。

                (2) 统计中值滤波:

                     中值滤波首先确定一个滤波窗口及位置(通常含有奇数个像素),然后将窗口内的像素值按灰度大小进行排序,最后取其中位数代替原窗口中心的像素值(如下图)。

                     但当噪声像素个数大于窗口像素总数的一半时,由于灰度排序的中间值仍为噪声像素灰度值,因为滤波效果很差。此时如果增加窗口尺寸,会使得原边缘像素被其他区域像素代替的几率增加,图像更容易变模糊,并且运算量也大大增加。

                     无论是中值滤波还是加权滤波,两者受窗口的尺寸大小影响非常大。一种对中值滤波的改进是自适应中值滤波,它首先判断窗口内部的中心像素是否是一个脉冲,如果不是,则输出标准中值滤波的结果;如果是,则通过继续增大窗口滤波尺寸来寻找非脉冲的中值,因此该方法相比较原始的统计中值滤波器,在保持清晰度和细节方面更优。

                (3) 双边滤波:

                     这是一种非线性的保边滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。双边滤波器之所以可以达到保边去噪的效果,是因为滤波器是由两个函数构成。一个函数是由几何空间距离决定滤波器系数。另一个由像素差值决定滤波器系数。双边滤波器中,输出像素的值g(i,j)依赖于邻域像素的值的加权组合:

                     上图中权重系数w(i,j)取决于空域核和值域核的乘积。其中空域滤波器对空间上邻近的点进行加权平均,加权系数随着距离的增加而减少。值域滤波器则是对像素值相近的点进行加权平均,加权系数随着值差的增大而减少。

                (4) 引导滤波(guided filter):

                     高斯滤波等线性滤波算法所用的核函数相对于待处理的图像是独立无关的,这里的独立无关也就意味着,对任意图像都是采用相同的操作。

                     引导滤波就是在滤波过程中加入引导图像中的信息,这里的引导图可以是单独的图像也可以是输入图像,当引导图为输入图像时,引导滤波就成为了一个可以保持边缘的去噪滤波操作。我们来看一下具体算法原理:

                     第一步:假设该引导滤波函数的输出与输入在一个二维窗口内满足线性关系,如下:

                     其中,q是输出像素的值,即p去除噪声或者纹理之后的图像,ni表示噪声,I是输入图像的值,i和k是像素索引,a和b是当窗口中心位于k时该线性函数的系数。(当引导图为输入图像时,引导滤波就成为一个保持边缘的滤波操作,即 I= p,对上示两边取梯度可得q'=aI',即当输入图I有梯度时,输出q也有类似的梯度,这也就可以解释为什么引导滤波有边缘保持特性了。

                     第二步:求出线性函数的系数,也就是线性回归,即希望拟合函数的输出值q与真实值p之间的差距最小,转化为下面但最优化问题,也就是让下式最小:

                     在这里,μk和σk^2表示I在局部窗口wk中的均值和方差。 |ω|是窗口内的所有像素数,pk表示p在窗口wk中的均值,ϵ就是规整化参数,当I=p时,上面第二个公式即可简化为:

                     如果ϵ=0,显然a=1, b=0是E(a,b)为最小值的解,从上式可以看出,这时的滤波器没有任何作用,将输入原封不动的输出。

                     如果ϵ>0,在像素强度变化小的区域(方差不大),即图像I在窗口wk中基本保持固定,此时有σ2k<<ϵ,于是有ak≈0和bk≈μk,即做了一个加权均值滤波,而在高方差区域,即表示图像I在窗口wk中变化比较大,此时我们有σ2k>>ϵ,于是有ak≈1和bk≈0,对图像的滤波效果很弱,有助于保持边缘。

                     在窗口大小不变的情况下,随着ϵ的增大,滤波效果越明显。

                     第三步:在计算每个窗口的线性系数时,我们可以发现一个像素会被多个窗口包含,也就是说,每个像素都由多个线性函数所描述。因此,如之前所说,要具体求某一点的输出值qi时,只需将所有包含该点的线性函数值平均即可,如下:

                     其中,输出值q又与两个均值有关,分别为a和b在窗口w中的均值,我们将上一步得到两个图像ak和bk都进行盒式滤波,得到两个新图:ai'和bi'。然后用ai'乘以引导图像Ii,再加上bi',即得最终滤波之后的输出图像q。

                (5) NLM(Non-Local means)算法:

                      前面基于邻域像素的滤波方法,基本上只考虑了有限窗口范围内的像素灰度值信息,没有考虑该窗口范围内像素的统计信息如方差,也没有考虑整个图像的像素分布特性,和噪声的先验知识。

                      针对其局限性,NLM算法被提出,该算法使用自然图像中普遍存在的冗余信息来去噪声。与常用的双线性滤波、中值滤波等利用图像局部信息来滤波不同的是,它利用了整幅图像来进行去噪,以图像块为单位在图像中寻找相似区域,再对这些区域求平均,能够比较好地去掉图像中存在的高斯噪声。这里我直接拿图来说可能会更能说明问题:

                      如上图所示,其中p为去噪的点,从图中看出q1和q2的邻域与p相似,所以权重和比较大,而q3因为与q邻域相差比较大所以赋予的权重值就很小。NLM就是将一幅图像中所有点的权重都表示出来,那就得到下面这些权重图:

                      上面权值图像中,左边是原图,中心的白色色块代表了像素  块邻域,右边是计算出来的权重图,权重范围从0(黑色)到1(白色)。

                      这个块邻域在整幅图像中移动,计算图像中其他区域跟这个块的相似度,相似度越高,得到的权重越大。最后将这些相似的像素值根据归一化之后的权重加权求和,得到的就是去噪之后的图像了。

                      由于原始NLM方法需要用图像中所有的像素来估计每一个像素的值,因此计算量非常大,研究者不断对该方法进行了几点改进。

                        (a) 采用一定的搜索窗口代替所有的像素,使用相似度阈值,对于相似度低于某一阈值的像素,不加入到权重的计算(即不考虑其相对影响,这些都可以降低计算复杂度。

                        (b)使用块之间的显著特征,如纹理特征等代替灰度值的欧氏距离来计算相似度,在计算上更加有优势,应用上也更加灵活。

                      除了上面所说的方法,还有如加权最小二乘法(WLS),变分法(TV)等滤波算法,并且上面的这些算法都产生出了非常多的变种,篇幅有限不再一一详述,可以参考文献【1】。

        1.2 变换域去噪算法 :

             空域去噪都是从空间的角度去思考如何去噪,也就是所谓的spatial noise reduction,这条路子能想的方法也都做得差不多了,于是有人就换个角度想问题,就有了变换域做去噪的方法。通过数学变换,在变换域上把信号和噪声分离,然后把噪声过滤掉,剩下的就是信号。如下图没有噪声的信号就比较顺滑没有杂质。

             而下图中含有噪声的信号就会显得参差不齐,毛刺较多。而如果我们可以将噪声变换一个域后设定一个阈值将高于阈值的部分去掉,再反变换后剩下的就是干净的信号了。

             因此图像变换域去噪算法的基本思想其实就是首先进行某种变换,将图像从空间域转换到变换域,然后从频率上把噪声分为高中低频噪声,用这种变换域的方法就可以把不同频率的噪声分离,之后进行反变换将图像从变换域转换到原始空间域,最终达到去除图像噪声的目的。

             图像从空间域转换到变换域的方法很多,其中最具代表性的有傅里叶变换、离散余弦变换、小波变换以及多尺度几何分析方法等。

             其中基于小波萎缩法是目前研究最为广泛的方法,小波萎缩法又分成如下两类:第1类是阈值萎缩,由于阈值萎缩主要基于如下事实,即比较大的小波系数一般都是以实际信号为主,而比较小的系数则很大程度是噪声。因此可通过设定合适的阈值,首先将小于阈值的系数置零,而保留大于阈值的小波系数;然后经过阈值函数映射得到估计系数;最后对估计系数进行逆变换,就可以实现去噪和重建;而另外一种萎缩方法则不同,它是通过判断系数被噪声污染的程度,并为这种程度引入各种度量方法(例如概率和隶属度等),进而确定萎缩的比例,所以这种萎缩方法又被称为比例萎缩。

        1.3 BM3D去噪算法 :

                空域中NLM算法和变换域中小波萎缩法效果都很好,一个很自然的想法就是是否可以将两者相结合呢?是的,BM3D就是融合了spatial denoise和tranform denoise,从而可以得到最高的峰值信噪比。它先吸取了NLM中的计算相似块的方法,然后又融合了小波变换域去噪的方法。我们来看一下具体算法流程如下图:

                BM3D算法总共有两大步骤,分为基础估计(Step1)和最终估计(Step2)。在这两大步中,分别又有三小步:相似块分组,协同滤波和聚合。

                Step1:基础估计:

                        (1) 相似块分组:首先在噪声图像中选择一些大小的参照块(考虑到算法复杂度,不用每个像素点都选参照块,通常隔3个像素为一个步长进行选取,复杂度降到1/9),在参照块的周围适当大小区域内进行搜索,寻找若干个差异度最小的块,并把这些块整合成一个3维的矩阵。

                        (2) 协同滤波:形成若干个三维的矩阵之后,首先将每个三维矩阵中的二维的块(即噪声图中的某个块)进行二维变换,可采用小波变换或DCT变换等。二维变换结束后,在矩阵的第三个维度进行一维变换,变换完成后对三维矩阵进行硬阈值处理,将小于阈值的系数置0,然后通过在第三维的一维反变换和二维反变换得到处理后的图像块。

                        (3) 聚合:此时,每个二维块都是对去噪图像的估计。这一步分别将这些块融合到原来的位置,每个像素的灰度值通过每个对应位置的块的值加权平均,权重取决于置0的个数和噪声强度。

                Step2:最终估计:

                        具体的步骤从流程图可看出和Step1基本一样,不同的有两处:

                        一处是聚合过程将会得到两个三维数组:噪声图形成的三维矩阵和基础估计结果的三维矩阵。

                        另一处是协同滤波中用维纳滤波(Wiener Filtering)代替了硬阈值处理。

 

2.滤波器抑制噪声比较:

        对图像进行滤波去噪的算法其实就是一个加权平均的运算过程,滤波后图像中的每个像素点都是由其原图像中该点邻域内多个像素点值得加权平均,不同的滤波器最根本的差异就是权值不同。另外根据噪声的不同,滤波效果也各有不同。

        均值滤波处理会噪声部分被弱化到周围像素点上,所得到的结果是噪声幅度减小,但是噪声点的颗粒面积同时变大,所以污染面积反而增大。

        高斯滤波器用像素邻域的加权均值来代替该点的像素值,而每一邻域像素点权值是随该点与中心点的距离单调增减的.这一性质是很重要的,因为边缘是一种图像局部特征,如果平滑运算对离算子中心很远的像素点仍然有很大作用,则平滑运算会使图像失真,因此缺点是权重完全取决于图像像素之间欧氏距离,与图像的内容没有关系。

        中值滤波适用于椒盐噪声和脉冲噪声。因为对于受脉冲噪声和椒盐噪声污染的图像,相应位置的图像灰度发生了跳变,是不连续的,而此处的中值滤波正是一种非线性滤波方法,对这些类型的随机噪声,它比相同尺寸的线性平滑滤波器引起的模糊更少,能较好的保持边缘,但会使图像中的小目标丢失,因此对点、线和尖顶多的图像不宜采用中值滤波。

        双边滤波器的好处是可以做边缘保存,一般过去用的维纳滤波或者高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波顾名思义比高斯滤波多了一个高斯方差,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多的影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波因此,双边滤波器即平滑滤波了图像,又保持的图像边缘。虽然去噪效果很明显,但很多细节被去除,只有整体形状被保留,不过美颜相机磨皮恰恰就需要这种算法(如下图美女磨皮后的效果)。

        引导滤波不像高斯滤波等线性滤波算法所用的核函数相对于待处理的图像是独立无关的,而是在滤波过程中加入了引导图像中(去噪时用的就是图像本身)的信息,所以引导滤波本质上就是通过一张引导图I,对初始图像p(输入图像)进行滤波处理,使得最后的输出图像大体上与初始图像P相似,但是纹理部分与引导图I相似。在滤波效果上,引导滤波和双边滤波差不多,在一些细节上,引导滤波较好。

        引导滤波最大的优势在于能够保持线性复杂度,每个像素虽然由多个窗口包含,求某一点像素值的具体输出值时,只需将包含该点所有的线性函数值平均即可,而双边滤波不是线性复杂度在于他考虑了每个点的几何差距与强度差距两个因素,当处理图像较大时,运算量很明显会增大很多。

        非局部算法获得的信噪比比双边滤波略高,有时候还不如双边滤波。但是,非局部滤波是一种基于快的匹配度来计算滤波权值的,所以能获得比较好的视觉效果。然而,它的计算复杂度实在是太高了。最原始非局部均值算法是在整个图片中进行块搜索,根据块的匹配度来计算权值。实际执行过程,都会把搜索区域限定在一个局部的搜索窗口中。

        BM3D算法是目前传统算法中效果最好的去噪算法,相比于NLM噪声更少,图像细节恢复更多,但算法复杂度实在太高,除非解决计算性能问题,不然至少工业界是无法容忍几分钟的处理时间进行降噪处理。

3.总结:

        图像去噪难点在于区别高频信号(如纹理、边缘)和噪声,去噪常用思想是利用图像的相似性。空域去噪是认为相近的点相似,通过平滑可以降低随机性的噪声,效果较好的去噪方法大多是多种方法结合,既能很好地保持边缘信息,又能去除图像中的噪声,比如将中值滤波和小波滤波结合起来进行滤波。

        基本上传统的去噪算法都是从噪音图像中找出规律后再进行相对应的去噪处理。那么如果从有噪音的图片本身无法找到规律,我们是否也可以借助其他类似但又没有噪音的图片,来总结图片具有的固有属性呢?

        深度学习方法是数据驱动的方法,在仿真图像去噪上,数据(也就是干净图像)是非常充足的,所以当前深度学习方法在高斯白噪声假设条件下的滤波问题中已经达到甚至超过BM3D算法。

        深度学习的发展水平如何,就等待我们下一期文章吧。

[1] 龙鹏. MRI医学图像增强与分割新方法[D]. 中国科学院大学, 2015.


————————————————
版权声明:本文为CSDN博主「言有三」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hacker_long/article/details/85239638

2020-03-11 10:51:01 xcjlk 阅读数 767

1.噪声

1.1噪声分类
噪声是图像干扰的重要原因。一幅图像在实际应用中可能存在各种各样的噪声,这些噪声可能在传输中产生,也可能在量化等处理中产生。
根据噪声和信号的关系可将其分为三种形式:(f(x,y)表示给定原始图像,g(x,y)表示图像信号,n(x,y)表示噪声。)
1)加性噪声,此类噪声与输入图像信号无关,含噪图像可表示为f(x,y)=g(x,y)+ n(x,y),信道噪声及光导摄像管的摄像机扫描图像时产生的噪声就属这类噪声。
2)乘性噪声,此类噪声 与图像信号有关,含噪图像可表示为f(x,y)=g(x,y)+ n(x,y)g(x,y),飞点扫描器扛描图像时的噪声,电视图像中的相干噪声,胶片中的颗粒噪声就属于此类噪声。
3)量化噪声,此类噪声 与输入图像信号无关,是量化过程存在量化误差,再反映到接收端而产生。
1.2椒盐噪声
椒盐噪声是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声往往由图像切割弓|起。去除脉冲干扰及椒盐噪声最常用的算法是中值滤波。
路面图像属于结构光图像,使用区域分割技术中的阈值分割法消除白噪声及部分椒盐噪声,而不能使用中值滤波对白噪声及椒盐噪声进行滤波,因为滤波模板在图像中漫游时会改变光条中像素的真实灰度分布,给随后的重心法细化过程带来负面影响。
大量的实验研究发现,由摄像机拍摄得到的图像受离散的脉冲、椒盐噪声和零均值的高斯噪声的影响较严重。噪声给图像处理带来很多困难,对图像分割、特征提取、图像识别等具有直接影响。因此,实时采集的图像需进行滤波处理。消除图像中的噪声成份叫做图像的平滑化或滤波操作。
噪声是指两种噪声,一 种是盐噪声( salt noise ) ,另一种是胡椒噪声( pepper noise )。盐=白色,椒=黑色。前者是高灰度噪声,后者属于低灰度噪声。椒盐噪声同时出现,呈现在图像上就是黑白杂点。
噪声类型是 ‘salt & pepper’ 一定注意空格的位置 这里比较严格。当噪声类型是’salt & pepper’的时候,第三个参数的意思是噪声密度,比如0.1,那么总像素个数的10%为黑白点,当然是黑点还是白点都是随机的。
在这里插入图片描述

I=imread('下载.jpg');
G=rgb2gray(I);
J = imnoise(G,'salt & pepper',0.05);
J1= imnoise(G,'salt & pepper',0.05);
J2= imnoise(G,'salt & pepper',0.05);
[M,N]=size(J);
for i=1:M
for j=1:N
if(J1(i,j)==255)
J1(i,j)=0;
else
J1(i,j)=J1(i,j);
end
end
end
for i=1:M
for j=1:N
if(J2(i,j)==0)
J2(i,j)=255;
else
J2(i,j)=J2(i,j);
end
end
end
A= meshgrid(1:3, 1:3);
A1= meshgrid(1:5, 1:5);
A2= meshgrid(1:8, 1:8);
figure(1)
subplot(221);imshow(G);title('原始灰度图像');
subplot(222);imshow(J);title('添加椒盐噪声图像');
subplot(223);imshow(J1);title('添加胡椒噪声图像');
subplot(224);imshow(J2);title('添加盐噪声图像');

在这里插入图片描述

t=imread('下载.jpg');
subplot(1,4,1),imshow(t),title('原图');
t1=imnoise(t,'salt & pepper',0.1);
subplot(1,4,2),imshow(t1),title('加入噪声密度:0.1的椒盐噪声');
t2=imnoise(t,'salt & pepper',0.2);
subplot(1,4,3),imshow(t2),title('加入噪声密度:0.2的椒盐噪声');
t3=imnoise(t,'salt & pepper',0.3);
subplot(1,4,4),imshow(t3),title('加入噪声密度:0.3的椒盐噪声');

3.图像降噪处理方法

3.1中值滤波
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。但在条纹中心分析方法中作用不大。
实现方法
(1)通过从图像中的某个采样窗口取出奇数个数据进行排序;
(2)用排序后的中值取代要处理的数据即可。
实际应用
中值滤波法对消除椒盐噪声非常有效,在光学测量条纹图象的相位分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大。中值滤波在图像处理中,常用于保护边缘信息,是经典的平滑噪声的方法。
中值滤波器将受干扰的像素值替换为模板区域的中值,同时它可以保护图像尖锐的边缘,且比相同尺寸的线性平滑滤波器引起的模糊更少,消除脉冲噪声的效果较好。
在这里插入图片描述

I=imread('下载.jpg');
G=rgb2gray(I);
J = imnoise(G,'salt & pepper',0.05);subplot(221),imshow(I);title('原图像');
subplot(222),imshow(J);title('添加椒盐噪声图像');
k1=medfilt2(J);
 subplot(223),imshow(k1);title('3*3模板中值滤波');

3.2最大值与最小值滤波
最大值滤波,即以模板内进行有序排列后最大像素值代替中心像素值,可以去除图像中的暗斑,使亮斑增大。
最小值滤波,即以模板内进行有序排列后最小像素值代替中心像素值,可以去除图像中的亮斑,使暗斑增大。
利用最大值滤波器对胡椒噪声进行处理,成功消除了胡椒噪声,但应注意到,它同时也从黑色物体的边缘移走了一些黑色像素。
利用最小值滤波器对盐噪声进行处理,在这种情况下,最小值滤波器比最大值滤波器效果更好,但它也从亮物体边缘移走了一些白色像素,使亮物体变小,暗物体变大,这是因为围绕着这些物体的白点被设置成了暗灰度级。

%%%%%%------------------图像复原之空间滤波---------------------------------
%读入图像,并转换为double型
I=imread('下载.jpg');G=rgb2gray(I);
J = imnoise(G,'salt & pepper',0.05);subplot(221),imshow(I);title('原图像');
subplot(222),imshow(J);title('添加椒盐噪声图像');
I_D=im2double(J);
[MM,NN]=size(I_D);
 
%%%%%----------------------2、顺序统计滤波器-------------------------------
%%======================= 2.2 最大值或最小值滤波器=========================
%最大值滤波适合处理带有“胡椒噪声”的图像
%最小值滤波器适合处理带有“盐”噪声的图像
%定义子窗口的尺寸
m=3;
n=3;
%确定要扩展的行列数
len_m=floor(m/2);
len_n=floor(n/2);
%将原始图像进行扩展,这里采用了镜像扩展,以进行图像边缘计算
I_D_pad=padarray(I_D,[len_m,len_n],'symmetric');
%获得扩展后的图像尺寸
[M,N]=size(I_D_pad);
J_Max=zeros(MM,NN);
%J_Min=zeros(MM,NN);
%逐点计算子窗口的最大/最小值
for i=1+len_m:M-len_m
    for j=1+len_n:N-len_n
        %从扩展图像中取出子图像
        Block=I_D_pad(i-len_m:i+len_m,j-len_n:j+len_n);
        %最大值滤波        
        J_Max(i-len_m,j-len_n)=max(max(Block));
        %最小值滤波        
         J_Min(i-len_m,j-len_n)=min(min(Block));        
    end
end
subplot(223),imshow(J_Max);
title('最大值滤波器');
subplot(224),imshow(J_Min);
title('最小值滤波器')

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
利用最大值滤波器对胡椒噪声进行处理,成功消除了胡椒噪声,但应注意到,它同时也从黑色物体的边缘移走了一些黑色像素。
利用最小值滤波器对盐噪声进行处理,在这种情况下,最小值滤波器比最大值滤波器效果更好,但它也从亮物体边缘移走了一些白色像素,使亮物体变小,暗物体变大,这是因为围绕着这些物体的白点被设置成了暗灰度级。
3.3均值滤波
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围n个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
不足之处
均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在 图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。

I=imread('下载.jpg');%读取图像
I = rgb2gray(I);%灰度处理
J=imnoise(I,'salt & pepper',0.2);%加入椒盐噪声,密度为0.2
subplot(2,3,1);imshow(I);
title('原始图像');
subplot(2,3,2); imshow(J);
title('加入椒盐噪声之后的图像');
%采用MATLAB中的函数filter2对受噪声干扰的图像进行均值滤波
K1= medfilt2(J);%采用二维中值滤波函数medfilt2对受椒盐噪声干扰的图像滤波
%采用MATLAB中的函数filter2对受噪声干扰的图像进行中值滤波
K2=filter2(fspecial('average',3),J)/255; %模板尺寸为3
K3=filter2(fspecial('average',5),J)/255;% 模板尺寸为5
K4= filter2(fspecial('average',9),J)/255; %模板尺寸为9
subplot(2,3,3);imshow(K1);
title('中值滤波');
subplot(2,3,4); imshow(K2);
title('均值滤波,尺寸3');
subplot(2,3,5);imshow(K3);
title('均值滤波,尺寸5');
subplot(2,3,6);imshow(K4);
title('均值滤波,尺寸9'); 

在这里插入图片描述
均值滤波器简单的平滑了一幅图像的的局部变化,在模糊了图像的同时减少了噪声,但不能完全的消除噪声。

2019-02-26 14:43:11 u013185349 阅读数 3541

                                     图像降噪算法总结

图像降噪,是最简单也是最基础的图像处理逆问题(inverse problem)。

大多数情况下,图像降噪都是ill-posed的问题。因为通过有噪音的观察,总是无法逆向求得唯一正确的干净图片。就好像让你解一个超越方程一样,不借助其他额外的条件信息,是没有唯一解的。

降噪问题(这里只讨论additive noise),用最简单的数学语言一句话就可以描述清楚:

y = x + e

y是你观察到的带噪音的图像,e是噪音,x是干净无噪音的图像。只已知y,外加e的概率分布,降噪问题需要你去寻找最接近真实值的x。

说起来降噪问题如此简单明了,但自从信号处理开宗立派起,研究人员一直在孜孜不倦地提出各种降噪算法。我最早也没搞懂,大家何必纠结于这么简单的问题,而不去考虑更复杂,更贴近实际的花哨应用?

然而世间万物的规律,万变不离其中:不管多复杂问题,其本质往往都有简单的起源。而看似简单的问题,往往却是高手一身修行的追求:就好像考察一个书法家功力,看他写一个永字就好;看一个川菜厨师功力,看他做一道开水白菜就好。

科研之道和其他道也类似,简单的任务见到的是这个approach的潜力:这仅仅是起点,而不是终点。一个好的科研者应该要着眼于起点,追求问题的本源,然后拓展到未来,此为道。只追求花哨的应用,拼凑堆叠,舍本求末甚至本末倒置,只能为术。

好吧,扯远了。我就是想说,图像降噪问题,最简单也最困难。

那么要怎么解好这个逆问题呢?

降噪的本质,是要从观测值中分离噪音,保留图像。算法的关键,是要掌握并借助于图像本身独特的性质和结构。具体用什么性质,这个流派就多了,我在这里就先提供一个不完全总结,关于近期的一些好的图像降噪算法。

根据算法利用了什么图像性质,或者用到的手段,我大概把各种算法分成如下几类:

  1. 滤波类
  2. 稀疏表达类
  3. 外部先验
  4. 聚类低秩
  5. 深度学习

 

我根据我的了解,对于每一个类比总结了一个常见算法列表:wenbihan/reproducible-image-denoising-state-of-the-art

入选的算法要满足:1.近期(05年以后)提出的算法,2.有可复现的代码提供,3.可以得到很好,或者接近state-of-the-art的效果。

下面对于这几类算法的一些简略地解释:

滤波类:相对比较传统的一类算法,通过设计滤波器对图像进行处理。特点是速度往往比较快,很多卷积滤波可以借助快速傅里叶变化来加速。近期的一些算法例如BM3D也结合了一些block matching来利用图片的self-similarity,达到了很棒的效果。

 

稀疏表达类:自然图片之所以看起来不同于随机噪音/人造结构,是因为大家发现他们总会在某一个模型(synthesis model或者analysis model)下存在稀疏表达。而我们想排除的噪音往往无法被稀疏化。基于这个判别式模型(discriminative model),用稀疏性来约束自然图像,在很多逆问题里取得了拔群的效果。

https://github.com/wenbihan/reproducible-image-denoising-state-of-the-art

外部先验(external prior):如果从有噪音的图片本身无法找到规律,我们也可以借助其他类似但又没有噪音的图片,来总结图片具有的固有属性。这一类方法利用的外部图片来创造先验条件,然后用于约束需要预测的图片。最有代表性的工作,就是混合高斯模型(Gaussian Mixture Model)。严格来说,基于深度学习的算法也可以归于这个类。

 

聚类低秩(Low-Rankness):除了可稀疏性,低秩性也是自然图片常见的一个特性。数学上,可稀疏表达的数据可以被认为是在Union of low-dimensional subspaces;而低秩数据则是直接存在于一个Low-dimensional subspace。这个更严格的限制往往也可以取得很好的降噪效果。

 

深度学习(Deep Learning):这类可以归于外部先验的子类,但由于近期大热,我单独拿出来说说。如果说解决逆问题的关键,是寻找一个好的图像约束器(regularizer),那么我们为什么不用一个最好的约束器?深度学习方法的精髓,就在于通过大量的数据,学习得到一个高复杂度(多层网络结构)的图片约束器,从而将学习外部先验条件这一途径推到极限。近期的很多这类工作,都是沿着这一思路,取得了非常逆天的效果。

 

对于我总结的每一个类别,我都在创建的【github page】里面列举了一些推荐的工作,并且附带其可复现的代码实现。(你还在为写paper跑实验,不知道和哪些baseline做对比吗?还在为读了paper不知道怎么实现算法而苦恼吗?还在不知道怎么上手吗?请猛戳这里,-_-||)

 

【转载】:https://zhuanlan.zhihu.com/p/32502816