Opencv之图像滤波:4.高斯滤波(cv2.GaussianBlur)

        在进行均值滤波和方框滤波时,其邻域内每个像素的权重是相等的。在高斯滤波中,会将中心点的权重值加大,远离中心点的权重值减小,在此基础上计算邻域内各个像素值不同权重的和。

4.1 原理介绍

        在高斯滤波中,卷积核中的值不再都是1。如下图所示

        在实际使用中,高斯滤波使用的可能是不同大小的卷积核,核的宽度和高度可以不相同,但是它们都必须是奇数,可以根据使用需求选定合适的卷积核。每一种尺寸的卷积核都可以有多种不同形式的权重比例。在实际计算中,卷积核是归一化处理的,严格来讲,使用没有进行归一化处理的卷积核进行滤波,得到的结果往往是错误的。

4.2 函数语法

        在OpenCV中,实现高斯滤波的函数是cv2.GaussianBlur(),该函数的语法格式是:

         dst=cv2.GaussianBlur(src,ksize,sigmaX,sigmaY,borderType)

        式中:

        ● dst是返回值,表示进行高斯滤波后得到的处理结果。

        ● src 是需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道 独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F 或者 CV_64F中的一 种。

        ● ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽 度。需要注意,滤波核的值必须是奇数。

        ● sigmaX 是卷积核在水平方向上(X 轴方向)的标准差,其控制的是权重比例。

        ● sigmaY是卷积核在垂直方向上(Y轴方向)的标准差。如果将该值设置为0,则只采用sigmaX的值

        如果sigmaX和sigmaY都是0,则通过ksize.width和ksize.height计算得到。其中:

        sigmaX=0.3×[(ksize.width-1)×0.5-1] +0.8 

        sigmaY=0.3×[(ksize.height-1)×0.5-1]+0.8        

         ● borderType是边界样式,该值决定了以何种方式处理边界。一般情况下,不需要考虑该值,直接采用默认值即可。 在该函数中,sigmaY和borderType是可选参数。sigmaX是必选参数,但是可以将该参数设置为0,让函数自己去计算sigmaX的具体值。

        函数cv2.GaussianBlur()的常用形式为:
        dst=cv2.GaussianBlur(src,ksize,0,0)

4.3 程序示例

import cv2  as cv
import numpy as np

def cv_show(name, img):
    cv.imshow(name, img)
    cv.waitKey(0)
    cv.destroyAllWindows()

*对图像添加高斯噪声
def add_gauss_noise(image, mean=0, val=0.01):
    size = image.shape
    # 对图像归一化处理
    image = image / 255
    gauss = np.random.normal(mean, val**0.05, size)
    image = image + gauss
    return image

img = cv.imread('D:\\dlam.jpg')
if img is None:
    print('Failed to read the image')

img1 = add_gauss_noise(img)
cv_show('img1', img1)

img2 = cv.GaussianBlur(img1, (3, 3), 1, 2)
cv_show('img2', img2)

原图如下:

        

添加高斯噪声:

 高斯滤波结果:

        高斯滤波对高斯噪声消除效果较好。

猜你喜欢

转载自blog.csdn.net/qq_49478668/article/details/123431541
今日推荐