如何使用 OpenCV Python 将自定义过滤器应用于图像(2D 卷积)?
在本教程中,我们将了解如何应用两个不同的低通滤波器来平滑(去除图像中的噪声)。这两个滤波器是 filter2D 和 boxFilter。这些滤波器是空间中的 2D 滤波器。
将 2D 滤波器应用于图像也称为"2D 卷积运算"。这些滤波器通常称为平均滤波器。
这些滤波器的主要缺点是它们也会平滑图像中的边缘。如果您不想平滑边缘,可以应用"双边滤波器"。双边滤波操作可保留边缘。
语法
以下是 Filter2D 和 BoxFilter 的语法
cv2.filter2D(img, ddepth, kernel) cv2.boxFilter(img, ddepth, ksize)
参数
img − 要应用滤波操作的输入图像。
ddepth − 输出图像的所需深度。如果"depth = -1",则返回与输入图像具有相同深度的输出图像。
kernel − 卷积核。在 filter2D 中,我们将内核作为 numpy 数组传递。
ksize − 内核大小。在 boxFilter 中,我们仅将内核大小作为元组传递。
步骤
要执行双边过滤操作,您可以按照以下步骤操作 −
导入所需的库。在以下所有 Python 示例中,所需的 Python 库均为 OpenCV。确保您已经安装了它。
import cv2
读取输入图像并将其转换为灰度图像
img = cv2.imread('vehicle.jpg') img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
定义内核以应用 filter2D。
定义内核以应用 filter2D。 kernel = np.ones((5,5),np.float32)/25
对输入图像应用 filter2D 或 boxFilter 过滤。我们将 ddepth、kernel 或 ksize 作为参数传递给 filter 函数。
result = cv2.filter2D(img,-1,kernel) result = cv2.boxFilter(img,-1,(5,5))
显示过滤后的图像。
cv2.imshow('Filter 2D Image', result) cv2.waitKey(0) cv2.destroyAllWindows())
让我们看看对输入图像执行 filter2D 和 boxFilter 操作的示例。
我们将在下面的所有示例中使用以下图像作为 输入文件。
示例 1
在此 Python 程序中,我们使用 5×5 内核将 filter2D 应用于输入图像。
# import required libraries import cv2 import numpy as np # read the input image img = cv2.imread('vehicle.jpg') # convert the image to grayscale img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # define a 5x5 kernel kernel = np.ones((5,5),np.float32)/25 # Apply the averaging filter result = cv2.filter2D(img,-1,kernel) # Display the output image cv2.imshow("Filter 2D Image ", result) cv2.waitKey(0) cv2.destroyAllWindows()
输出
当我们执行上述代码时,它将产生以下输出窗口 -
上述输出图像是使用 cv2.filter2D() 应用平均滤波器后获得的。
示例 2
在下面的 Python 示例中,我们使用 5×5 内核对输入图像应用 boxFilter 操作。
# Import required library import cv2 # Read the input image img = cv2.imread('vehicle.jpg') # convert the image to grayscale img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # apply boxFilter to the input image result = cv2.boxFilter(img,-1,(5,5)) # display the image after filter operation cv2.imshow("Box Filter Image", result) cv2.waitKey(0) cv2.destroyAllWindows()
输出
当我们执行上述代码时,它将产生以下输出窗口 -
上述输出图像是使用 cv2.boxFilter() 应用平均滤波器后获得的。