高斯滤波 订阅
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。 [1]  通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。 展开全文
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。 [1]  通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
信息
外文名
Gaussian filter
方    式
离散化窗口滑窗卷积、傅里叶变换
定    义
实质上是一种信号的滤波器
中文名
高斯滤波
应    用
图像处理,计算机视觉
高斯滤波简介
高斯滤波实质上是一种信号的滤波器,其用途是信号的平滑处理,人们知道数字图像用于后期应用,其噪声 是最大的问题,由于误差会累计传递等原因,很多图像处理教材会在很早的时候介绍Gauss滤波器,用于得到信噪比SNR较高的图像(反应真实信号)。与此相关的有Gauss-Laplace变换,其实就是为了得到较好的图像边缘,先对图像做Gauss平滑滤波,剔除噪声,然后求二阶导矢,用二阶导的过零点确定边缘,在计算时也是频域乘积至空域卷积。滤波器就是建立的一个数学模型,通过这个模型来将图像数据进行能量转化,噪声就是属于高频率部分,高斯滤波器平滑处理后降低噪声的影响。若使用理想滤波器,会在图像中产生振铃现象。采用高斯滤波器的话,系统函数是平滑的,避免了振铃现象。
收起全文
精华内容
下载资源
问答
  • //-----------基于高斯核函数的卷积滤波实现------------------------ pcl::filters::GaussianKernel<pcl::PointXYZ, pcl::PointXYZ> kernel; kernel.setSigma(4);//高斯函数的标准方差,决定函数的宽度 ...
  • 高斯滤波

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

    一. 高斯滤波

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

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

    二维高斯分布

    我们不必纠结于系数

    ,因为它只是一个常数!并不会影响互相之间的比例关系,而且最终都要进行归一化,所以在实际计算时我们忽略它而只计算后半部分 

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

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

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

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

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

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

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

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

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

    例如,标准差

    =1.3 的 3*3 的整数形式的高斯滤波器如下:

    标准差

     =1.3 的8近邻高斯滤波器如图

    σ的意义及选取

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

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

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

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

    二. python实现高斯滤波

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

    代码如下:

    importcv2importnumpy as np#Gaussian filter

    def gaussian_filter(img, K_size=3, sigma=1.3):if len(img.shape) == 3:

    H, W, C=img.shapeelse:

    img= np.expand_dims(img, axis=-1)

    H, W, C=img.shape## Zero padding

    pad= K_size // 2out= 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 inrange(H):for x inrange(W):for c inrange(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)returnout#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,则程序会根据滤波器大小自动计算得到标准差。

    importcv2

    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_process\paojie.jpg'); %读入图片

    sigma1= 10; %高斯正态分布标准差

    grayImg=rgb2gray(OriImage); %转为灰度图像

    gausFilter= fspecial('gaussian',[5 5],sigma1); %高斯滤波

    blur=imfilter(grayImg,gausFilter,'replicate'); %对任意类型数组或多维图像进行滤波

    imshow(blur);

    七. matlab 高斯滤波输出结果

    matlab 高斯滤波后图像

    八. 参考内容:

    展开全文
  • 高斯滤波详解 python实现高斯滤波

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

    一. 高斯滤波

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

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

    二维高斯分布

            我们不必纠结于系数,因为它只是一个常数!并不会影响互相之间的比例关系,而且最终都要进行归一化,所以在实际计算时我们忽略它而只计算后半部分 

            其中(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_process\paojie.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

    https://www.cnblogs.com/wojianxin/p/12498391.html

    展开全文
  • 实现图像的高斯滤波,通过调整高斯函数的标准差(sigma)来控制平滑程度 利用二维高斯函数的行列可分离性进行加速
  • 高斯滤波demo二. 非线性滤波2.1. 中值滤波demo2.2. 双边滤波demo结构体参考 一. 线性滤波 1.1. 方框滤波 方框滤波是所有滤波器中最简单的一种滤波方式。每一个输出像素的是内核邻域像素值的平均值得到。 通用的...

    一. 线性滤波

    在这里插入图片描述

    1.1. 方框滤波

    方框滤波是所有滤波器中最简单的一种滤波方式。每一个输出像素的是内核邻域像素值的平均值得到。
    通用的滤波kernel如下:
    在这里插入图片描述

    这里是一个长宽分别为Kwidth和Kheight的窗口函数,在此区域内邻域中像素值叠加求平均即可求出位于kernel中心点像素的像素值。

    / ** @brief使用框过滤器模糊图像。
     该函数使用内核对图像进行平滑处理:
     未归一化的框式滤波器可用于计算每个像素邻域的各种积分特征,
     例如图像导数的协方差矩阵(用于密集光流算法等)。
     如果需要在可变大小的窗口上计算像素总和,请使用#integral。
    
    @param src输入图像。
    @param dst输出图像的大小和类型与src相同。
    @param ddepth输出图像深度(使用src.depth()时为-1)。
    @param ksize模糊内核的大小。一般Size(w,h)来表示内核的大小。 
    @param 锚点(即被平滑的那个点);默认值Point(-1,-1)表示锚点位于内核中心。
    @param normalize标志,指定是否通过内核区域对其进行规范化。
    @param borderType用于推断图像外部像素的边框模式,请参阅#BorderTypes
    * /
    
    CV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth,
                                 Size ksize, Point anchor = Point(-1,-1),
                                 bool normalize = true,
                                 int borderType = BORDER_DEFAULT );
    

    boxFilter()函数方框滤波所用的核为:

    在这里插入图片描述

    其中:

    在这里插入图片描述

    当normalize=true的时候,方框滤波就变成了下面要说的的均值滤波。

    demo

    int MPT_test_boxFilter()
    {
    	cv::Mat dst1, dst2, dst3, dst4;
    	cv::Mat src = cv::imread("../image/beauty.jpg", cv::IMREAD_COLOR);
    	cv::boxFilter(src, dst1, -1, cv::Size(5, 5), cv::Point(-1, -1), true);
    	cv::namedWindow("src", 0);
    	cv::imshow("src", src);
    	cv::namedWindow("方框滤波", 0);
    	cv::imshow("方框滤波", dst1);
    	cv::waitKey(0);
    	return 0;
    }
    

    d

    1.2. 均值滤波

    均值滤波的原理非常简单,就是输出图像的每一个像素是核窗口内输入图像对应像素的像素的平均值( 所有像素加权系数相等),其实说白了它就是归一化后的方框滤波。

    但是均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。

    / ** @brief使用标准化框过滤器模糊图像。
    
    该函数使用内核对图像进行平滑处理:
    @param src输入图像; 它可以具有任意数量的通道,这些通道是独立处理的,但是深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
    @param dst输出图像的大小和类型与src相同。
    @param ksize模糊内核大小。
    @param锚点; 默认值Point(-1,-1)表示锚点位于内核中央。
    @param borderType用于推断图像外部像素的边框模式,请参阅#BorderTypes
    */
    CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
                            Size ksize, Point anchor = Point(-1,-1),
                            int borderType = BORDER_DEFAULT );
    

    demo

    //均值滤波
    int MPT_test_blur() {
    	cv::Mat dst;
    	cv::Mat src = cv::imread("../image/beauty.jpg", cv::IMREAD_COLOR);
    	cv::blur(src, dst, cv::Size(5, 5));
    	cv::namedWindow("src", 0);
    	cv::imshow("src", src);
    
    	cv::namedWindow("均值滤波", 0);
    	cv::imshow("均值滤波", dst);
    	cv::waitKey(0);
    	return 0;
    }
    
    

    在这里插入图片描述

    1.3. 高斯滤波

    图像的高斯模糊过程就是图像与服从二维正态分布的卷积核做卷积。由于正态分布又叫作高斯分布,所以这项技术就叫作高斯模糊。
    图像与圆形卷积核做卷积将会生成更加精确的焦外成像效果。由于高斯函数的傅立叶变换是另外一个高斯函数,所以高斯模糊对于图像来说就是一个低通滤波操作。
    高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。

    一维零均值高斯函数为:

    在这里插入图片描述
    其中,高斯分布参数σ决定了高斯函数的宽度。

    对于二维图像来说,常用二维零均值离散高斯函数作平滑滤波器。
    二维高斯函数为:

    在这里插入图片描述

    / ** @brief使用高斯滤镜模糊图像。
    
    该函数将源图像与指定的高斯内核进行卷积。就地过滤是
    支持的。
    
    @param src输入图像;图像可以具有任意数量的经过处理的通道
    但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
    @param dst输出图像的大小和类型与src相同。
    @param ksize高斯内核大小。 ksize.width和ksize.height可以不同,但它们都必须为正数和奇数。或者,它们可以为零,然后根据sigma计算得出。
    @param sigmaX X方向上的高斯核标准偏差。
    @param sigmaY Y方向上的高斯核标准差;如果sigmaY为零,则将其设置为等于sigmaX;如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出(有关详细信息,请参见#getGaussianKernel);为了完全控制结果,而不考虑将来可能对所有这些语义的修改,建议指定所有ksize,sigmaX和sigmaY。
    @param borderType像素外推方法,请参见#BorderTypes
    */
    
    CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                    double sigmaX, double sigmaY = 0,
                                    int borderType = BORDER_DEFAULT );
    

    demo

    //高斯滤波
    int MPT_test_GaussianBlur() {
    	cv::Mat dst;
    	cv::Mat src = cv::imread("../image/beauty.jpg", cv::IMREAD_COLOR);
    	cv::GaussianBlur(src, dst, cv::Size(5, 5), 0, 0);
    	cv::namedWindow("src", 0);
    	cv::imshow("src", src);
    
    	cv::namedWindow("高斯滤波", 0);
    	cv::imshow("高斯滤波", dst);
    	cv::waitKey(0);
    	return 0;
    }
    

    在这里插入图片描述

    二. 非线性滤波

    非线性滤波器的原始数据与滤波结果是一种逻辑关系,即通过比较一定邻域内的灰度值大小来实现的。

    2.1. 中值滤波

    中值滤波原理:

    在这里插入图片描述

    简言之中值滤波就是把函数框(如图中的3 X 3)内的灰度值按顺序排列,然后中值取代函数框中心的灰度值。所以一般采用奇数点的邻域来计算中值,但如果像素点数为偶数,中值就取排序像素中间两点的平均值。

    中值滤波在一定的条件下可以克服常见线性滤波器如方框滤波器、均值滤波等带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声非常有效,也常用于保护边缘信息, 保存边缘的特性使它在不希望出现边缘模糊的场合也很有用,是非常经典的平滑噪声处理方法。

    但是中值滤波的缺点也很明显,因为要进行排序操作,所以处理的时间长,是均值滤波的5倍以上。

    / ** @brief使用中值滤镜模糊图像。
    @note中值过滤器内部使用#BORDER_REPLICATE来处理边框像素,请参阅#BorderTypes
    
    @param src输入1、3或4通道图像;当ksize为3或5时,
    图像深度应为CV_8U,CV_16U或CV_32F,对于较大的光圈,只能为CV_8U。
    @param dst目标数组,其大小和类型与src相同。
    @param ksize孔径线性大小; 它必须是奇数且大于1,例如:3、5、7 ...
    */
    
    CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );
    

    demo

    //中值滤波
    int MPT_test_medianBlur() {
    	cv::Mat dst;
    	cv::Mat src = cv::imread("../image/beauty.jpg", cv::IMREAD_COLOR);
    	cv::medianBlur(src, dst, 9);
    	cv::namedWindow("src", 0);
    	cv::imshow("src", src);
    
    	cv::namedWindow("中值滤波", 0);
    	cv::imshow("中值滤波", dst);
    	cv::waitKey(0);
    	return 0;
    }
    

    在这里插入图片描述

    2.2. 双边滤波

    双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。

    双边滤波器的好处是可以做边缘保存(edge preserving),一般用高斯滤波去降噪,会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。

    下图是双边滤波的原理示意图:

    在这里插入图片描述

    在双边滤波器中,输出像素的值依赖于邻域像素值的加权值组合:

    在这里插入图片描述

    而加权系数w(i,j,k,l)取决于空域核和值域核的乘积。
    (i,j),(k,l)分别指两个像素点的坐标。
    其中空域核表示如下(如图):

    在这里插入图片描述

    值域核表示为:

    在这里插入图片描述

    两者相乘后,就会产生依赖于数据的双边滤波权重函数:

    在这里插入图片描述

    d函数是根据像素距离选择权重,距离越近权重越大,这一点和方框滤波,高斯滤波方式相同。而r函数则是根据像素的差异来分配权值。如果两个像素值越接近,即使相距较远,也比差异大而距离近的像素点权重大。正是r函数的作用,使得边缘,即相距近但差异大的像素点的特性得以保留。

    / ** @brief将双边过滤器应用于图像。
    可以在保持边缘相当清晰的同时很好地减少不必要的噪音。但是,与大多数过滤器相比,它非常慢。
    
    _Sigma values_:为简单起见,您可以将2个sigma值设置为相同。如果它们很小(<10),则滤镜效果不大;
    而如果它们很大(> 150),它们将具有非常大的效果。效果强,使图像看起来“卡通化”。
    
    _Filter size_:大型滤镜(d > 5)非常慢,因此建议实时使用d = 5
    应用程序,对于需要重噪声过滤的脱机应用程序,d = 9。
    
    @param src  源8位或浮点,1通道或3通道图像。
    @param dst  与src大小和类型相同的目标映像。
    @param d    滤波期间使用的每个像素邻域的直径。如果它不是正值,
                则从sigmaSpace计算得出。
    @param sigmaColor 在色彩空间中过滤sigma。  
                这个参数的值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域
    @param sigmaSpace 在坐标空间中过滤sigma。
                该参数的值越大,表示越远的像素就会相互影响,
                只要它们的颜色足够接近即可(请参见sigmaColor)。
                当d > 0时,它指定邻域大小,而不考虑sigmaSpace。
                否则,d为与sigmaSpace成比例。
    @param borderType 用于推断图像外部像素的边框模式,请参阅#BorderTypes
     
    */
    
    CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
                                       double sigmaColor, double sigmaSpace,
                                       int borderType = BORDER_DEFAULT );
    
    

    demo

    //双边滤波
    int MPT_test_bilateralFilter() {
    	cv::Mat dst;
    	cv::Mat src = cv::imread("../image/beauty.jpg", cv::IMREAD_COLOR);
    	cv::bilateralFilter(src, dst, 25, 10.0, 25);
    	cv::namedWindow("src", 0);
    	cv::imshow("src", src);
    	cv::namedWindow("双边滤波", 0);
    	cv::imshow("双边滤波", dst);
    	cv::waitKey(0);
    	return 0;
    }
    
    

    在这里插入图片描述

    结构体参考

    enum BorderTypes {
        BORDER_CONSTANT    = 0, //!< `iiiiii|abcdefgh|iiiiiii`  with some specified `i`
        BORDER_REPLICATE   = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`
        BORDER_REFLECT     = 2, //!< `fedcba|abcdefgh|hgfedcb`
        BORDER_WRAP        = 3, //!< `cdefgh|abcdefgh|abcdefg`
        BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba`
        BORDER_TRANSPARENT = 5, //!< `uvwxyz|abcdefgh|ijklmno`
    
        BORDER_REFLECT101  = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
        BORDER_DEFAULT     = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
        BORDER_ISOLATED    = 16 //!< do not look outside of ROI
    };
    
    展开全文
  • 基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比 1.背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤波是基于排序...

    基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比

    1.  背景知识

    中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.

    中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。

    方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3*3,5*5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。

             
     

    2

    4

    8

     
     

    1

    3

    9

     
     

    5

    7

    6

     
             

    g(x,y)=med{f(x-k,y-l),(k,l∈W)}

    g =med[2,4,8;1,3,9;5,7,6] = 5

    中值滤波后的结果:

             
             
       

    5

       
             
             

    均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。

    均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=1/m ∑f(x,y) m为该模板中包含当前像素在内的像素总个数。

    均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。

             
     

    2

    4

    8

     
     

    1

    3

    9

     
     

    5

    7

    6

     
             

    gxy=1/m ∑fxy

    g = (1/8)*(2+4+8+1+9+5+7+6)= 5

    均值滤波后的结果

             
             
       

    5

       
             
             

     

    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

    2.  MATLAB实现

    源码:

    %%-------------------------------------------------------------------------------------------

    %% 2018/01/03

    %% lee

    %% 137194782@qq.com

    %% 微信公众号:FPGA开源工作室

    %%--------------------------------------------------------------------------------------------

    clear all;

    clc;

    M = imread('timg.jpg');         %读取MATLAB中的名为timg的图像   

    figure,imshow(M);                %显示原始图像

    title('original');

    gray = rgb2gray(M);

    figure,imshow(gray);                         %显示灰度图像

    title('gray');

    P1 = imnoise(gray,'gaussian',0.02);     %加入高斯躁声 

    figure,imshow(P1);                        %加入高斯躁声后显示图像

    title('gaussiannoise');

    P2 = imnoise(gray,'salt& pepper',0.02); %加入椒盐躁声

    figure,imshow(P2);                        %加入椒盐躁声后显示图像  

    title('salt& pepper noise');

    g = medfilt2(P1);                       %对高斯躁声中值滤波

    figure,imshow(g);

    title('medfiltergaussian');

    h = medfilt2(P2);                       %对椒盐躁声中值滤波

    figure,imshow(h);

    title('medfiltersalt & pepper noise');

    a=[1 1 1                               %对高斯躁声算术均值滤波

       1 11

       1 11];

    l=1/9*a;                          

    k = conv2(double(P1),double(l));                        

    figure,imshow(k,[]);

    title('arithmeticfiltergaussian');                                          

    d = conv2(double(P2),double(l));           %对椒盐躁声算术均值滤波              

    figure,imshow(d,[]);

    title('arithmeticfiltersalt & pepper noise');

    sigma=8;%标准差大小  

    window=double(uint8(3*sigma)*2+1);%窗口大小一半为3*sigma  

    H=fspecial('gaussian',window, sigma);%fspecial('gaussian',hsize, sigma)产生滤波模板   

    img_gauss=imfilter(P1,H,'replicate'); %为了不出现黑边,使用参数'replicate'(输入图像的外部边界通过复制内部边界的值来扩展)  

    figure, imshow(img_gauss);

    title('gaussianfilting gauss noise');

    img_salt=imfilter(P2,H,'replicate'); 

    figure, imshow(img_salt);

    title('gaussianfilting salt pepper noise');

     

    结果展示:

     

     

     

    原始图像

     

     

     

    灰度图像

     

     

     

    加入高斯噪声的灰度图像

     

     

     

    加入椒盐噪声的灰度图像

     

     

     

    经过中值滤波后的高斯噪声灰度图像

     

     

    经过中值滤波后的椒盐噪声灰度图像

     

     

    经过均值滤波的高斯噪声灰度图像

     

     

    经过均值滤波的椒盐噪声灰度图像

     

     

    经过高斯滤波的高斯噪声灰度图像

    经过高斯滤波的椒盐噪声的灰度图像

    结果分析:图像经过中值滤波后,高斯噪声没有被完全去除,椒盐噪声几乎被完全去除效果较好。经过均值滤波后不管是高斯噪声还是椒盐噪声大部分都没有被去除,只是稍微模糊化。经过高斯滤波后,高斯噪声和椒盐噪声几乎被很大程度的模糊化,原图好像被加上了一层蒙版。

     

    欢迎大家关注我的微信公众号FPGA开源工作室

    FPGA自习学院将不断更新和总结FPGA相关学习资料,书籍,实例工程和视频。

    欢迎大家加入FPGA自习学院,一起学习一起成长。

     

     

     

     

     

    展开全文
  • 在实际场景中,我们通常会假定图像包含的噪声为高斯白噪声,所以在许多实际应用的预处理部分,都会采用高斯滤波抑制噪声。 高斯滤波和均值滤波一样,都是利用一个掩膜和图像进行卷积求解。不同之处在于...
  • 水平方向高斯滤波 垂直方向高斯滤波
  • 1 什么是高斯滤波高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。[1]通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,311
精华内容 2,524
关键字:

高斯滤波