均值滤波opencv-python

均值滤波的思想和多次测量求取平均值是一致的。

文章目录

  • 前言
  • 一、均值滤波是什么?
  • 二、cv.blur()函数
    • 1.函数原型
    • 2.均值滤波的优缺点
    • 3.均值滤波处理图像
  • 参考文献


前言

均值滤波是线性滤波中的一种。图像的线性滤波操作与图像的卷积操作过程类似,不同之处在于图像的滤波不需要将滤波模板旋转180°。卷积操作中的卷积模板在图像滤波中也被称为滤波模板、滤波器或者领域算子,滤波器表示中心像素与滤波范围内其他像素之间的线性关系,通过滤波范围内的像素值之间的线性组合可以求取中心像素滤波后的像素值。opencv中可以进行线性滤波的算法有均值滤波、方框滤波以及高斯滤波。


均值滤波——cv.blur()

一、均值滤波是什么?

均值滤波将滤波模板内的所有像素值看成卷积中的中心元素,将滤波模板内的所有像素值进行求和再求平均值,得到的这个均值再复制给所有的中心元素。所以均值滤波再滤波模板内的所有元素皆为用一个值——均值。

二、cv.blur()函数

1.函数原型

代码如下(示例):

dst = cv.blur(src,
			  ksize
			  [,dst
			  [,anchor
			  [,borderType]]])
#src:待均值滤波的输入图像
#ksize:卷积核的大小,决定滤波模板的大小范围
#dst:均值滤波后的输出图像
#anchor:内核的基准点(锚点)
#borderType:像素边界外推法的标志

该函数用于图像的均值滤波,并将处理好的图像返回。
第一个参数src可以是彩色图片也可以是灰度图,同时它也允许是多维数组对象,但是数据类型必须为uint8、uint16、float32和float64这五个类型的数据。
第二个参数ksize用于确定滤波模板的大小,输入滤波器模板的大小后,函数会自动生成符合要求的滤波模板。
第三个参数应保持与输入图像具有相同的数据类型、尺寸以及通道数。
第四个参数确定滤波模板的几何中心,也就还是基准点。
第五个参数可以自由选择

2.均值滤波的优缺点

均值滤波可以处理不含噪音的图像、含椒盐噪音的图像和含高斯噪音的图像,但是均值滤波由于缩小了像素值之间的差距,使得图像的细节信息变得更加模糊,而且滤波模板的尺寸越大,模糊效越明显。

3.均值滤波处理图像

代码如下(示例):

import cv2 as cv
import sys
import numpy as np

def my_blur(img):
    return cv.blur(img,(3,3)), cv.blur(img,(5,5))

def salt_pepper_noise(image, prob):
    """
    添加椒盐噪声
    :param image: 输入图像
    :param prob: 噪声比
    :return: 带有椒盐噪声的图像
    """
    salt = np.zeros(image.shape, np.uint8)
    thres = 1 - prob
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            rdn = np.random.rand()
            if rdn < prob:
                salt[i][j] = 0
            elif rdn > thres:
                salt[i][j] = 255
            else:
                salt[i][j] = image[i][j]
    return salt

#定义函数,限定值
def clam(pv):
    if pv>255:
        return 255
    elif pv <0:
        return 0
    else:
        return pv


#高斯噪音
def gaussian_noise(image):
    h,w,ch =image.shape
    for row in range(h):
        for col in range(w):
            for c in range(ch):
                s = np.random.normal(0,20,3)
                b = image[row,col,0]
                g = image[row,col,1]
                r = image[row,col,2]
                image[row,col,0] = clam(b+s[0])
                image[row,col,1] = clam(g+s[1])
                image[row,col,2] = clam(r+s[2])
    return image

if __name__ == "__main__":
    img = cv.imread("opencv_test\8.jpg")
    if img is None:
        print("fail to read images")
        sys.exit()
    img_sp = salt_pepper_noise(img,0.01)
    img_gauss = gaussian_noise(img)
    #均值滤波
    img1,img2 = my_blur(img)
    imgsp1,imgsp2 = my_blur(img_sp)
    imgg1,imgg2 = my_blur(img_gauss)
    #无噪音图片
    cv.imshow('origin img',img)
    cv.imshow('3*3 blur',img1)
    cv.imshow('5*5 blur',img2)

    #椒盐噪音
    cv.imshow('origin img',img)
    cv.imshow('3*3 spblur',imgsp1)
    cv.imshow('5*5 spblur',imgsp2)
    #高斯噪音
    cv.imshow('origin gimg',img)
    cv.imshow('3*3 gblur',imgg1)
    cv.imshow('5*5 gblur',imgg2)
    cv.waitKey(0)
    cv.destroyAllWindows()

代码利用均值滤波处理无噪音图像、椒盐噪音图像、高斯噪音图像。


参考文献

冯振、陈亚萌 基于python的opencv4详解【M】

你可能感兴趣的:(python,opencv,opencv,python,计算机视觉)