NumPy - 卷积
NumPy 卷积
NumPy 中的卷积是一种数学运算,用于以特定方式组合两个数组(例如信号或图像)以生成第三个数组。此运算有助于过滤、平滑和检测数据中的特征。
执行卷积时,将一个数组(称为核或滤波器)滑到另一个数组(输入)上,并计算每个位置上元素乘积的总和。此过程增强了输入数组的某些方面,例如图像的边缘或信号中的特定频率。
在 NumPy 中,您可以使用 numpy.convolve() 函数(针对一维数组)和 scipy.ndimage.convolve() 函数(针对多维数组)来执行卷积,这在信号处理和图像分析中被广泛使用。
一维卷积
一维卷积在信号处理中被广泛使用。它涉及将一个信号(核)滑动到另一个信号(输入信号)上,并计算每个位置的点积。
示例:一维卷积
在以下示例中,我们使用 NumPy 对输入信号和核执行一维卷积 -
import numpy as np # 定义输入信号 input_signal = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) # 定义卷积核 kernel = np.array([0.2, 0.5, 0.2]) # 执行一维卷积 convolved_signal = np.convolve(input_signal, kernel, mode='same') print("输入信号:",input_signal) print("kernel 函数:", kernel) print("卷积信号:", convolved_signal)
结果显示输入信号、核函数和卷积信号 −
输入信号:[1 2 3 4 5 6 7 8 9] kernel 函数:[0.2 0.5 0.2] 卷积信号:[0.9 1.8 2.7 3.6 4.5 5.4 6.3 7.2 6.1]
二维卷积
二维卷积广泛应用于图像处理,例如模糊、锐化和边缘检测等任务。它涉及将二维核在二维输入数组(图像)上滑动,并计算每个位置的点积。
示例:二维卷积
在以下示例中,我们使用一个核对示例图像执行二维卷积 -
import numpy as np from scipy.signal import convolve2d # 定义示例图像(二维数组) image = np.array([ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16] ]) # 定义二维卷积核 kernel = np.array([ [0.1, 0.2, 0.1], [0.2, 0.4, 0.2], [0.1, 0.2, 0.1] ]) # 执行二维卷积 convolved_image = convolve2d(image, kernel, mode='same', boundaries='fill', fillvalue=0) print("图像: ", image) print("Kernel: ", kernel) print("卷积图像: ", convolved_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]] 卷积图像: [[ 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_3d) print("Kernel: ", kernel_3d) print("卷积后的 3D 数组: ", convolved_3d)
结果显示原始 3D 数组、核函数和卷积后的 3D 数组 -
3D 数组: [[[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]]] 卷积后的 3D 数组: [[[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]]]
卷积的应用
卷积的应用范围很广,例如:-
- 图像处理:模糊、锐化、边缘检测和特征提取。
- 信号处理:对音频和通信信号进行滤波、平滑和降噪。
- 机器学习:卷积神经网络 (CNN) 使用卷积层进行特征提取,用于图像识别和自然语言处理等任务。
- 时间序列分析:卷积可用于平滑或滤波时间序列数据。