• 高斯滤波详解 附python和matlab高斯滤波代码


    一. 高斯滤波

            高斯滤波是一种线性平滑滤波器,对于服从正态分布的噪声有很好的抑制作用。在实际场景中,我们通常会假定图像包含的噪声为高斯白噪声,所以在许多实际应用的预处理部分,都会采用高斯滤波抑制噪声。

            高斯滤波和均值滤波一样,都是利用一个掩膜和图像进行卷积求解。不同之处在于:均值滤波器的模板系数都是相同的,为1。而高斯滤波器的模板系数,随着距离模板中心距离的增大,系数减小(服从二维高斯分布)。所以,高斯滤波器相比于均值滤波器而言,对图像模糊程度较小,更能保持图像的整体细节。

    二维高斯分布

            我们不必纠结于系数frac{1}{(sqrt{2*π}*sigma)^2   } ,因为它只是一个常数!并不会影响互相之间的比例关系,而且最终都要进行归一化,所以在实际计算时我们忽略它而只计算后半部分 e^{-((x-ux)^2+(y-uy)^2)/2sigma ^2}

            其中(x,y)为掩膜内任一点的坐标,(ux,uy)为掩膜内中心点的坐标,在图像处理中可认为是整数;σ是标准差。

            例如:要产生一个3×3的高斯滤波器模板,以模板的中心位置为坐标原点进行取样。(x轴水平向右,y轴竖直向下)  


    模板在各个位置的坐标,如上图所示↑

            这样,将各个位置的坐标带入到高斯函数中,得到的值就是滤波器的系数。

            如果窗口模板的大小为 (2k+1)×(2k+1),则:

    窗口模板中各个元素的计算公式

            这样计算出来的模板有两种形式:小数和整数。

            小数形式的模板,就是直接计算得到的值,没有经过任何的处理;

            整数形式的模板,需要进行归一化处理,将模板左上角的值归一化为1。使用整数的模板时,需要在模板的前面加一个系数,系数为模板中元素和的倒数。

            例如,标准差 sigma =1.3 的 3*3 的整数形式的高斯滤波器如下:


    标准差sigma  =1.3 的8近邻高斯滤波器如图  

            σ的意义及选取

            通过上述的实现过程,不难发现,高斯滤波器模板的生成最重要的参数就是高斯分布的标准差σ。标准差代表着数据的离散程度,如果σ较小,那么生成的模板的中心系数较大,而周围的系数较小,这样对图像的平滑效果就不是很明显;反之,σ较大,则生成的模板的各个系数相差就不是很大,比较类似均值模板,对图像的平滑效果比较明显。


    高斯分布的概率分布密度图

            可以看到:σ越小分布越瘦高,σ越大分布越矮胖。

            由于图像的长宽可能不是滤波器大小的整数倍,因此我们需要在图像的边缘补0,这种方法叫做 zero padding 。


    二. python实现高斯滤波

            算法流程:①对图像进行zero padding ②根据高斯滤波器的核大小和标准差大小实现高斯滤波器 ③使用高斯滤波器对图像进行滤波(相乘再相加)④输出高斯滤波后的图像

            代码如下:

    import cv2
    
    import numpy as np
    
    # Gaussian filter
    
    def gaussian_filter(img, K_size=3, sigma=1.3):
    
        if len(img.shape) == 3:
    
            H, W, C = img.shape
    
        else:
    
            img = np.expand_dims(img, axis=-1)
    
            H, W, C = img.shape
    
        ## Zero padding
    
        pad = K_size // 2
    
        out = np.zeros((H + pad * 2, W + pad * 2, C), dtype=np.float)
    
        out[pad: pad + H, pad: pad + W] = img.copy().astype(np.float)
    
        ## prepare Kernel
    
        K = np.zeros((K_size, K_size), dtype=np.float)
    
        for x in range(-pad, -pad + K_size):
    
            for y in range(-pad, -pad + K_size):
    
                K[y + pad, x + pad] = np.exp( -(x ** 2 + y ** 2) / (2 * (sigma ** 2)))
    
        K /= (2 * np.pi * sigma * sigma)
    
        K /= K.sum()
    
        tmp = out.copy()
    
        # filtering
    
        for y in range(H):
    
            for x in range(W):
    
                for c in range(C):
    
                    out[pad + y, pad + x, c] = np.sum(K * tmp[y: y + K_size, x: x + K_size, c])
    
        out = np.clip(out, 0, 255)
    
        out = out[pad: pad + H, pad: pad + W].astype(np.uint8)
    
        return out
    
    # Read image
    
    img = cv2.imread("../paojie.jpg")
    
    # Gaussian Filter
    
    out = gaussian_filter(img, K_size=3, sigma=1.3)
    
    # Save result
    
    cv2.imwrite("out.jpg", out)
    
    cv2.imshow("result", out)
    
    cv2.waitKey(0)
    
    cv2.destroyAllWindows()

    三. python程序输出结果:


    高斯滤波后图像

    原图

    四. opencv函数 cv2.GaussianBlur(img,(3,3),1.3) 实现高斯滤波

            其中,(3,3)为滤波器的大小;1.3为滤波器的标准差,如果标准差这个参数设置为0,则程序会根据滤波器大小自动计算得到标准差。

    import cv2
    
    img=cv2.imread('../paojie.jpg')
    
    #(3, 3)表示高斯滤波器的长和宽都为3,1.3表示滤波器的标准差
    
    out=cv2.GaussianBlur(img,(3,3),1.3)
    
    cv2.imwrite('out.jpg',out)
    
    cv2.imshow('result',out)
    
    cv2.waitKey(0)
    
    cv2.destroyAllWindows()
    
    五. opencv函数GaussianBlur滤波结果:
    
    
    GaussianBlur 函数输出结果
    六. matlab实现高斯滤波
    
    % 高斯滤波器大小为5*5,标准差为10
    
    clear all;close all;clc;
    
    OriImage=imread('F:image_processpaojie.jpg');    %读入图片
    
    sigma1 = 10;      %高斯正态分布标准差
    
    grayImg=rgb2gray(OriImage);    %转为灰度图像
    
    gausFilter = fspecial('gaussian',[5 5],sigma1);  %高斯滤波
    
    blur=imfilter(grayImg,gausFilter,'replicate');    %对任意类型数组或多维图像进行滤波
    
    imshow(blur);

    七. matlab 高斯滤波输出结果


    matlab 高斯滤波后图像

    八. 参考内容:

    https://www.jianshu.com/p/4eaf349de9e9

  • 相关阅读:
    LeetCode 104
    LeetCode 100
    LeetCode 27
    LeetCode 7
    LeetCode 8
    蘑菇街2017春招笔试
    codeforces 5D
    codeforces 5C
    codeforces 875B
    codeforces 876B
  • 原文地址:https://www.cnblogs.com/wojianxin/p/12498391.html
Copyright © 2020-2023  润新知