计算机视觉入门到实战系列(二)认识各种卷积核

认识各种卷积核

1. 冲激核(Impulse Kernel / Dirac Delta)

基本概念

冲激核是最简单的卷积核,其核心特征是:只有一个元素为1,其余全为0

常见形式

python 复制代码
# 一维冲激核(中心在中间)
[0, 0, 1, 0, 0]

# 一维冲激核(中心在第一个位置)
[1, 0, 0, 0, 0]

# 二维冲激核(3x3)
[[0, 0, 0],
 [0, 1, 0],
 [0, 0, 0]]

物理意义

冲激核代表一个理想的、瞬时的冲击。在信号处理中,它类似于:

  • 拍照时的瞬间闪光
  • 敲击钟的瞬间
  • 电路中的瞬时电压脉冲

卷积效果:身份变换

当一个信号与冲激核卷积时,输出信号就是输入信号本身(可能有位移):

python 复制代码
# 示例
输入信号: [1, 2, 3, 4, 5]
冲激核:  [0, 0, 1, 0, 0]  # 1在第3个位置

卷积结果: [0, 0, 1, 2, 3, 4, 5, 0, 0]
         ↑  ↑           ↑  ↑
         填充影响      填充影响
# 中间部分 [1, 2, 3, 4, 5] 就是原始信号

数学特性

  1. 位移性:冲激核的位置决定了信号的位移量
  2. 筛选性 :在离散信号中,∑(信号[n] × 冲激核[n-k]) = 信号[k]
  3. 单位元:卷积运算中的"1",任何信号与冲激核卷积都得到自身

在你的代码中

python 复制代码
k = [0, 0, 1, 0, 0]  # 这就是一个冲激核
conv = conv_1d(a, k)  # 输出基本是a的延迟版本

2. 方波信号核(Box Kernel / Moving Average Kernel)

基本概念

方波核的所有非零元素值相同(通常为1或1/N),形状像矩形。

常见形式

python 复制代码
# 一维方波核(长度5)
[1, 1, 1, 1, 1]           # 未归一化
[0.2, 0.2, 0.2, 0.2, 0.2] # 归一化(和为1)

# 一维方波核(长度3)
[1/3, 1/3, 1/3]

# 二维方波核(3x3)
[[1/9, 1/9, 1/9],
 [1/9, 1/9, 1/9],
 [1/9, 1/9, 1/9]]

物理意义

方波核代表一个均匀、持续一段时间的作用。在信号处理中,它类似于:

  • 取一段时间内的平均值
  • 摄像机长时间曝光
  • 低通滤波器

卷积效果:平滑/模糊

当一个信号与方波核卷积时,输出是输入信号的局部平均

python 复制代码
# 示例
输入信号: [1, 2, 3, 4, 5, 6, 7, 8, 9]
方波核(长度3): [1/3, 1/3, 1/3]

卷积计算(简化):
输出[0] = (0+1+2)/3 = 1.0  # 边界有填充
输出[1] = (1+2+3)/3 = 2.0
输出[2] = (2+3+4)/3 = 3.0
输出[3] = (3+4+5)/3 = 4.0
输出[4] = (4+5+6)/3 = 5.0
...
# 原始信号的尖锐变化被平滑了

数学特性

  1. 平滑性:去除高频噪声,保留低频趋势
  2. 低通滤波:让低频信号通过,阻挡高频信号
  3. 平均值:每个输出点是输入局部窗口的算术平均

3. 对比表格

特性 冲激核 方波核
形状 只有一个尖峰 矩形平台
元素值 一个1,其余0 所有非零元素相等
归一化 通常不归一化 通常归一化(和为1)
卷积效果 身份变换(复制信号) 平滑/模糊(平均信号)
频率响应 全通(所有频率无改变) 低通(衰减高频)
数学作用 单位元:f * δ = f 局部积分/平均
常用名 Dirac delta, Impulse Box filter, Moving average
时间复杂度 O(n)(快速) O(n×k)(较慢,k是核大小)

4. 实际应用示例

冲激核的应用

python 复制代码
# 1. 信号延迟
impulse = [0, 0, 1, 0, 0]  # 延迟2个单位
# 输出信号 = 输入信号向右移2位

# 2. 系统识别
# 给系统一个冲激输入,观察输出(冲激响应)
# 冲激响应完全描述了一个线性时不变系统

# 3. 采样
# 冲激核可以用于采样信号

方波核的应用

python 复制代码
# 1. 降噪(平滑)
box_kernel = [0.2, 0.2, 0.2, 0.2, 0.2]
# 输出信号 = 输入信号的5点移动平均

# 2. 图像模糊(2D方波核)
# 每个像素变为周围像素的平均值

# 3. 趋势提取
# 去除短期波动,显示长期趋势

当然有!卷积核的世界非常丰富,不同的核可以实现完全不同的效果。让我介绍几种最常见和重要的卷积核:

5. 高斯核(Gaussian Kernel)

特点

  • 钟形曲线,中间值大,向边缘逐渐减小
  • 非常自然的平滑效果,优于方波核

形式示例

python 复制代码
# 一维高斯核(σ=1,长度5)
[0.054, 0.242, 0.399, 0.242, 0.054]  # 近似值

# 二维高斯核(3x3)
[[0.075, 0.124, 0.075],
 [0.124, 0.204, 0.124],
 [0.075, 0.124, 0.075]]

效果

  • 更自然的模糊:保留更多原始信号特征
  • 各向同性:二维高斯核在各个方向效果相同
  • 分离性:二维高斯卷积 = 两次一维高斯卷积
python 复制代码
# 高斯核 vs 方波核对比
信号: [0, 0, 0, 1, 0, 0, 0]
方波核输出: [0, 0, 0.33, 0.33, 0.33, 0, 0]  # 突然开始,突然结束
高斯核输出: [0, 0.05, 0.24, 0.42, 0.24, 0.05, 0]  # 平滑过渡

6. 梯度核 / 边缘检测核

Sobel 算子

检测图像边缘,对噪声不敏感

python 复制代码
# 水平方向(检测垂直边缘)
Sobel_x = [[-1, 0, 1],
           [-2, 0, 2],
           [-1, 0, 1]]

# 垂直方向(检测水平边缘)
Sobel_y = [[-1, -2, -1],
           [ 0,  0,  0],
           [ 1,  2,  1]]

Prewitt 算子

更简单的边缘检测

python 复制代码
Prewitt_x = [[-1, 0, 1],
             [-1, 0, 1],
             [-1, 0, 1]]

拉普拉斯核(Laplacian)

检测二阶导数,对噪声敏感但能检测细边缘

python 复制代码
# 4邻域
Laplacian_4 = [[0, -1, 0],
               [-1, 4, -1],
               [0, -1, 0]]

# 8邻域
Laplacian_8 = [[-1, -1, -1],
               [-1, 8, -1],
               [-1, -1, -1]]

7. 锐化核

增强图像细节,与模糊相反

python 复制代码
# 基本锐化核
Sharpen = [[0, -1, 0],
           [-1, 5, -1],
           [0, -1, 0]]

# 更强的锐化
Strong_Sharpen = [[-1, -1, -1],
                  [-1, 9, -1],
                  [-1, -1, -1]]

# 使用拉普拉斯的锐化(非锐化掩模)
# 原图 + (原图 - 模糊图) = 锐化图

8. 浮雕核(Emboss)

产生3D浮雕效果

python 复制代码
Emboss = [[-2, -1, 0],
          [-1, 1, 1],
          [0, 1, 2]]

9. 自定义核示例

python 复制代码
# 运动模糊核(对角线方向)
Motion_Blur = [[1/9, 0, 0, 0, 0],
               [0, 1/9, 0, 0, 0],
               [0, 0, 1/9, 0, 0],
               [0, 0, 0, 1/9, 0],
               [0, 0, 0, 0, 1/9]]

# 轮廓核(Outline/Edge Detection)
Outline = [[-1, -1, -1],
           [-1, 8, -1],
           [-1, -1, -1]]

10. 深度学习中的特殊核

空洞卷积核(Dilated Kernel)

增加感受野而不增加参数

python 复制代码
# 普通3x3卷积
[[1, 1, 1],
 [1, 1, 1],
 [1, 1, 1]]

# 空洞率=2的3x3卷积(实际5x5的感受野)
[[1, 0, 1, 0, 1],
 [0, 0, 0, 0, 0],
 [1, 0, 1, 0, 1],
 [0, 0, 0, 0, 0],
 [1, 0, 1, 0, 1]]

可分离卷积核

python 复制代码
# 一个3x3卷积可以分解为3x1和1x3的乘积
# 减少计算量,常用于深度可分离卷积

11. 完整演示代码

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
from scipy.ndimage import convolve1d

# 创建测试信号
t = np.linspace(0, 10, 100)
signal_data = np.sin(t) + 0.3*np.sin(5*t) + 0.1*np.random.randn(100)

# 定义不同的核
kernels = {
    'Impulse': [0, 0, 1, 0, 0],
    'Box (5-point)': [0.2, 0.2, 0.2, 0.2, 0.2],
    'Gaussian (σ=1)': [0.054, 0.242, 0.399, 0.242, 0.054],
    'First Derivative': [-0.5, 0, 0.5],  # 一阶导数
    'Second Derivative': [1, -2, 1],  # 二阶导数
}

# 应用不同核
plt.figure(figsize=(12, 10))

# 原始信号
plt.subplot(len(kernels)+1, 1, 1)
plt.plot(t, signal_data, 'k-', linewidth=2, label='Original Signal')
plt.title('Original Signal with Noise')
plt.legend()
plt.grid(True, alpha=0.3)

# 各个核的效果
for i, (name, kernel) in enumerate(kernels.items(), 2):
    # 卷积操作
    if name == 'First Derivative' or name == 'Second Derivative':
        # 对导数核使用valid模式避免边界效应
        result = np.convolve(signal_data, kernel, mode='valid')
        t_result = t[len(kernel)//2:len(kernel)//2+len(result)]
    else:
        result = np.convolve(signal_data, kernel, mode='same')
        t_result = t
    
    plt.subplot(len(kernels)+1, 1, i)
    plt.plot(t_result, result, 'b-', linewidth=1.5, label=f'{name} Kernel')
    plt.title(f'{name} Kernel Output')
    plt.legend()
    plt.grid(True, alpha=0.3)
    
    # 显示核的值
    kernel_str = ', '.join([f'{x:.3f}' for x in kernel])
    plt.text(0.02, 0.85, f'Kernel: [{kernel_str}]', 
             transform=plt.gca().transAxes, fontsize=9)

plt.tight_layout()
plt.show()

# 可视化二维卷积核的效果
def visualize_2d_kernels():
    kernels_2d = {
        'Identity': np.array([[0, 0, 0], [0, 1, 0], [0, 0, 0]]),
        'Box Blur': np.ones((3, 3)) / 9,
        'Gaussian Blur': np.array([[1, 2, 1], [2, 4, 2], [1, 2, 1]]) / 16,
        'Sobel X': np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]),
        'Sobel Y': np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]),
        'Sharpen': np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]),
    }
    
    fig, axes = plt.subplots(2, 3, figsize=(12, 8))
    axes = axes.flatten()
    
    for idx, (name, kernel) in enumerate(kernels_2d.items()):
        ax = axes[idx]
        im = ax.imshow(kernel, cmap='RdBu', vmin=-2, vmax=5)
        ax.set_title(name)
        ax.set_xticks([])
        ax.set_yticks([])
        
        # 在格子上显示数值
        for i in range(kernel.shape[0]):
            for j in range(kernel.shape[1]):
                value = kernel[i, j]
                color = 'white' if abs(value) > 1 else 'black'
                ax.text(j, i, f'{value:.2f}', ha='center', va='center', 
                       color=color, fontsize=10, fontweight='bold')
    
    plt.suptitle('Common 2D Convolution Kernels', fontsize=16)
    plt.tight_layout()
    plt.show()

visualize_2d_kernels()

12. 核的分类总结

类型 主要核 数学特性 应用场景
平滑/模糊 方波核、高斯核 低通滤波,∑元素=1 降噪、抗锯齿
边缘检测 Sobel、Prewitt、Laplacian 高通滤波,∑元素≈0 特征提取、轮廓检测
锐化 锐化核、非锐化掩模 增强高频,中心值大 细节增强、图像清晰化
特效 浮雕核、运动模糊 特殊模式 艺术效果、模拟运动
基础 冲激核(单位核) δ函数,卷积单位元 系统分析、基准测试

13. 选择核的指导原则

  1. 任务目标决定核类型

    • 降噪 → 平滑核(高斯最优)
    • 边缘检测 → 梯度核
    • 图像增强 → 锐化核
  2. 核大小的影响

    • 核越大,效果越强,但计算量越大
    • 通常奇数大小(3, 5, 7...)
  3. 归一化考虑

    • 平滑核通常归一化(和为1)
    • 边缘检测核通常和为0
    • 锐化核中心值>1,周围为负
  4. 对称性

    • 对称核:各向同性效果
    • 非对称核:方向敏感

14. 实际应用建议

python 复制代码
# 实际应用中,我们经常组合使用核
def advanced_edge_detection(image):
    # 1. 先用高斯核降噪
    blurred = convolve2d(image, gaussian_kernel(3, sigma=1))
    
    # 2. 再用Sobel检测边缘
    edges_x = convolve2d(blurred, sobel_x)
    edges_y = convolve2d(blurred, sobel_y)
    
    # 3. 计算梯度幅值
    edges = np.sqrt(edges_x**2 + edges_y**2)
    
    return edges

# 或者在深度学习中,让网络自己学习核参数
# 这就是CNN卷积层的工作原理!

关键理解 :不同的卷积核本质上是不同的特征提取器。在深度学习中,CNN会自动学习最适合任务的卷积核参数,而不需要手工设计。

相关推荐
珂朵莉MM2 小时前
全球校园人工智能算法精英大赛-产业命题赛-算法巅峰赛 2025年度画像
java·人工智能·算法·机器人
墨染天姬2 小时前
【AI】各类型开源模型排行
人工智能·开源
linmoo19862 小时前
Langchain4j 系列之十一 - 工具调用(AI Services)
人工智能·langchain·工具·langchain4j·toolcall·tool calling
weixin_549808362 小时前
2025 AI 现状深度洞察:从实验试点到组织重塑的跨越
人工智能
新智元3 小时前
全球第二易主,谷歌逆袭登顶!OpenAI 500 亿股票池曝光,Ilya 躺赚 40 亿
人工智能·openai
新智元3 小时前
1 人顶 1 个 Infra 团队!OpenAI 前 CTO 新招,让大模型训练跌成白菜价
人工智能·openai
俊哥V3 小时前
[深度分析]英伟达发布新一代 AI 芯片架构 Vera Rubin:AI 算力进入“成本—规模曲线重构”的关键时刻
人工智能·ai
摆烂咸鱼~3 小时前
机器学习(9-1)
人工智能·机器学习
AI指北3 小时前
AI速递 | 黄仁勋CES2026演讲:物理AI的“ChatGPT时刻”即将到来!
人工智能
梦梦代码精3 小时前
一个让 AI 应用“快速上线+私有部署+商业变现”的开源方案
人工智能·开源