Python 中的双边过滤

Aditya Raj 2023年1月30日 2022年6月7日
  1. 什么是双边过滤
  2. 在 Python 中执行双边过滤的步骤
  3. Python 中的 bilateralFilter() 函数
  4. 在 Python 中使用 bilateralFilter() 函数执行双边过滤
Python 中的双边过滤

过滤用于处理计算机视觉应用程序中的图像。本文将讨论使用 OpenCV 模块在 Python 中实现双边过滤。

什么是双边过滤

双边滤波是一种平滑滤波技术。它是一种非线性降噪滤波器,将每个像素值替换为相邻像素的加权平均像素值。

双边滤波也称为边缘保留滤波,因为它不会对边缘上的像素进行平均。

在 Python 中执行双边过滤的步骤

为了执行双边过滤,我们主要执行四个任务。

  1. 我们将图像中的每个像素替换为其相邻像素的加权平均值。

  2. 每个邻居的权重由其与当前像素的距离决定。我们为每个像素分配一个权重,其中最近的像素获得最高的权重,而距离较远的像素获得最低的权重。

    为了执行此任务,我们使用空间参数。

  3. 邻居的权重也取决于像素强度的差异。与当前像素具有相似强度的像素被分配更多的权重,而具有较大强度差异的像素被分配较小的权重。

    要执行此任务,我们使用范围参数。

  4. 通过增加空间参数,可以平滑图像较大的特征。另一方面,如果增加范围参数,双边滤波的行为就像高斯滤波。

Python 中的 bilateralFilter() 函数

我们可以使用 OpenCV 模块使用 bilateralFilter() 函数在 Python 中执行双边过滤。bilateralFilter() 函数的语法如下。

bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType)

这里,

  • 参数 src 将必须处理的源图像作为输入参数。

  • 参数 d 采用过滤时要考虑的像素邻域的直径。

  • 参数 sigmaColor 是色彩空间中过滤器 sigma 的值。具有较高的 sigmaColor 值意味着在过滤时考虑颜色空间中相距较远的颜色。

    参数 sigmaColor 应包含 sigmaSpace 范围内的值。

  • 参数 sigmaSpace 表示空间域中的 sigma 值。sigmaSpace 的较高值意味着在过滤时考虑距离当前像素较远的像素。

    参数 sigmaSpace 应包含 sigmaColor 范围内的值。

  • 参数 borderType 用于定义在过滤图像边界像素的同时推断图像外部像素的模式。

在 Python 中使用 bilateralFilter() 函数执行双边过滤

以下是在 Python 中执行双边过滤的步骤。

  • 首先,我们将导入 cv2
  • 接下来,我们将使用 imread() 函数打开图像,该函数将图像的文件路径作为其输入参数,并返回一个表示图像的数组。
  • 我们将数组存储在变量 img 中。
  • 加载图像后,我们将使用 bilateralFilter() 函数在 Python 中执行双边功能。执行后,bilateralFilter() 函数返回一个包含处理后图像的数组。
  • 获得处理后的图像后,我们将使用 imwrite() 函数将其保存到文件系统,该函数将包含输出文件的文件名的字符串作为其第一个输入参数,并将包含已处理图像的数组作为其第二个输入争论。执行该函数后,文件被保存到文件系统中。

下面是我们将用于在 Python 中执行双边过滤的图像。

模式

以下是在 Python 中执行双边过滤的代码。

import cv2

img = cv2.imread("pattern.jpg")
output_image = cv2.bilateralFilter(img, 15, 100, 100)
cv2.imwrite("processed_image.jpg", output_image)

这是对输入图像进行双边滤波后的输出图像:

双边过滤 python 处理的图像

在给定的图像中,你可以观察到输出图像中条带的特征已经模糊。这是因为在创建输出像素时会考虑每个像素的相邻像素。

像素的平均产生模糊效果,并且特征被模糊。

与高斯滤波相比,双边滤波保留了边缘。因此,在执行平滑操作时,如果你需要保留图像中的边缘,则始终可以使用双边滤波。