课堂学习篇。一、库函数1、已使用过1.matplotlib库import matplotlib.pyplot as pltMatplotlib 是 Python 最基础的绘图库pyplot模块提供了类似 MATLAB 的绘图接口。你可以用它来绘制折线图、散点图、柱状图、等高线图等各种静态、动态或交互式的图表并对坐标轴、标签、颜色等进行精细控制。2.numpy库import numpy as npNumPy 是 Python科学计算的核心库提供了高性能的多维数组对象ndarray以及大量的数学函数如线性代数、傅里叶变换、随机数生成等。几乎所有涉及数值计算或数据处理的任务都会用到它也是其他库如 Pandas、Matplotlib的基础。3.cv2库import cv2cv2 是OpenCV库的 Python 接口OpenCV 是一个专注于计算机视觉的开源库。它提供了数百种图像和视频处理函数例如图像读取/保存、滤波、边缘检测、特征匹配、人脸识别、视频分析等。常用于图像处理、机器视觉相关的项目。4.seabornimport seaborn as snsSeaborn 是基于 Matplotlib 的统计可视化库它提供了更高级的接口和更美观的默认样式能够快速绘制出具有统计意义的图表如热力图、分布图、分类散点图、回归图等。特别适合数据探索和展示统计关系。二、卷积的逻辑1、一维卷积1.卷积的引入思考卷积的概率目前为主我还没学到那么多对于卷积的理解还很有限理解的卷积是数字的相乘然后相加。一个就是数据的输入输入信号一个是卷积核。然后再根据步长进行相乘相加得到的输出信号数组就是卷积后的结果。比较抽象看到这里我对这个卷积产生了比较大的疑惑这个卷积是干什么的目前还是很疑惑。下面是问deepseek的结果卷积的核心思想是用一个模板卷积核去扫描数据计算局部相似性或混合信息从而提取出有用的特征或改变数据的形态。无论是在传统图像处理中手动设计滤波器还是在深度学习中让网络自动学习滤波器卷积都是一种强大的工具。同时卷积的结果大小意义完全由卷积核的使命决定可能是相似度可能是差异度也可能是某种加权平均值。2.卷积的计算模式简单的说一维卷积的计算结果分为4个步骤。步骤1输入信息步骤2输入卷积核步骤3反转卷积核步骤4输入信息与卷积核对于相乘然后相加。根据步长不同依次进行相加。下面为图片展示过程过程数字化计算过程卷积核为[0,1,2]反转后的数组为[2,1,0]。然后输入信号与反转数组相乘得到输出信号。3.实现代码import matplotlib.pyplot as plt # 一维卷积(convolution),dimensionality class conv_1d(): #类 类名 def__init__(self,a,b): #def函数__init__:构造函数 # 输入信号 self.a a # 卷积核 self.b b #输入信号坐标默认从0开始[0,a-1]:0,1,2,3... self.ax [i for i in range(len(a))] #卷积核坐标,默认从0开始 self.bx [i for i in range(len(b))] # 卷积函数 def conv(self): # 步骤1输入数据与卷积核 lst1 self.a lst2 self.b # 步骤2求输入数据与卷积核的长度 l1 len(lst1) l2 len(lst2) # 步骤3对输入信号进行两端补零 # 2端分别补l2-1个0 # 这样就可以把输入信号的所有值都进行卷积并且不影响卷积后的长度 # 否则直接把输入信号进行卷积会使输出信号越卷越短 lst1 [0]*(l2-1) lst1 (l2-1)*[0] # 步骤4:反转卷积核 lst2.reverse() # 步骤5:初始化卷积后结果(输出信号)列表,长度输入长度卷积核-1 c [0] * (l1l2-1) # 步骤6计算结果 for i in range(len(l1)): for j in range(len(l2)): # 注意前面补充的l2-1个0,不进入计算 c[i] lst1[ij]*lst2[j] return c # 输出函数 def plot(self): a self.a #输入信息 b self.b #卷积核 ax self.ax # 输入信息坐标 bx self.bx # 卷积核坐标 # 分别绘制a,b与他们卷积得到的信号 # 输入信号 plt.figure(1) #创建或绘制窗口1 plt.subplt((1,2,1) #在1行2列的子图中选择第一个位置 plt.title(Input) #题目 # bar:条形图显示离散点 plt.bar(ax,a,colorlightcoral,width0.2) #ax:输入信号坐标,a:输入数组下标。颜色宽度 plt.plot(ax,a,colorlightcoral) #连接离散点 # 卷积核 plt.figure(1) plt.subplot(1,2,2) #1行2类的第二个位置 plt.title(Kernel)# 题目 plt.bar(bx,b,colorlightgreen,width0.2) # 条形图显示离散点 #plt.plot(bx,b,colorlightgreen) # 输出信号 c self.conv() #调用卷积计算结果 length len(c) # 计算输出结果长度 cx [i for i in range(len(length))] # 生成结果坐标 plt.figure() # 新建图片 plt.title(Output) plt.bar(cx,c,colorlightseagreen,width0.2) plt.plot(cx,c,colorlightseagreen)# 定义输入信号 a [0,1,2,3,2,1,0] # 冲击函数卷积核 k [0,0,1,0,0] # 计算输出信号 conv conv_1d(a,k) conv.plot()4.运行结果5.卷积的性质当所用的卷积核是一个单位冲激信号即“面积”等于1只在一个位置出现的窄脉冲时输入信号在卷积之后并没有发生变化。这是卷积的一个重要性质。代码# 输入信号 a [0,1,2,3,2,1,0] # 方特信号卷积核全1 k [1,1,1,,1,1] # 输出信号 conv conv_1d(a,k) conv.plot()结果结论使用方特信号对一个三角信号进行卷积后其效果将三角波变得更加平滑了。2、二维卷积1.卷积计算过程2.零填充增加边缘数据的计算3.代码实现说明我们开始编写二维卷积。我们将对一张图像进行处理并直观的展示卷积前后图像的变化。和一维卷积类似也使用冲激信号和方波信号作为卷积核。大家注意代码中二维冲激信号和二维方波信号的实现。这里直接调用Python中的库函数cv2.filter2D()进行二维卷积操作。import matplotlib.ptplot as plt # 绘制图形 import numpy as np # 数学处理 import cv2 # 数字图像处理 import seaborn as sns # 绘制图形热力图 class conv_2d(): # 二维卷积类 # 构造函数 def __init__(self,image,kernel): self.img image self.k self.kernel def plot(self): # 展示输入图像 # [start:stop:step] # 将OpenCV默认的BGR格式图片转化为RGB格式 # imshow将图片画到画布上 plt.imshow(self.img[:,:,::-1] plt.axis(off) plt.title(Input) # show将画布图片展示到出来 plt.show() # 展示卷积核 fig plt.figure(figsize(2,1.5)) # 热图 sns.heatmap(self.k) plt.axis(off) plt.title(Kernel) def convolution(self,data,k): # 调用库函数进行卷积操作 return cv2.filter2D(data,-1,k) # 展示二维卷积效果 def plot_conv(self): # 调用卷积函数进行卷积 img_new convolution(self.img,self.k) # 卷积结果可视化 plt.figure() # 创建画布 plt.imshow(img_new[:,:,::-1] # 显示卷积后的图像 plt.title(Output) plt.axis(Off) return测试数据img cv2.imread(lena.jpeg) # 二维冲激卷积核 size 15 k1 np.zeros((size,size)) mid (size-1) // 2 k1[mid][mid] 1 # 二维卷积 conv conv_2d(img,k1) conv.plot() #conv.plot_conv()4.输出结果图片结论由结果可见用二维冲激函数对图像进行卷积得到的结果和原图是一样的。这与进行一维卷积得到的结果一致。# 二维方波卷积核 size 15 # 因为二维的核函数的大小是n*n的因此在实现方波信号时我们需要除以(size*size) k2 1/size/size * np.ones((size, size)) #请根据提示补全以下关键代码 # 展示输入图像与卷积核。1、创建卷积对象叫 conv2、弹出两张图1输入的 lena 原图2卷积核热力图整块都是均匀颜色因为所有值都一样。 conv conv_2d(img,k2) conv.plot() # 执行卷积并显示结果 conv.plot_conv()输出结果图片结论用方波信号作为卷积核对图像做卷积得到的结果是平滑模糊的图像这也与我们在一维卷积中的实验结果一致。这是不是有一些图像处理的味道了。3、习题练习1、题目说明习题参照一维卷积的实现编程实现二维卷积基于该实现完成以下任务。a.计算提供的图2-4中输入图像与卷积核卷积的结果以矩阵表示。b.计算提供的图2-5中零填充后的输入图像与卷积核卷积的结果以矩阵表示。c.使用提供的lena图像重现前面章节对图像卷积的实验并与使用库函数的实验进对比看效果是否一致。d.设计卷积核通过卷积将一幅图像往右下移动10像素。2、实现二维卷积