如何使用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中定义内核以应用滤波器。
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 cv2
import numpy as np
# 读取输入图像
img = cv2.imread('vehicle.jpg')
# 将图像转换为灰度图
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 定义一个 5x5 的核
kernel = np.ones((5,5),np.float32)/25
# 应用平均值滤波器
result = cv2.filter2D(img,-1,kernel)
# 显示输出图像
cv2.imshow("Filter 2D Image ", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出
执行上述代码后,将生成以下输出窗口 –
上述输出图像是使用 cv2.filter2D() 应用平均值滤波器后获得的。
示例2
在下面的 Python 示例中,我们使用 5×5 的核对输入图像应用了 boxFilter 操作。
# 导入所需库
import cv2
# 读取输入图像
img = cv2.imread('vehicle.jpg')
# 将图像转换为灰度图
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 对输入图像应用 boxFilter
result = cv2.boxFilter(img,-1,(5,5))
# 在过滤操作后显示图像
cv2.imshow("Box Filter Image", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出
执行上述代码后,将生成以下输出窗口 –
上述输出图像是使用 cv2.boxFilter() 应用平均值滤波器后获得的。