指对图像进行特定的滤波操作。它通过一个称为卷积核(kernel)的小矩阵在图像上滑动,逐像素地对图像进行加权求和。这个过程可以看作是卷积核与图像局部区域的一种 “融合”。

该篇文章的源码都在此处.

卷积的作用

卷积操作在计算机视觉中主要有以下作用:

  1. 图像处理: 通过卷积对图像进行模糊处理、锐化边缘、去除噪声等操作。
  2. 特征提取:卷积操作可以提取图像中的局部特征,如边缘、角点、纹理等。通过使用不同的卷积核,可以提取不同类型的特征。
  3. 降维:卷积操作可以降低图像的维度,减少计算量。通过使用不同的卷积核,可以提取不同尺度的特征,从而降低图像的维度。
  4. 升维: 卷积也可以提升图片的维度, 一般目的是为了提取更多的特征, 比如使用多个卷积层, 每个卷积层提取不同尺度的特征, 最后将多个卷积层的特征进行融合, 提取更丰富的特征。
  5. 多模态数据融合: 卷积操作可以用于多模态数据融合, 比如将图像和文本数据进行融合, 提取更丰富的特征。通过适当的卷积升维操作,可以将不同模态的特征映射到一个共同的高维空间中,以便进行更有效的融合和分析。
  6. 平滑:卷积操作可以平滑图像,减少图像中的噪声。通过使用不同的卷积核,可以控制平滑的程度。
  7. 增强鲁棒性:卷积操作对图像的局部变化具有一定的鲁棒性。由于它是基于局部区域的加权求和,即使图像中存在一些局部的变形、噪声或遮挡,卷积操作仍然可以提取出相对稳定的特征。

例子

高斯模糊

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg')

# 定义高斯模糊的卷积核
kernel = np.array([[1/16, 1/8, 1/16],
[1/8, 1/4, 1/8],
[1/16, 1/8, 1/16]])

# 对图像进行高斯模糊
blurred_img = cv2.filter2D(img, -1, kernel)

# 显示原始图像和高斯模糊后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Blurred Image', blurred_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

边缘检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg', 0)

# 定义边缘检测的卷积核
kernel = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]])

# 对图像进行边缘检测
edge_img = cv2.filter2D(img, -1, kernel)

# 显示原始图像和边缘检测后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Edge Image', edge_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

滤波器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg', 0)

# 定义滤波器的卷积核
kernel = np.array([[0, 1, 0],
[1, -4, 1],
[0, 1, 0]])

# 对图像进行滤波
filtered_img = cv2.filter2D(img, -1, kernel)

# 显示原始图像和滤波后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Filtered Image', filtered_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图片锐化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg', 0)

# 定义锐化滤波器的卷积核
kernel = np.array([[-1, -1, -1],
[-1, 9, -1],
[-1, -1, -1]])

# 对图像进行锐化
sharpened_img = cv2.filter2D(img, -1, kernel)

# 显示原始图像和锐化后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Sharpened Image', sharpened_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图片平滑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg', 0)

# 定义平滑滤波器的卷积核
kernel = np.array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])

# 对图像进行平滑
smoothed_img = cv2.filter2D(img, -1, kernel)/ 9

# 显示原始图像和平滑后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Smoothed Image', smoothed_img)
cv2.waitKey(0)
cv2.destroyAllWindows()