【基础】2D卷积

1. 引入

openCV提供了多种滤波方式来实现平滑图像的效果,例如均值滤波、高斯滤波、中值滤波等。大多数滤波方式所使用的卷积核都具有一定的灵活性,能够方便地设置卷积核的大小和数值。但是,我们也希望使用特定的卷积核实现卷积操作,例如使用如下卷积核进行卷积操作。

image.png

上一节介绍的三种滤波方式都无法将卷积核设定为以上形式,这时就要使用openCV的自定义卷积函数。

2. filter2D函数

在openCV中,提供了cv2.filter2D()函数进行卷积操作,其语法格式为:

dst = filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
  • dst:返回值,表示2D卷积结果

  • src:原始图像,即输入图像,它可以有任意数量的通道,并且可以对各个通道独立进行卷积处理

  • ddepth:卷积处理结果图像的图像深度,一般使用-1,表示与原始图像使用相同的图像深度

  • kernel:卷积核。

dst,anchor,delta,borderType 可选参数,默认即可

3. 程序演示

Tip:自定义一个卷积核,通过cv2.filter2D()对图像进行卷积操作,并显示滤波结果。

  • 实现均值滤波

"""
Author: Will Wang
Email: WillWang1998@163.com
"""

import cv2
import numpy as np

kernel = np.array([
    [1, 1, 1],
    [1, 1, 1],
    [1, 1, 1]
]) / 9

image = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)

result = cv2.filter2D(image, -1, kernel)

image_stack = np.hstack((image, result))

cv2.imshow('image_stack', image_stack)
cv2.waitKey(0)
cv2.destroyAllWindows()

image.png