Bootstrap

传统图像去噪方法(一)

最近学习了很多卷积神经网络后,回到图像去噪的问题上,在网上找了一些资料了解图像去噪,下面主要是一些总结和实现。
对于这些算法的实现用的是opencv-python。
目前常用的图像去噪算法大体上可非为两类,即**空域像素特征去噪算法和变换域去噪算法。**前者是直接地在图像空间中进行的处理,后者是间接地在图像变换域中进行处理。

(一)空域像素特征去噪算法

这个方法是针对随机噪声的。那么什么是随机噪声呢?相比于图像的真实信号来说随机噪声就是一种或高或低呈现出不确定变化的一种信号,所有的随机噪声信号求和后结果为0
基于空域像素特征的方法,是通过分析在一定大小的窗口内,中心像素和其他相邻像素之间在灰度空间的直接联系,来获取新的中心像素值的方法。
因此,该方法往往存在典型的输入参数,即滤波半径。

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

均值滤波与高斯滤波的不同之处在于:均值滤波中,滤波器中每个像素的权重是相同的,即滤波器是线性的。而高斯滤波器中像素的权重与其距中心像素的距离成比例。

算术均值滤波用像素邻域的平均灰度来代替像素值,适用于脉冲噪声,因为脉冲噪声的灰度级一般与周围像素的灰度级不相关,而且亮度高出其他像素许多。从频率域观点来看均值滤波是一种低通滤波器,高频信号将会去掉,因此可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。

  1. 方法: 连续取N个采样值进行算术平均运算 。 L值较大时:信号平滑度较高,但灵敏度较低。L值较小时:信号平滑度较低,但灵敏度较高。均值滤波结果A’(i,j)随着L(滤波半径)取值的增大而变得越来越模糊,图像对比度越来越小。

  2. 优点: 适用于对一般具有随机干扰的信号进行滤波 这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动。

  3. 缺点: 对于测量速度较慢或要求数据计算速度较快的实时控制不适用, 比较浪费RAM。
    (网图)
    在这里插入图片描述

    import cv2
    img=cv2.imread("E:\opencv\long.jpg")
    result=cv2.blur(img,(5,5))  # OpenCV中的blur函数也就是低通滤波器
    #参数1是输入的待处理图像,参数2是低通滤波器大小
    cv2.imshow("original",img)
    cv2.imshow("Blur",result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

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

gaussianResult=cv2.GaussianBlur(img,(5,5),1.5)

(2)统计均值滤波

非线性过滤器——中值滤波器。由于中值滤波不会处理最大和最小值,所以就不会受到噪声的影响。相反,如果直接采用blur进行均值滤波,则不会区分这些噪声点,滤波后的图像会受到噪声的影响。中值滤波器在处理边缘也有优势。但中值滤波器会清除掉某些区域的纹理(如背景中的树)。

方法:中值滤波首先确定一个滤波窗口及位置(通常含有奇数个像素),然后将窗口内的像素值按灰度大小进行排序,最后取其中位数代替原窗口中心的像素值。特别是消除椒盐噪声,中值滤波的效果要比均值滤波更好。

  1. 优点: 能有效克服因偶然因素引起的波动干扰, 对温度、液位的变化缓慢的被测参数有良好的滤波效果。
  2. 缺点: 对流量、速度等快速变化的参数不宜。
    当噪声像素个数大于窗口像素总数的一半时,由于灰度排序的中间值仍为噪声像素灰度值,因此滤波效果很差。此时如果增加窗口尺寸,会使得原边缘像素被其他区域像素代替的几率增加,图像更容易变模糊,并且运算量也大大增加。
import cv2
import numpy as np
def salt(img,n):  #椒盐图像
    for k in range(n):
        i=int(np.random.random()*img.shape[1]);
        j=int(np.random.random()*img.shape[0]);
        if img.ndim==2:  #灰度图
            img[j,i]=255
        elif img.ndim==3:
            img[j,i,0]=255
            img[j,i,1]=255
            img[j,i,2]=255
    return img  #BGR图像
if __name__=='__main__':
    img=cv2.imread("E:\opencv\long.jpg")  #读取原图像
    imgcopy=img.copy() #复制一份
    saltImage=salt(img,500)  #对图像加上椒盐噪声
    img_mean=cv2.blur(img,(5,5)) #均值去噪
    img_median=cv2.medianBlur(img,5)  #中值去噪
    cv2.imshow("Salt",saltImage)  #在窗口显示图像
    cv2.imshow("Img_Mean",img_mean)
    cv2.imshow("Img_Median",img_median)
    cv2.imshow("Img",imgcopy)
    cv2.waitKey(0)  #显示图像必备
    cv2.destroyALLWindows()  #释放窗口 

可以看到确实中值滤波比均值滤波对椒盐噪声的效果要好一点。
在这里插入图片描述
常规的中值滤波器的窗口尺寸是固定大小不变的,就不能同时兼顾去噪和保护图像的细节。这时就要寻求一种改变,根据预先设定好的条件,在滤波的过程中,动态的改变滤波器的窗口尺寸大小,这就是自适应中值滤波器 Adaptive Median Filter。在滤波的过程中,自适应中值滤波器会根据预先设定好的条件,改变滤波窗口的尺寸大小,同时还会根据一定的条件判断当前像素是不是噪声,如果是则用邻域中值替换掉当前像素;不是,则不作改变。

(3)双边滤波

双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部处理的特点。之所以能够达到保边去噪的滤波效果是因为滤波器由两个函数构成:一个函数是由几何空间距离决定滤波器系数,另一个是由像素差值决定滤波器系数。
双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合,其公式如下:
在这里插入图片描述
权重系数w(i,j,k,l)取决于定义域核和值域核的乘积: 在这里插入图片描述
通俗来讲就是双边滤波模板主要有两个模板生成,第一个是高斯模板,第二个是以灰度级的差值作为函数系数生成的模板,然后这两个模板点乘就得到了最终的双边滤波模板。空域滤波器对空间上邻近的点进行加权平均,加权系数随着距离的增加而减少。值域滤波器则是对像素值相近的点进行加权平均,加权系数随着值差的增大而减少。
双边滤波器可以很好的保存图像边缘细节而滤除掉低频分量的噪音,但是双边滤波器的效率不是太高,花费的时间相较于其他滤波器而言也比较长。

void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT )

参数解释:
. InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
. OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。
. int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
. double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
. double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace无关,否则d正比于sigmaSpace.
. int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值

img_bilater = cv2.bilateralFilter(img,9,75,75)

在这里插入图片描述
很明显的看到利用双边滤波得到的图像没有那么模糊,但是对于对于高频噪声的过滤也不干净。

用网上找到的一张图总结一下:
在这里插入图片描述
参考文章:
https://blog.csdn.net/sunny2038/article/details/9155893
https://zhuanlan.zhihu.com/p/51403693
https://blog.csdn.net/qq_27261889/article/details/80822270
https://blog.csdn.net/keith_bb/article/details/54427779

;