NumPy 卷积怎么操作?numpy convolve 函数用法详解

文章导读
Previous Quiz Next NumPy 卷积 NumPy 中的卷积是一种数学运算,用于以特定方式组合两个数组(例如信号或图像)以生成第三个数组。此操作有助于对数据进行滤波、平滑和特征检测。
📋 目录
  1. NumPy 卷积
  2. 1D 卷积
  3. 2D 卷积
  4. 3D 卷积
  5. 卷积的应用
A A

NumPy - 卷积



Previous
Quiz
Next

NumPy 卷积

NumPy 中的卷积是一种数学运算,用于以特定方式组合两个数组(例如信号或图像)以生成第三个数组。此操作有助于对数据进行滤波、平滑和特征检测。

执行卷积时,将一个数组(称为 kernel 或 filter)在另一个数组(输入)上滑动,并在每个位置计算元素级乘积的和。此过程增强了输入数组的某些方面,例如图像中的边缘或信号中的特定频率。

在 NumPy 中,可以使用 numpy.convolve() function 处理一维数组,使用 scipy.ndimage.convolve() 处理多维数组来执行卷积,此操作广泛应用于信号处理和图像分析。

1D 卷积

一维卷积常用于信号处理。它涉及将一个信号(kernel)在另一个信号(输入信号)上滑动,并在每个位置计算点积。

示例:1D 卷积

在以下示例中,我们使用 NumPy 对输入信号和 kernel 执行 1D 卷积 −

import numpy as np

# 定义输入信号
input_signal = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])

# 定义卷积 kernel
kernel = np.array([0.2, 0.5, 0.2])

# 执行 1D 卷积
convolved_signal = np.convolve(input_signal, kernel, mode='same')

print("Input signal:", input_signal)
print("Kernel:", kernel)
print("Convolved signal:", convolved_signal)

结果显示输入信号、kernel 和卷积信号 −

Input signal: [1 2 3 4 5 6 7 8 9]
Kernel: [0.2 0.5 0.2]
Convolved signal: [0.9 1.8 2.7 3.6 4.5 5.4 6.3 7.2 6.1]

2D 卷积

二维卷积广泛用于图像处理中的任务,如模糊、锐化和边缘检测。它涉及将 2D kernel 在 2D 输入数组(图像)上滑动,并在每个位置计算点积。

示例:2D 卷积

在以下示例中,我们使用 kernel 对示例图像执行 2D 卷积 −

import numpy as np
from scipy.signal import convolve2d

# 定义示例图像(2D 数组)
image = np.array([
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
    [13, 14, 15, 16]
])

# 定义 2D 卷积 kernel
kernel = np.array([
    [0.1, 0.2, 0.1],
    [0.2, 0.4, 0.2],
    [0.1, 0.2, 0.1]
])

# 执行 2D 卷积
convolved_image = convolve2d(image, kernel, mode='same', boundary='fill', fillvalue=0)

print("Image:\n", image)
print("Kernel:\n", kernel)
print("Convolved image:\n", convolved_image)

结果显示原始图像、kernel 和卷积图像 −

Image:
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]
 [13 14 15 16]]
Kernel:
[[0.1 0.2 0.1]
 [0.2 0.4 0.2]
 [0.1 0.2 0.1]]
Convolved image:
[[ 2.4  4.   5.2  4.5]
 [ 6.4  9.6 11.2  9.2]
 [11.2 16.  17.6 14. ]
 [10.8 15.2 16.4 12.9]]

3D 卷积

三维卷积用于各种应用,例如 3D 图像处理、视频处理和体数据分析。它涉及在 3D 输入数组上滑动 3D 核,并在每个位置计算点积。

示例:3D 卷积

在以下示例中,我们对一个示例 3D 数组执行 3D 卷积 −

import numpy as np
from scipy.ndimage import convolve

# 定义一个示例 3D 数组
array_3d = np.random.rand(4, 4, 4)

# 定义一个 3D 卷积核
kernel_3d = np.ones((3, 3, 3)) / 27

# 执行 3D 卷积
convolved_3d = convolve(array_3d, kernel_3d, mode='constant', cval=0.0)

print("3D array:\n", array_3d)
print("Kernel:\n", kernel_3d)
print("Convolved 3D array:\n", convolved_3d)

结果显示了原始 3D 数组、核和卷积后的 3D 数组 −

3D array:
[[[0.46186776 0.09130699 0.36913034 0.51669149]
  [0.90316515 0.38362845 0.90886156 0.60454144]
  [0.80756784 0.28656032 0.73140925 0.75789388]
  [0.36958966 0.66157156 0.19902489 0.89519004]]]

 [[0.04953332 0.98571523 0.80654445 0.47526839]
  [0.67375222 0.31837149 0.20836025 0.10996474]
  [0.48799518 0.34754979 0.85689208 0.21079349]
  [0.91936308 0.79818294 0.18737238 0.01728286]]]

 [[0.50793178 0.93691426 0.00515023 0.29870646]
  [0.22871996 0.3098202  0.0396516  0.98755326]
  [0.3347781  0.56108282 0.89520242 0.77143481]
  [0.64504437 0.0133608  0.61686021 0.01443242]]]

 [[0.96126985 0.11224998 0.79332687 0.0438432 ]
  [0.39348891 0.36066344 0.06157876 0.29697117]
  [0.40409768 0.88212056 0.22872878 0.7545221 ]
  [0.09578231 0.06486727 0.94749091 0.79605238]]]
Kernel:
[[[0.03703704 0.03703704 0.03703704]
  [0.03703704 0.03703704 0.03703704]
  [0.03703704 0.03703704 0.03703704]]]

 [[0.03703704 0.03703704 0.03703704]
  [0.03703704 0.03703704 0.03703704]
  [0.03703704 0.03703704 0.03703704]]]

 [[0.03703704 0.03703704 0.03703704]
  [0.03703704 0.03703704 0.03703704]
  [0.03703704 0.03703704 0.03703704]]]
Convolved 3D array:
[[[0.14323484 0.22815693 0.21401425 0.14812454]
  [0.21470421 0.35845228 0.3322031  0.24282783]
  [0.25767769 0.37219326 0.3142019  0.21065136]
  [0.17327335 0.24641033 0.22036013 0.14280959]]]

 [[0.21669359 0.30327501 0.30948818 0.19742312]
  [0.32134299 0.49990604 0.51018517 0.35385371]
  [0.33518903 0.5071755  0.47010555 0.3338045 ]
  [0.23083876 0.35997806 0.32674433 0.2279181 ]]

 [[0.21623817 0.28714973 0.26483904 0.15284887]
  [0.32800203 0.47227742 0.46885114 0.29053678]
  [0.29033486 0.44004365 0.43174681 0.29633869]
  [0.20571203 0.34395451 0.33200848 0.23322462]]]

 [[0.14115031 0.17447281 0.15727516 0.0935845 ]
  [0.22196806 0.29691764 0.30887114 0.19172851]
  [0.15903061 0.26234589 0.31860718 0.23742514]
  [0.11115311 0.21071912 0.2424502  0.18610089]]]

卷积的应用

卷积有广泛的应用,例如 −

  • 图像处理: 模糊化、锐化、边缘检测和特征提取。
  • 信号处理: 音频和通信信号的滤波、平滑和噪声减少。
  • 机器学习: 卷积神经网络 (CNNs) 使用卷积层在图像识别和自然语言处理等任务中进行特征提取。
  • 时间序列分析: 卷积可用于平滑或滤波时间序列数据。