当信号与系统遇见深度学习:我用傅里叶变换和拉普拉斯算子,看懂了CNN的本质

前言

最近在做一个信号与系统课程设计,题目是“基于CNN的人物图像特征提取——傅里叶变换与拉普拉斯变换的深度学习应用”。说实话,一开始看到这个题目我是懵的——傅里叶、拉普拉斯,这不是经典信号处理的内容吗?跟深度学习有什么关系?

但做完整个实验后,我发现了一个让我豁然开朗的事实:CNN里的卷积核,本质上就是一组“可学习的滤波器”,而傅里叶变换和拉普拉斯算子,正是理解这一切的钥匙

这篇文章,我想把这个思考过程分享出来。如果你也在学信号与系统,或者刚开始接触CNN,希望能帮你打通两个知识体系之间的“任督二脉”。


一、信号与系统课里,我们学了什么?

信号与系统课程的核心思想其实很简单:把一个信号从不同角度去看

  • 时域:信号随时间怎么变化。
  • 频域:信号由哪些频率成分组成。

傅里叶变换帮我们从时域跳到频域:

[F(u,v) = \sum_{x=0}{M-1}\sum_{y=0}{N-1} f(x,y) e^{-j2\pi(ux/M + vy/N)}]

拉普拉斯变换更进一步,引入复频率 ( s = \sigma + j\omega ),在图像处理里,它的离散形式就是大家熟知的拉普拉斯算子

在这里插入图片描述

在数字图像里,一个经典的拉普拉斯核(4邻域)长这样:

[[ 0,  1,  0],
 [ 1, -4,  1],
 [ 0,  1,  0]]

这个核的作用是什么?——边缘检测。它本质上是一个高通滤波器,能放大图像中灰度变化剧烈的地方。

而CNN的第一层卷积核,很多也长得像边缘检测算子。这难道是巧合吗?

二、实验一:用傅里叶变换“看”图像的频率

我们先拿一张人物图像(分辨率1080×1502),做二维离散傅里叶变换(2D-DFT)。

原始灰度图 → 幅度谱(对数变换后) → 相位谱

幅度谱的中心是低频成分(平滑区域),四周是高频成分(边缘、细节)。相位谱则保留了图像的结构信息。

接下来构造理想低通滤波器(截止半径80像素)和高通滤波器,分别乘到频域上,再反变换回空域:

  • 低通滤波:图像变模糊,去除了噪声和细节。
  • 高通滤波:只留下边缘和纹理,背景几乎消失。

这就是卷积定理的直观体现:
在这里插入图片描述

空域的卷积,等于频域的乘积。而CNN里的卷积层,做的就是这件事——只不过滤波器 ( h ) 不是手工设计的,而是从数据中学出来的。

三、实验二:用拉普拉斯算子检测边缘

拉普拉斯算子是二阶微分算子,对噪声敏感,所以实际常用**高斯-拉普拉斯(LoG)**先平滑再求导。

我们对比了三种算子:

  1. 4邻域拉普拉斯:对水平和垂直边缘敏感。
  2. 8邻域拉普拉斯:对斜向边缘也敏感。
  3. LoG(σ=2):边缘更干净,噪声抑制好。

实验结果(详见报告图3-1):

  • 拉普拉斯边缘图:白色表示正响应,黑色表示负响应。
  • 锐化图像:原图减去拉普拉斯结果,轮廓变得清晰。

这些手工设计的核,虽然效果不错,但固定、不灵活。而CNN可以学到成千上万种不同的“拉普拉斯”变体。

四、实验三:看CNN到底学到了什么

我搭建了一个简单的三层卷积网络:

Conv1: 1 → 16 通道, 3×3 核, + BatchNorm + ReLU + MaxPool
Conv2: 16 → 32 通道, 3×3 核, + BN + ReLU + MaxPool
Conv3: 32 → 64 通道, 3×3 核, + BN + ReLU + MaxPool

训练前,我首先好奇:这个模型在毫无训练的情况下,卷积核是随机的,能提取特征吗?
在本次课设里,我们没有进行训练,只是随机初始化。但即便如此,当我们可视化这些随机核时,发现很多核已经表现出类似边缘检测的模式(比如中间亮、四周暗,或者方向性的梯度)。

更有趣的是,即使随机初始化,各层的特征图也呈现出层次化的结构

  • Conv1的特征图:保留了较多的空间细节,响应边缘和纹理。
  • Conv2的特征图:开始出现重复模式,更抽象。
  • Conv3的特征图:分辨率降低,但语义信息更强(比如对人物轮廓、头发区域有选择响应)。

如果把Conv1的16个卷积核画出来(图4-3),你会发现——它们和拉普拉斯算子、Sobel算子、Gabor滤波器有极高的相似度:有的像水平边缘检测器,有的像垂直边缘检测器,有的像斑点检测器。

这说明了什么?CNN不是在“发明”新的操作,而是在学习信号处理里已有的“原子滤波器”,只是它们的形式更丰富、更适应数据

五、核心洞察:卷积定理是连接经典与现代的桥梁

我把整条思考链路画成了演进图(图5-1):

  1. 手工频域滤波(傅里叶高通) → 2. 手工空域微分核(拉普拉斯)
    → 3. CNN第一层学习到的边缘检测核 → 4. CNN深层学习到的语义特征

每一步,卷积定理都在背后起作用:

在这里插入图片描述

传统方法手工设计 ( F_{\text{kernel}} ),而CNN用反向传播自动调整它。

更形象一点:CNN的第一层就是在学傅里叶频域里的“通带形状”,高层则在学组合这些基元来构建更复杂的模式

从这个角度看,深度学习并没有“推翻”经典信号处理,而是把它推广到了极致——用数据驱动的方式,在高维空间里做自适应滤波。

六、一些实验代码片段

整个实验用Python完成,主要依赖:

  • numpy, scipy:傅里叶变换、LoG滤波。
  • opencv-python:图像读写、基础滤波。
  • torch:CNN定义与特征可视化。
  • matplotlib:绘制所有图表。

下面贴几个关键片段(完整代码见课设报告附录):

6.1 二维傅里叶变换与滤波

import numpy as np
import cv2
from scipy import ndimage

def fourier_analysis(img_gray):
    # DFT
    f = np.fft.fft2(img_gray)
    fshift = np.fft.fftshift(f)
    magnitude = np.log(np.abs(fshift) + 1)
    phase = np.angle(fshift)
    
    # 理想低通
    rows, cols = img_gray.shape
    crow, ccol = rows//2, cols//2
    lowpass = np.zeros((rows, cols))
    cv2.circle(lowpass, (ccol, crow), 80, 1, -1)
    
    # 应用滤波
    f_low = fshift * lowpass
    img_low = np.abs(np.fft.ifft2(np.fft.ifftshift(f_low)))
    return magnitude, phase, img_low

6.2 拉普拉斯算子

kernel_lap4 = np.array([[0, 1, 0],
                        [1,-4, 1],
                        [0, 1, 0]])
lap4 = cv2.filter2D(img_gray, -1, kernel_lap4)

# LoG (高斯-拉普拉斯)
from scipy.ndimage import gaussian_laplace
log_result = gaussian_laplace(img_gray.astype(float), sigma=2.0)

6.3 CNN模型定义与特征提取

import torch.nn as nn

class SimpleCNN(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(1, 16, kernel_size=3, padding=1)
        self.pool1 = nn.MaxPool2d(2)
        self.conv2 = nn.Conv2d(16, 32, 3, padding=1)
        self.pool2 = nn.MaxPool2d(2)
        self.conv3 = nn.Conv2d(32, 64, 3, padding=1)
        self.pool3 = nn.MaxPool2d(2)
        self.relu = nn.ReLU()
    
    def forward(self, x, return_features=False):
        f1 = self.relu(self.conv1(x))
        x = self.pool1(f1)
        f2 = self.relu(self.conv2(x))
        x = self.pool2(f2)
        f3 = self.relu(self.conv3(x))
        if return_features:
            return f1, f2, f3
        return self.pool3(f3)

可视化特征图时,我们把每个卷积层的输出(batch=1)取前几个通道画出来。即使模型没训练,随机核也能产生有结构的响应。

七、最大收获:别把“信号与系统”和“深度学习”割裂开

很多同学学信号与系统时觉得“这玩意儿古老、数学多、没用”,学深度学习时又把它当成一个全新的黑盒。但这次课设让我深刻意识到:

  • 傅里叶变换告诉你:图像 = 频率的叠加。
  • 拉普拉斯算子告诉你:边缘 = 二阶导数的过零点。
  • CNN告诉你:这些操作可以组合、堆叠、自动化。

没有信号与系统的基础,你只能把卷积核当成一个“神奇的模板”,而理解了卷积定理,你就能从频域的角度去思考:为什么浅层学边缘,深层学语义? 本质上是因为多次卷积等价于频域多次乘积,相当于构造了更复杂的带通滤波器。

八、如果想继续深挖,可以做什么?

本次实验只用了随机初始化的CNN(未训练)。如果真正训练一个分类任务(比如人脸识别),观察训练前后卷积核的变化,会更有说服力。另外,还可以:

  • 对比手工设计的Gabor滤波器与CNN第一层核的相似度。
  • 梯度上升可视化每个卷积核最“喜欢”的模式。
  • 结合傅里叶域分析,计算每个卷积核的频响曲线,看它到底是低通、高通还是带通。

这些都能让经典理论与现代方法的联系更加紧密。


写在最后

这次课程设计让我对“信号处理”这门课彻底改观。它远不只是教我们算积分、拉普拉斯逆变换,而是在教我们用“变换”的眼光看问题。当我把这个眼光投射到CNN上时,很多以前觉得玄乎的东西,一下子变得清晰了。

如果你也在学这两门课,强烈建议找一张图片,自己动手:

  1. 做一次FFT,看看幅度谱和相位谱。
  2. 用拉普拉斯核做一次边缘检测。
  3. 搭一个最简单的CNN,把第一层卷积核画出来。

你一定会看到,它们之间那条隐秘而优美的连线。

附录:完整代码、所有实验结果图(傅里叶幅度谱、拉普拉斯边缘图、CNN核及特征图)已上传,见课程设计报告原文。


作者:陌生Boy
指导教师:GYY
课程:信号与线性系统分析课程设计
日期:2026年5月

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐