Python OpenCV – Filter2D()函数
在本文中,我们将了解 OpenCV 中的 filter2d()函数。简而言之,使用这个函数,我们可以将图像与内核(通常是二维矩阵)进行卷积,以对图像应用过滤器。
Syntax: filter2D (src, dst, ddepth, kernel)
Parameters:
- Src – The source image to apply the filter on.
- Dst – Name of the output image after applying the filter
- Ddepth – Depth of the output image [ -1 will give the output image depth as same as the input image]
- Kernel – The 2d matrix we want the image to convolve with.
使用此函数,我们可以在图像和给定内核之间创建卷积,以在图像中创建过滤器,例如平滑和模糊、锐化和边缘检测。此函数将简单地将 2d 矩阵与像素级图像进行卷积并生成输出图像。要理解这个概念,我们将首先浏览内核的概念。
内核:卷积或卷积矩阵中使用的简单二维矩阵或用于模糊、锐化和边缘检测图像的掩码。
内核的工作:那么,这个内核是如何工作的?让我们看看,我们都知道图像在 OpenCV 中表示为像素值。这些像素被排列为矩阵以形成图像,并且我们知道内核是一个简单的 2d 矩阵,其中基于内核的函数具有特定值,就像内核用于模糊和锐化图像时不同。
举个例子,在这张图片中,前 3 行和前 3 列就像一个矩阵,我们有一个 3 x 3 矩阵的内核。如图所示,图像中的每个像素都有一个像素值(即像素强度)。现在卷积是通过将每个像素值的值与相应位置的内核值相乘来完成的,然后通过乘以并形成一个像素(在这种情况下为中心像素,它是 [ 2,2])。并且对图像中的其余像素值矩阵重复此方法。
注意:我们有特定的内核 [2d 卷积矩阵] 来执行特定的任务,例如模糊、锐化和边缘检测。并且图像中显示的内核只是一个示例,而不是任何特定的内核。
一些常见的内核是,
- 身份内核
- 边缘检测内核
- 锐化内核
- 框模糊核
- 高斯模糊核
使用这些内核,我们可以通过简单地将图像的像素值和内核中的值进行卷积来形成过滤后的图像。
使用 2d 卷积矩阵模糊图像
我们正在通过 NumPy 创建一个如下所示的内核,并将内核作为 filter2d函数的参数传递。
np.ones() will create an array of the desired shape filled all with the ones
示例 1:使用 2d 卷积矩阵模糊图像
Python3
# importing the modules needed
import cv2
import numpy as np
# Reading the image
image = cv2.imread('image.png')
# Creating the kernel(2d convolution matrix)
kernel1 = np.ones((5, 5), np.float32)/30
# Applying the filter2D() function
img = cv2.filter2D(src=image, ddepth=-1, kernel=kernel1)
# Shoeing the original and output image
cv2.imshow('Original', image)
cv2.imshow('Kernel Blur', img)
cv2.waitKey()
cv2.destroyAllWindows()
Python3
# importing the modules needed
import cv2
import numpy as np
# Reading the image
image = cv2.imread('image.png')
# Creating the kernel(2d convolution matrix)
kernel2 = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]])
# Applying the filter2D() function
img = cv2.filter2D(src=image, ddepth=-1, kernel=kernel2)
# Shoeing the original and output image
cv2.imshow('Original', image)
cv2.imshow('Kernel Blur', img)
cv2.waitKey()
cv2.destroyAllWindows()
输出:
示例 2:边缘检测具有 2d 卷积矩阵的图像
我们正在通过 NumPy 数组创建一个内核,看起来像这样,并将内核作为 filter2d函数的参数传递。
Python3
# importing the modules needed
import cv2
import numpy as np
# Reading the image
image = cv2.imread('image.png')
# Creating the kernel(2d convolution matrix)
kernel2 = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]])
# Applying the filter2D() function
img = cv2.filter2D(src=image, ddepth=-1, kernel=kernel2)
# Shoeing the original and output image
cv2.imshow('Original', image)
cv2.imshow('Kernel Blur', img)
cv2.waitKey()
cv2.destroyAllWindows()
输出: