2024年,微小冷对Python科学计算技术进行了总结,并在科学计算、可视化、图像处理、点云处理等方面,以快速入门为目的,挑选出学习过程中最核心的知识主线,写成麻雀虽小五脏俱全的教程。
可视化
1 可视化初步
本讲先通过曲线绘图的基本案例,引入Python可视化的最简实践,接下来着重讲解两个内容
- Python绘制图像的基本流程:包括创建绘图窗口(fig)、添加绘图坐标系(ax)、在坐标系上绘制曲线、以及调用show显示图像。
- 图像中肉眼可见的设计元素,比如点型、线型、颜色、图例等。
2 子图绘制
本讲由浅入深,介绍了三种子图的布局方案
- 最简单的通过三个数字指定的规整的网格布局
- 多种不同分割方式的网格,一起完成一次布局
- 基于GridSpec,指定网格单元格的宽高比例,实现更灵活的子图布局,如让一个子图占据2/3的宽度。
3 坐标投影
所谓坐标投影,就是该便绘图内容在图窗中的透视,从而完成3D图像、极坐标以及地理空间映射等绘图需求。本节针对这三种情况,分别予以案例演示
- 三维坐标系下的曲线图:介绍了如何使用projection参数创建三维坐标系,以及 z z z轴的投影方法,并绘制三维曲线图。
- 极坐标系下的曲线图:通过设置projection为polar,可以绘制极坐标系下的曲线图。
- 地理坐标系下的曲线图:介绍了matplotlib支持的多种地理坐标系,并展示了如何使用不同的地理坐标系绘制世界地图。举例说明了不同的地理坐标系对世界地图的投影效果。
4 刻度设置
本节将目光聚焦到图像的刻度轴设置问题上,并着重讲解了四种刻度映射方案
- 将坐标轴映射为对数坐标
- 用自定义函数来重新映射坐标轴
- 重置刻度,用更加灵活的列表或者字符串来标记坐标轴
- 取消坐标轴
5 共享坐标
本节针对多坐标轴的设置进行了讲解,着重讲解三种情况
- 一个子图中的多组数据,彼此之间相差过大,从而设置多组坐标轴
- 一组数据,两套坐标,比如角度和弧度,从而需要设置多组数据。
- 多个子图之间存在坐标尺度上的关联,从而需要共享坐标轴。
6 颜色填充
本节针对常见的绘图元素——填充,进行展开说明,通过三个案例来透彻地讲解Python在绘图时遇到的颜色填充问题,并且从实用性出发,对回归图这种综合绘图类型予以示例。
7 文字和字体
本讲对图像中的字体设置进行了集中讲解,使得在绘图窗口中添加文字注释成为可能。
8 伪彩图和等高线图
前面几讲的内容,主要集中在曲线图的绘制,学会了曲线图,也就学会了一系列与曲线图逻辑相似的图像表达。而本讲则针对另一种绘图逻辑进行讲解,此即类矩阵图像。
除了这种绘图类型之外,还讲解了colorbar的设置方法,使得灵活设置colorbar成为矩阵图的标配。
9 三维绘图
尽管在讲解坐标投影时,已经提到了通过坐标映射的方式来绘制三维图像的方法,但并没有展开讲解三维图像的类型。本节针对三维散点图、曲面图、网格图以及三角面图进行了示例介绍,通过三个案例,来掌握三维绘图的方法。
10 动态绘图
本节是Python可视化的最后一讲,也是Matplotlib绘图中最炫酷的部分,动态绘图。本节通过三个案例,来由浅入深地讲解了Python动态绘图的主干。并且重点讲解animate绘制动图时的函数调用逻辑。
科学计算
数组
- ?数组
numpy是python中最常用的科学计算包,而数组则是是numpy的核心类型,也是Python称为科学计算领域首选语言的关键类型,可以不夸张地说,正是数组类型的强大与易用性,筑就了Python帝国。本节作为一个番外,或者说预备知识,介绍一些数组中最基础的概念和操作。
数据生成
- ?数据生成
正所谓巧妇难为无米之炊,没有数据,也就没法对数据进行分析,从而数值计算也就成了无根之木了。所以,本节就介绍一些数据生成方法,主要分为两种数据
- 常见序列,比如自然数列、等差数列、等比数列
- 常用矩阵,比如单位阵、对角阵、坐标网格等
读写二进制和文本文件
在实际工作中,很多数据是由其他软硬件设备产生的,如果想要处理,就要学会读取。如果处理结果需要保存,那么也需要将Python内存中的数据写入到硬盘上。numpy中提供了一些文件交互函数,用于外部数据的读取和存储。本节介绍三种数据类型的读写操作
- 文本文件
- 二进制文件
- numpy的二进制文件:npy
微积分
- ?微积分
微积分是现代科学最基础的数学工具,而其离散形式就是差分和求和。本文除了讲解差分、求和之外,还对积分、多重积分的精确数值求解函数进行了讲解。
插值
- ?插值
插值的目的是估计或“插”出一个函数在某些未知点上的值,这些未知点位于已知数据点的范围内,常用于填充空白数据,以便进行更平滑的数据分析和可视化。本文介绍了一元插值和多元插值,并且对不同次数的插值效果进行了对比,诸如零次插值、线性插值、二次插值、三次插值等。
数据拟合
- ?拟合
所谓数据拟合,就是用一个系数待定的函数表达式,尽可能地逼近给定的一组数据。本节由浅入深地介绍了多项式拟合、非线性拟合以及多元非线性拟合。
傅里叶变换
- ?FFT
傅里叶变换是一种重要的数学工具,是信号处理的基石,通过时域和频域的相互转换,将一个复杂的信号分解为一系列三角函数的叠加。文章解释了如何使用傅里叶变换将复杂信号分解为三角函数,并展示了如何通过滤波和频域分析来处理信号。
卷积
- ?卷积
本节对卷积的概念进行了介绍,并针对Python不同库中提供的一维和多维卷积函数进行了详细讲解,尤其对卷积过程中出现的边缘效应极其克服方法进行了说明。
滤波
- ?滤波
数据滤波的目的,是把混杂甚至淹没在噪声中的信号提取出来。本节介绍了三种不同的滤波思想和方法,即维纳滤波、巴特沃斯滤波器以及排序滤波。
基础统计
- ?统计
分析统计特征是数据分析过程中必不可少的一步,本节对Python中提供的基础统计函数进行了降级,并且介绍了Python中最具统计风格的模块Pandas,及其可视化软件PandasGUI,让你可以像操作Excel一样操作Pandas。
线性代数
- ?线性代数
矩阵是线性代数的核心对象,是由m mm行n nn列的数组成的矩形数阵,从编程的角度理解,就是二维数组。在Numpy中,数组支持元素之间的各种运算,也支持与单个数值的各种运算。本节介绍了线性代数中常见的一些运算,比如矩阵乘法,并且展开讲解最小二乘法的矩阵化过程。
图像处理
1 初步
- ?初步
图像的本质就是矩阵,图像处理,也就是矩阵处理。所以,在Python中,numpy和matplotlib可以完全胜任最简单的图像处理工作。本节介绍了图像处理的基础流程:读取图片、灰度映射、展示图片以及图像保存。
2 光斑分析
- ?光斑分析
光斑是工程中经常出现的图像数据,其特点是目标明确,分布清晰。对光斑图像的分析,主要包括质心定位、目标截取以及半径拟合等。由于图像是二维数组,有两个可以操作的方向,故而除了全局的质心外,其每一行或每一列均有一个质心,行质心和列质心的交叉点,就是图像的质心,图像如下,左侧为原始光斑,右侧为其行质心和列质心。
3 插值变换
- ?插值变换
尽管numpy提供了一些矩阵函数,但图像处理是一个十分浩瀚的领域,numpy的体量显然有些不够。相比之下,【scipy】封装了【ndimage】模块,即专用的多维数组处理模块,自然也涵盖了二维图像的处理。ndimage中提供了对数组进行平移、缩放以及旋转操作的函数,分别是shift, zoom, rotate,可以实现下面的变换效果。
4 形态学处理
最基础的形态学操作有四个,分别是腐蚀、膨胀、开计算和闭计算,【scipy.ndimage】分别实现了二值数组和灰度数组的这四种运算。而针对灰度图像,【scipy.ndimage】还提供了礼帽、黑帽、形态学梯度和拉普拉斯梯度等操作。
5 滤波
- ?滤波
所谓滤波,在图像处理中往往表示特定模板下的卷积运算,其功能有二,一是用于边缘检测,二是用于数据平滑。图像边缘往往变化比较剧烈,相应地其导数的绝对值也就更大,换言之,对图像进行求导,可以增强边缘处的变化,从而起到边缘检测的效果。
6 opencv初步
opencv是跨平台图像处理库,为许多编程语言提供了接口,Python自然在列,但在使用pip安装时需要注意install的是【opencv-python】。
作为专业的图像处理库,opencv自然也提供了读取、处理、显示以及保存图片的全流程功能,此外还可以打开摄像头。
7 相机校准
- ?相机校准
相片是三维世界在二维平面上的投射,故而其深度信息是损失掉了的。但是,如果把拍照看作理想的小孔成像过程,那么相片中的每个像素,都将通过一个锥体与世界中真实的点一一对应,这时如果再来一条参考光线,那么理论上就可以实现二维图像的三维重构了。
8 图像分割
- ?图像分割
opencv提供了多种二值化分割方案,除了可以指定阈值之外,还支持OTSU算法以及自适应阈值算法。此外,还可以通过距离变换,对图像的前景、背景进行分割。并且提供了连通域函数,可以将前景中联通的目标一一分割出来。
其中,三个主要的函数是【adaptiveThreshold】、【distanceTransform】以及【connectedComponents】。
9 边缘检测
- ?边缘检测
opencv中提供了多种边缘检测方法,除了经典的Canny算子,还实现了霍夫变换,用于检测直线和圆形的边界。这三个函数分别是【Canny】,【HoughLines】以及【HoughCircles】。
10 目标识别
- ?目标识别
在Python中实现目标识别任务,最常用的方法是调用dlib模块。其中提供了人脸检测和车辆检测的功能,通过人脸特征点的比对,可以根据特征点的距离完成人脸对比。
点云处理
1 Open3d 初步
open3d是Python中最常用的点云模块,可用于读取、保存和显示点云。
2 点云变换
open3d的点云类提供了平移、缩放以及旋转的空间变换方法,可以实现如下转换。
3 点云配准
ICP, 即Iterative Closest Point, 迭代点算法,在使用ICP算法之后,两个点云的叠加图像变化如下。
4 曲面处理
最原始的点云只包含了点的位置信息,这些信息可以呈现出一些散点,但并不能还原出物体的样貌。相比之下,曲面更加完美地表现物体,我们平时看到的三维模型,实际上也是通过曲面来实现的。open3d对曲面对象也有着非常不错的支持,并提供了示例文件,如下图所示
5 点云分割
open3d封装了kd树、octree等数据结构,并提供了DBSCAN聚类、RANSAC平面分割算法。
评论记录:
回复评论: