Python 中的双边过滤
过滤用于处理计算机视觉应用程序中的图像。本文将讨论使用 OpenCV 模块在 Python 中实现双边过滤。
什么是双边过滤
双边滤波是一种平滑滤波技术。它是一种非线性降噪滤波器,将每个像素值替换为相邻像素的加权平均像素值。
双边滤波也称为边缘保留滤波,因为它不会对边缘上的像素进行平均。
在 Python 中执行双边过滤的步骤
为了执行双边过滤,我们主要执行四个任务。
-
我们将图像中的每个像素替换为其相邻像素的加权平均值。
-
每个邻居的权重由其与当前像素的距离决定。我们为每个像素分配一个权重,其中最近的像素获得最高的权重,而距离较远的像素获得最低的权重。
为了执行此任务,我们使用空间参数。
-
邻居的权重也取决于像素强度的差异。与当前像素具有相似强度的像素被分配更多的权重,而具有较大强度差异的像素被分配较小的权重。
要执行此任务,我们使用范围参数。
-
通过增加空间参数,可以平滑图像较大的特征。另一方面,如果增加范围参数,双边滤波的行为就像高斯滤波。
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)
这是对输入图像进行双边滤波后的输出图像:
在给定的图像中,你可以观察到输出图像中条带的特征已经模糊。这是因为在创建输出像素时会考虑每个像素的相邻像素。
像素的平均产生模糊效果,并且特征被模糊。
与高斯滤波相比,双边滤波保留了边缘。因此,在执行平滑操作时,如果你需要保留图像中的边缘,则始终可以使用双边滤波。