当信号与系统遇见深度学习:我用傅里叶变换和拉普拉斯算子,看懂了CNN的本质
当信号与系统遇见深度学习:我用傅里叶变换和拉普拉斯算子,看懂了CNN的本质
前言
最近在做一个信号与系统课程设计,题目是“基于CNN的人物图像特征提取——傅里叶变换与拉普拉斯变换的深度学习应用”。说实话,一开始看到这个题目我是懵的——傅里叶、拉普拉斯,这不是经典信号处理的内容吗?跟深度学习有什么关系?
但做完整个实验后,我发现了一个让我豁然开朗的事实:CNN里的卷积核,本质上就是一组“可学习的滤波器”,而傅里叶变换和拉普拉斯算子,正是理解这一切的钥匙。
这篇文章,我想把这个思考过程分享出来。如果你也在学信号与系统,或者刚开始接触CNN,希望能帮你打通两个知识体系之间的“任督二脉”。
一、信号与系统课里,我们学了什么?
信号与系统课程的核心思想其实很简单:把一个信号从不同角度去看。
- 时域:信号随时间怎么变化。
- 频域:信号由哪些频率成分组成。
傅里叶变换帮我们从时域跳到频域:
拉普拉斯变换更进一步,引入复频率 ( s = \sigma + j\omega ),在图像处理里,它的离散形式就是大家熟知的拉普拉斯算子:
在数字图像里,一个经典的拉普拉斯核(4邻域)长这样:
[[ 0, 1, 0], [ 1, -4, 1], [ 0, 1, 0]]这个核的作用是什么?——边缘检测。它本质上是一个高通滤波器,能放大图像中灰度变化剧烈的地方。
而CNN的第一层卷积核,很多也长得像边缘检测算子。这难道是巧合吗?
二、实验一:用傅里叶变换“看”图像的频率
我们先拿一张人物图像(分辨率1080×1502),做二维离散傅里叶变换(2D-DFT)。
原始灰度图 → 幅度谱(对数变换后) → 相位谱
幅度谱的中心是低频成分(平滑区域),四周是高频成分(边缘、细节)。相位谱则保留了图像的结构信息。
接下来构造理想低通滤波器(截止半径80像素)和高通滤波器,分别乘到频域上,再反变换回空域:
- 低通滤波:图像变模糊,去除了噪声和细节。
- 高通滤波:只留下边缘和纹理,背景几乎消失。
这就是卷积定理的直观体现:
空域的卷积,等于频域的乘积。而CNN里的卷积层,做的就是这件事——只不过滤波器 ( h ) 不是手工设计的,而是从数据中学出来的。
三、实验二:用拉普拉斯算子检测边缘
拉普拉斯算子是二阶微分算子,对噪声敏感,所以实际常用**高斯-拉普拉斯(LoG)**先平滑再求导。
我们对比了三种算子:
- 4邻域拉普拉斯:对水平和垂直边缘敏感。
- 8邻域拉普拉斯:对斜向边缘也敏感。
- 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):
- 手工频域滤波(傅里叶高通) → 2.手工空域微分核(拉普拉斯)
→ 3.CNN第一层学习到的边缘检测核→ 4.CNN深层学习到的语义特征
每一步,卷积定理都在背后起作用:
传统方法手工设计 ( F_{\text{kernel}} ),而CNN用反向传播自动调整它。
更形象一点:CNN的第一层就是在学傅里叶频域里的“通带形状”,高层则在学组合这些基元来构建更复杂的模式。
从这个角度看,深度学习并没有“推翻”经典信号处理,而是把它推广到了极致——用数据驱动的方式,在高维空间里做自适应滤波。
六、一些实验代码片段
整个实验用Python完成,主要依赖:
numpy,scipy:傅里叶变换、LoG滤波。opencv-python:图像读写、基础滤波。torch:CNN定义与特征可视化。matplotlib:绘制所有图表。
下面贴几个关键片段(完整代码见课设报告附录):
6.1 二维傅里叶变换与滤波
importnumpyasnpimportcv2fromscipyimportndimagedeffourier_analysis(img_gray):# DFTf=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//2lowpass=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)))returnmagnitude,phase,img_low6.2 拉普拉斯算子
kernel_lap4=np.array([[0,1,0],[1,-4,1],[0,1,0]])lap4=cv2.filter2D(img_gray,-1,kernel_lap4)# LoG (高斯-拉普拉斯)fromscipy.ndimageimportgaussian_laplace log_result=gaussian_laplace(img_gray.astype(float),sigma=2.0)6.3 CNN模型定义与特征提取
importtorch.nnasnnclassSimpleCNN(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()defforward(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))ifreturn_features:returnf1,f2,f3returnself.pool3(f3)可视化特征图时,我们把每个卷积层的输出(batch=1)取前几个通道画出来。即使模型没训练,随机核也能产生有结构的响应。
七、最大收获:别把“信号与系统”和“深度学习”割裂开
很多同学学信号与系统时觉得“这玩意儿古老、数学多、没用”,学深度学习时又把它当成一个全新的黑盒。但这次课设让我深刻意识到:
- 傅里叶变换告诉你:图像 = 频率的叠加。
- 拉普拉斯算子告诉你:边缘 = 二阶导数的过零点。
- CNN告诉你:这些操作可以组合、堆叠、自动化。
没有信号与系统的基础,你只能把卷积核当成一个“神奇的模板”,而理解了卷积定理,你就能从频域的角度去思考:为什么浅层学边缘,深层学语义?本质上是因为多次卷积等价于频域多次乘积,相当于构造了更复杂的带通滤波器。
八、如果想继续深挖,可以做什么?
本次实验只用了随机初始化的CNN(未训练)。如果真正训练一个分类任务(比如人脸识别),观察训练前后卷积核的变化,会更有说服力。另外,还可以:
- 对比手工设计的Gabor滤波器与CNN第一层核的相似度。
- 用梯度上升可视化每个卷积核最“喜欢”的模式。
- 结合傅里叶域分析,计算每个卷积核的频响曲线,看它到底是低通、高通还是带通。
这些都能让经典理论与现代方法的联系更加紧密。
写在最后
这次课程设计让我对“信号处理”这门课彻底改观。它远不只是教我们算积分、拉普拉斯逆变换,而是在教我们用“变换”的眼光看问题。当我把这个眼光投射到CNN上时,很多以前觉得玄乎的东西,一下子变得清晰了。
如果你也在学这两门课,强烈建议找一张图片,自己动手:
- 做一次FFT,看看幅度谱和相位谱。
- 用拉普拉斯核做一次边缘检测。
- 搭一个最简单的CNN,把第一层卷积核画出来。
你一定会看到,它们之间那条隐秘而优美的连线。
附录:完整代码、所有实验结果图(傅里叶幅度谱、拉普拉斯边缘图、CNN核及特征图)已上传,见课程设计报告原文。
作者:陌生Boy
指导教师:GYY
课程:信号与线性系统分析课程设计
日期:2026年5月
