十分钟带你了解均值滤波和方框滤波

目录

一、引言

二、均值滤波

 三、方框滤波

四、总结


一、引言

均值滤波(Mean Filter)和方框滤波(Box Filter)都是图像处理中常用的平滑滤波方法,它们的主要目的是减少图像中的噪声并平滑图像。

二、均值滤波

均值滤波是一种线性滤波方法,它的原理是将一个滤波器(通常是一个小的矩形窗口)在图像上滑动,计算窗口内像素的平均值,然后用这个平均值来替代窗口中心像素的值。这个操作可以用于去除噪声,平滑图像,以及模糊图像。

均值滤波的步骤:

  1. 定义一个滤波器(通常是一个矩形窗口)。
  2. 将滤波器在图像上滑动,计算窗口内像素的平均值。
  3. 将平均值赋给窗口中心像素。  

在OpenCV中,你可以使用 cv2.blur函数来进行均值滤波例如:

 

       dsr=cv2.blur(src,ksize,anchor,borderType)

● dst是返回值

● src是需要处理的图像

● kszie是滤波核(卷积核)的大小

● anchor是锚点,默认值是(-1,-1)一般无需更改

● borderType是边界样式,一般无需更改 一般情况下,使用dst=cv2.blur(src,ksize)即可。 

下面是代码演示:

import cv2
import numpy as np #导入所需要的库

def add_peppersalt_noise(image, n=10000): #定义一个函数 利用这个函数生成噪声图
    result = image.copy()
    w, h = image.shape[:2]    # 测量图片的长和宽
    for i in range(n):    # 生成n个椒盐噪声
        x = np.random.randint(1, w)
        y = np.random.randint(1, h)
        if np.random.randint(0, 2) == 0:
            result[x, y] = 0
        else:
            result[x,y] = 255
    return result

image = cv2.imread('xx.png')        #读取图片
cv2.imshow('sro',image)             #展示图片
cv2.waitKey(100000)                 #等待间隔
noise = add_peppersalt_noise(image) #调用函数
cv2.imshow('noise',noise)
cv2.waitKey(100000)

blur_1 = cv2.blur(noise,(3,3))  #卷积核为3,3
cv2.imshow('blur_1',blur_1)
cv2.waitKey(100000)

blur_2 = cv2.blur(noise,(5,5))#卷积核为5,5
cv2.imshow('blur_2',blur_2)
cv2.waitKey(100000)
cv2.destroyAllWindows()

运行结果如下:

十分钟带你了解均值滤波和方框滤波_第1张图片

十分钟带你了解均值滤波和方框滤波_第2张图片

 三、方框滤波

方框滤波是一种均值滤波的特殊情况,也叫做盒子滤波。它的原理和均值滤波类似,但不同之处在于,方框滤波的滤波器中的每个像素都有相同的权重,即等权重。这意味着在计算平均值时,每个像素的贡献都是相等的。

在OpenCV中,你可以使用 cv2.boxFilter() 函数来进行方框滤波。例如:

   dst=cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)式中:
● dst是返回值,表示进行方框滤波后得到的处理结果。
● src 是需要处理的图像,即原始图像。
● ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度。
● ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。
● anchor 是锚点。
● normalize 表示在滤波时是否进行归一化。
      1.当值为True时,归一化,用邻域像素值的和除以面积。此时方框滤波与均值滤波效果相同。
      2.当值为False时,不归一化,直接使用邻域像素值的和。和>255时使用255

下面是代码演示:

import cv2
import numpy as np


def add_peppersalt_noise(image, n=10000):
    result = image.copy()
    w, h = image.shape[:2]  # 测量图片的长和宽
    for i in range(n):  # 生成n个椒盐噪声
        x = np.random.randint(1, w)
        y = np.random.randint(1, h)
        if np.random.randint(0, 2) == 0:
            result[x, y] = 0
        else:
            result[x, y] = 255
    return result


image = cv2.imread('xx.png')
noise = add_peppersalt_noise(image)


#进行归一化
boxFilter_1 = cv2.boxFilter(noise, -1, (3, 3), normalize=True)
cv2.imshow('boxFilter_1', boxFilter_1)
cv2.waitKey(100000)

#不进行归一化
boxFilter_2 = cv2.boxFilter(noise, -1, (3, 3), normalize=False) 
cv2.imshow('boxFilter_2', boxFilter_2)
cv2.waitKey(100000)
cv2.destroyAllWindows()

 运行结果如下:

十分钟带你了解均值滤波和方框滤波_第3张图片

四、总结

均值滤波和方框滤波都是用于平滑图像和去除噪声的常见技术,你可以根据具体的需求选择合适的方法。 

你可能感兴趣的:(均值算法,算法,计算机视觉)