OpenCV库中的方框滤波和均值滤波

目录

引言:

一:均值滤波

二:方框滤波


引言:

OpenCV库是一个开源的计算机视觉库,它提供了许多用于图像处理和计算机视觉任务的函数和工具。其中方框滤波和均值滤波都是 OpenCV 中常用的图像滤波方法,用于平滑图像、去除噪声或模糊图像。下面将就利用方框滤波和均值滤波处理图像做详细介绍。

首先安装OpenCV库

pip install opencv-python

均值滤波是一种线性滤波方法,其原理是对图像中每个像素周围的邻域内的像素值进行求平均。具体步骤如下:

  1. 以当前像素为中心,选取一个固定大小的邻域(或称之为卷积核),通常是一个矩形或正方形的区域。
  2. 将邻域内的所有像素值相加。
  3. 将总和除以邻域内像素的数量,得到该像素的新值。

具体的示意图如下:

均值滤波的优点在于简单易实现,计算速度快,但它也有明显的缺点,即可能导致图像边缘变得模糊,并且对于一些特定类型的噪声并不十分有效。

而方框滤波也是一种线性滤波方法,但它与均值滤波不同的地方在于计算邻域内像素值的方式。具体步骤如下:

  1. 以当前像素为中心,选取一个固定大小的邻域,通常是一个矩形或正方形的区域。
  2. 将邻域内所有像素值相加,而不考虑它们的位置关系。
  3. 将总和除以邻域内像素的数量,得到该像素的新值。

具体的示意图如下:

方框滤波的特点是简单、快速,因为它不需要像均值滤波一样考虑像素的位置关系。但与均值滤波一样,方框滤波也可能导致图像边缘变得模糊,并且对一些特定类型的噪声也不太有效。

例如下图:

这是一个充满噪点的西瓜图片那么下面将利用均值滤波和方框滤波进行处理

一:均值滤波

import cv2  #导入opencv库,opencv-python,cv2读取的格式是BGR  numpy
import numpy


noise = cv2.imread(r'C:\Users\35173\Desktop\xg.png')
cv2.imshow('noise_xg',noise)
cv2.waitKey(5000)
blur_1 = cv2.blur(noise,(5,5))
cv2.imshow('blur',blur_1)
cv2.waitKey(5000)
cv2.destroyAllWindows()

利用均值滤波的处理结果如下:

其实我们可以按住crtl点击blur函数来查看这个函数的源代码

def blur(src, ksize, dst=None, anchor=None, borderType=None)

该函数的参数含义如下:

1. `src`:输入图像。这是需要进行滤波处理的原始图像,它应该是一个单通道或多通道的灰度图像或彩色图像,数据类型通常为 `numpy.ndarray`。
2. `ksize`:滤波核的大小。这是一个 `(width, height)` 元组,指定了滤波核的宽度和高度。滤波核的大小决定了平均值滤波中使用的邻域大小。例如,`ksize=(5, 5)` 表示使用一个 5x5 大小的滤波核。
3. `dst`:输出图像,可选参数。如果提供了此参数,函数将会把结果存储在这个参数指定的变量中,而不是创建一个新的变量来存储结果。如果不提供此参数,函数将会返回一个新的图像作为输出。
4. `anchor`:锚点位置,可选参数。这是一个 `(x, y)` 元组,指定了滤波核中心的位置。默认情况下,锚点被设置为核的中心,即 `(ksize[0]//2, ksize[1]//2)`。如果你想要在其他位置应用滤波核,可以通过这个参数指定。这个在奇数的滤波核中几乎可以不用动直接默认的就可以。
5. `borderType`:边界模式,可选参数。这是一个枚举值,指定了在滤波过程中边界像素的处理方式。常用的取值包括:
   - `cv2.BORDER_CONSTANT`:边界像素用常数填充。
   - `cv2.BORDER_REPLICATE`:边界像素用图像边缘的像素值进行复制。
   - `cv2.BORDER_REFLECT`:边界像素用镜像对称的方式填充。
   - `cv2.BORDER_WRAP`:边界像素用图像的反射填充。

二:方框滤波

import cv2  #导入opencv库,opencv-python,cv2读取的格式是BGR  numpy
import numpy


noise = cv2.imread(r'C:\Users\35173\Desktop\xg.png')
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()

利用方框滤波的处理结果如下:左图是做了归一化的,右图是没有做归一化的。

def boxFilter(src, ddepth, ksize, dst=None, anchor=None, normalize=None, borderType=None):

        我们通过boxFilter函数的源代码可知,其函数的参数与均值滤波类似,唯独一个参数需要解释----normalize,这个参数表示的是是否进行归一化,而方框滤波的归一化是指在滤波核中的所有元素相加和为1。具体来说,就是将滤波核中的每个值除以所有值的总和,以确保滤波核中的值的总和等于1。归一化的目的是保持图像的亮度不变。在方框滤波中,将所有的滤波核值相加,然后除以总和,可以确保对图像进行平滑处理时,图像的整体亮度不会发生明显的改变。在OpenCV中,方框滤波的归一化是默认启用的,这意味着在调用 `cv2.boxFilter()` 函数时,默认情况下会对滤波核进行归一化处理,以确保滤波核的总和为1。如果你想要关闭归一化,可以将 `normalize` 参数设置为 `False`。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值