date
icon
password
博客链接
Pin
Pin
Hide-in-Web
Hide-in-Web
网址
type
slug
tags
category
bottom
bottom
Hide-in-Config
Hide-in-Config
comment
status
summary
📌
本页面主要是为了期末复习而整理的,数字图像处理是我在大三的一门专业选修课,这门课当时并没有在课上做相应的笔记,因为 ppt 中的内容都比较好理解。
不过趁现在还有些精力(或者说还记得),以期末考为契机将所有的知识都梳理一遍也是不错的。
这部分的笔记无法让你精通数字图像处理,甚至你看完以后也不能够用代码实现这些算法,但是至少能够让你对数字图像处理中的常用算法操作有一个大体上的认识和了解。如果你碰巧有学习这门课,这部分笔记一定能够让你对课程整体有个科普性的理解(高屋建瓴),对深入学习数字图像处理一定有帮助。
4.23,结课后过了大概三周半考试,考试我个人认为是比较容易的,所有考察的内容在下方的知识点中都有整理。南理电光选这门专业选修的友友们只需要上课的时候把重点听一听,结课后把下面的知识点看了就 OK 了。
复习大纲及课件
图像工程的层次
图像工程的内容非常丰富, 根据抽象程度和研究方法等的不同,可分为图像处理、 图像分析和图像理解三个层次。
图像工程是图像处理、图像分析和图像理解三者的有机结合。
notion image
图像处理:图像 → 图像;
图像分析:图像 → 数据;对图像中感兴趣的部分进行检测和测量;
图像理解:图像 → 具体含义;在图像分析的基础上,进一步对图像的内容进行理解,比如能够识别出图像里是一个人,是一辆车。
图像处理的基本概念
杆状细胞和锥体细胞的特点
杆状细胞和锥体细胞是人眼主要的感光细胞,在明暗场景下发挥作用。
杆状细胞是暗视觉细胞,在环境亮度比较低的时候,人眼主要依赖杆状细胞,帮助人眼适应暗的环境;
锥体细胞是明视觉细胞,在环境亮度比较高的时候,人眼主要依赖锥体细胞,帮助人眼应对亮的环境。
同时,锥体细胞能够识别出不同的颜色,而杆状细胞并不能分辨颜色。
RGB,HSI,CMY 颜色空间的特点
RGB 颜色空间: 以红、绿、蓝为三原色构成的加色模型,早期电视机的显示屏就是采用加色模型;
CMY 颜色空间:CMY 为 RGB 的互补色,CMY 模型是以青色、品红和黄色构成的减色模型,通常用于印刷和颜色混合;
HSI 颜色空间:基于色度(H)、饱和度(S)和亮度(I)构成的模型,能够模仿人眼的视觉感知。
数字化的步骤,采样频率,量化参数对图像质量的影响
图像数字化就是将图像转换为计算机能够识别和处理的模式,主要包括采样和量化两个步骤。
采样频率决定了采样点间隔的大小,采样频率越高,采样点间隔越小,采样越密集,图像的细节显示的就越好,图像质量越好;反之,若采样频率低,则块状效应显著,图像的细节和质量就越差。
量化参数指的是量化级数,量化级数越大(比如图像的量化级数为 256=,则图像中每个像素的取值范围就会是 0~255,使用 8 位的二进制即可表示每个像素,也称为是 8 bit 量化),图像每个像素所能表示的范围越大,图像层次会更加丰富,图像质量越好;反之,图像质量越差。
直方图及其特点
直方图反映的是各灰度级数的像素在图像中出现的频率,以灰度级数为横坐标,出现频率为纵坐标,就能够绘制出灰度直方图;
灰度直方图主要有以下三个特点:
  1. 灰度直方图能够用来表示像素灰度出现的频率,但是却不能够用于反映像素出现的位置;
  1. 一幅图像唯一对应一个灰度直方图,反之则不成立,一个灰度直方图可对应多幅图像;
  1. 一幅图像如果分为多个区域,那么每个区域的灰度直方图相加得出的灰度直方图与一幅完整图像得出的灰度直方图是一样的。
图像噪声及其分类和质量评价
一个系统的图像噪声按产生原因可分为外部噪声和内部噪声,外部噪声主要包括 EMI 电磁干扰、外部的电气设备干扰引起的噪声,内部噪声则包括系统内部器件机械运动、电源系统或设备的光电性质引起的噪声。
噪声的分类:
  1. 统计特性分。平稳噪声、非平稳噪声,高斯噪声、脉冲噪声。
  1. 产生过程分。椒盐噪声、量化噪声。
  1. 频谱分。白噪声、有色噪声。
图像质量评价:
  1. 客观评价。
  • 均方噪声(MSE)。
  • 信噪比(SNR)。
  • 峰值信噪比(PSNR)。
  1. 主观评价。
傅里叶变换
高低频代表什么,频谱图如何看
图像的高频代表的是图像的边缘信息,也就是图像的细节;图像的低频表示的是图像变换缓慢的区域。
图像直接经过 DFT 变换后,由于是以图像左上角为原点,因此高频成分会出现在窗口的中央,低频成分会分布在窗口的四个角落。为了方便图像高低频成分的查看,使直流成分集中在窗口中央,可以将窗口四个角落的低频成分移动到图像的中央。
notion image
DCT 变换的特点
DCT 变换指的是二维的离散余弦变换,利用的是正余弦的正交函数集进行运算,可以避免复杂的复数运算,提高频谱分析的效率;
DCT 变换具有信息强而集中的特点,且在编码过程中就可以实现信息的压缩,因此广泛应用于视频编码图像压缩中(在后面还会介绍到)。
图像增强
(分段)线性灰度变换
图像在拍摄时可能会由于过曝等原因造成图像的灰度范围很窄,分段灰度线性变换就是将感兴趣的灰度范围进行线性扩展,将不感兴趣的灰度范围进行抑制的技术。
将图像中的每一个像素值作为分段线性函数的横坐标,将得出纵坐标作为图像的新像素值。从下图中可以看出,该分段线性函数会将位于 (a, b) 的灰度范围扩展(比如将灰度值为 5~50 的灰度范围扩展为 15~150),而将位于 (0, a) 和 (b, Mf) 的灰度范围抑制(比如将灰度值为 50~255 的灰度范围压缩为 150~255).
notion image
直方图均衡化
直方图均衡化是将原图像的直方图通过变换函数修正为均衡的直方图。
直方图均衡化的原理
下面的原理可以结合后面均衡化的具体步骤来理解。
notion image
关于上述图像,我们需要先明确一点,上图参考的对象为连续图像,而我们研究的是数字图像,数字图像是离散的。
根据定义,我们实际上要做的就是图中所示的变换。其中右上角的图像表示的就是变换函数,右下角的图像表示的是原图像,左上角的图像是均衡化后的直方图。
右下角的图像理解:
  • 图像的横坐标表示的是归一化后的像素值(所谓的归一化就是将原来的 个像素级整合为 );
  • 图像的纵坐标 表示的是像素出现的频数。以数字图像举例,比如原图像的像素级为 8,原图像中像素值为 5 的像素个数为 20,共有 200 个像素,那么归一化后的像素值为 ,该像素值出现的频数为
左上角图像的理解:
  • 横坐标 表示的是均衡化后的图像中像素出现的频数。
  • 纵坐标 表示的是均衡化图像归一化后的像素值。
我们假定变换函数的表达式为 ,右下角的函数表达式为 p(r)。我们需要明确的是,变换前后函数的像素个数是不变的,也就是说变换前后 函数与坐标轴所谓的面积是不变的。于是,我们可以得出这个等式:
又由于均衡化后的图像的横坐标 是一个固定值(对于连续图像而言)(离散图像的 在某个固定值附近波动),因此
又因为 ,因此 ,即
也就是说, 之间满足关系:
这样,我们就得到了变换函数的表达式。只要我们知道原函数归一化后各像素级的概率分布,我们就得到了变换所需的分布函数。
由于数字图像中 是离散的,因此变换函数的表达式可以转换为:
直方图均衡化的步骤如下:
  1. 将像素值进行归一化操作,比如有 8 个像素,则归一化结果为 0, 1/7, 2/7, ..., 1
    1. notion image
  1. 根据原图像绘制灰度直方图,映射到归一化的直方图上,同时计算各个灰度级的像素个数 及概率分布
    1. notion image
  1. 根据各个灰度级的概率分布,得到累计概率分布 ,即当前灰度级的概率为当前灰度级及之前灰度级概率的和;
    1. notion image
  1. 四舍五入到不同的像素级(因为灰度最终是离散的,如果灰度值可以是连续的,那么 所对应的 都将是 1,即理想中的均衡化),即 0, 1/7, 2/7, ..., 1 中的哪个离得近就舍入为哪个值;
    1. notion image
  1. 将处于相同 下的像素值 合并为新的灰度级 ,比如 均为 6/7,因此合并后新灰度级的像素值为 656+329 = 985。
    1. notion image
  1. 根据新的灰度级绘制灰度直方图。
    1. 如上图所示,均衡化后的灰度直方图中 并不严格为同一个值,这是因为新灰度级仍然只能取特定的离散值 0, 1/7, ..., 1,而无法取 0.19, 0.44, ..., 1
卷积核
可以说,图像处理中的大部分算法都是通过卷积核来完成的,机器学习中也一样。卷积核与图像相互作用的过程可以这样理解:先将卷积核与图像对齐,将卷积核中的每个值与原图像中的对应像素点相乘,得到的结果作为卷积核中心所对应的图像像素点的新像素值。这里有一个小小的注意点,由于卷积核是从数学中抽象到图像处理里来的,因此实际上还需要将卷积核翻转个 180 度再与原图像相乘,但由于大部分卷积核都是对称的,因此你不翻转直接与原图像像素相乘也是可以的。
卷积操作中卷积核是以其中心进行移动的,卷积核中心对应哪个像素就是对哪个像素进行操作。
正常来说,我们需要在图像外围新增几圈像素值为 0 的点(具体加几圈得看卷积核的大小,3x3 的卷积核就加 1 圈),这样经过卷积操作后的图像与原图像的大小就是相同的了,否则操作后的图像会比原图像小个几圈(不过在像素值比较多的情况下也看不出来就是了)。
对于一个卷积核,我们要有一个直觉,卷积核中的每个值表示的都是权重(对新像素的影响程度),卷积核中心的值表示的是原像素对新像素的影响程度,卷积核中心值周围的点表示的是原像素周围的邻域像素对新像素的影响程度。因此卷积核一般都是奇数大小的,如 3x3,5x5,要保留中心像素的影响。
常用卷积核。
常用卷积核。
不同的卷积核参数可以实现不同的功能,在后面我们会慢慢体会到这一点。
空间域平滑、中值滤波、锐化
空间域平滑
图像平滑又称为是图像去噪,是为了抑制图像中存在的噪声而对图像进行的处理。
图像平滑主要是通过卷积操作来实现的,而数字图像中的卷积操作需要使用卷积核来完成。
图像平滑既可以在空间域中进行,也可以在频域中进行。空间域平滑方法主要有以下几种:
  1. 局部平滑法;
    1. 即图像的某个像素值由原图像中该像素点及及其周围邻域点的像素值相加后取平均得到,通常是取 3x3 的邻域,也就是说,新像素值由原像素值所在九宫格内的所有像素值相加后取平均。
      notion image
  1. 超限像素平滑法;
    1. 是局部平滑法的改进版,引入了阈值。这种方法会将原像素与九宫格内其他像素的平均值先作差取绝对值,将绝对值与阈值比较,如果小于阈值,则取原像素的值作为新像素值(保持不变),若大于阈值,则取平均值作为新像素值。这种方法能够有效的抑制椒盐噪声。
      notion image
  1. K 邻点平均法;
    1. 将原像素九宫格内与原像素像素值相近的 K 个像素值与原像素值相加后求平均。对于 3x3 窗口而言,k = 6 比较适宜。
      比如原像素值为 5,九宫格内的其他像素值为 [1, 2, 3, 4, 6, 7, 8, 9],则与 5 相近的 6 个像素值为 [2, 3, 4, 6, 7, 8],将这 6 个像素值与原像素值相加求平均即可。
中值滤波
中值滤波的原理与空间域平滑其实是一样的,只不过中值滤波采用的是滑动窗口,之所以称之为是滤波,是因为它可以将高频分量滤除而有效保留低频分量。
中值滤波能够有效抑制脉冲干扰和椒盐噪声,但不适用于点、线等细节较多的图像,因为它会将很多边缘信息当作是噪声给滤除了。
中值滤波的原理是利用一个特定大小的滑动窗口扫过图像,对滑动窗口内的像素值进行排序,取排序后像素的中值作为新的像素值。
一维中值滤波
一维中值滤波
在数字图像中,常采用二维滑动窗口对图像进行处理,二维滑动窗口的形状根据不同的需求来选择,常见的有以下几种:
notion image
从以往的经验看,方形或圆形窗口适宜于外轮廓线较长的物体图像,而十字形窗口对有尖顶角状的图像效果好。
(空间域)锐化
在实际应用中,常需要提取出图像的边缘进行观察,此时就需要利用图像锐化技术了。
在前面的空间域平滑过程中,主要采用的是积分求和的方式来计算新像素点;而图像锐化主要采用的是微分的方式(梯度)来计算新像素点,这样更有利于提取出边缘信息。
虽然图像锐化采用的是微分的方式,但新像素点的计算仍然是采用卷积核来进行。下面介绍几种常用的梯度算子(卷积核):
Roberts 梯度算子:
notion image
采用的是两个 2x2 大小的卷积核来计算新的像素点,空白处为 0。从卷积核中也能看出来,主要提取的是对角线方向的边缘。
Prewitt 梯度算子:
为了减小噪声对边缘提取的影响,Prewitt 对 Roberts 梯度算子进行了改进,将中心像素值的权重设置为 0,梯度算子如下所示:
notion image
Sobel 梯度算子:
Sobel 在 Prewitt 算子的基础上,进一步改进了算子,得到的图像如下:
notion image
三种锐化方法得出的图像:
notion image
频域增强
频域增强就是在频域中图像进行处理,噪声和边缘通常是图像中的高频信息。经过频域增强后的图像经过傅里叶逆变换就可以恢复为原图像。
如果想要消除图像中的噪声,可以采用低通滤波器对图像进行处理,理想的低通滤波器可以实现完美的截断,但是是物理不可实现的。而且理想的低通滤波器会产生振铃现象,常采用 n 阶巴特沃兹滤波器来实现图像的滤波。巴特沃兹滤波器的高低频之间过度相对平滑,一般采用幅度为 1/2 处所对应的频率作为巴特沃兹滤波器的截止频率。
notion image
如果想要提取出图像的高频分量(图像锐化),可以采用高通滤波器,高通滤波器也可以通过巴特沃兹滤波器实现。为了便于图像的观察,常会使用高通加强滤波来进行图像锐化,换一种说法就是给巴特沃兹滤波器一个向上的偏置,保留部分平滑区域的信息:
notion image
如果想要观察图像某个频带的信息,可以采用带通滤波器提取出来;如果不想要观察图像某个频带的信息,可以使用带阻滤波器提取出来。
同态滤波
由于一幅图像的像素 可以通过照明分量 和反射分量 的乘积来表示,即 ,因此可以使用两边取对数的方式将照明分量和反射分量分离开来,即
对取对数后的结果进行傅里叶变换后,会发现图像的频域由照明分量的频域与反射分量的频域叠加而成。图像的照明分量一般是低频分量,反射分量一般是高频分量。
同态滤波就是对照明分量和反射分量进行滤波的技术,可以增强图像的对比度,增强后的图像先经过傅里叶逆变换,再经过指数变换即可恢复。
代数运算
图像的代数运算指的就是将两幅或多幅图像的对应像素值进行加、减等代数运算,将运算后的值作为对应位置的新像素值。
图像减法:
将两幅图像相减,可以增强两幅图像中的差异部分。
notion image
图像加法:
将两幅图像进行加法运算,可以用于减小噪声,通过将短时间内拍摄的 N 幅图像相加后取平均可以将噪声减小 N 倍。
逻辑运算(与、或、非)
对图像进行与、或、非运算指的是对图像中的每个像素进行逻辑运算。
其中运算指的是将图像的每个像素按位取反,运算通常是在给定一个图像模板的情况下提取出原图像的子图像,突出图像内容。
对图像进行与运算。
对图像进行与运算。
复原重建
几何校正
几何校正是为了解决图像的几何失真问题,通过建立数学模型将几何失真后的图像与原图像进行对应,求解数学模型中的模型参数。
几何校正有两种方法:
  1. 空间坐标变换法;
  1. 灰度内插法。
空间坐标变换
这部分不是很懂。
空间坐标变换是以一幅图像为基准去校验另一幅图像的方式,将几何失真后的图像坐标与基准图像的坐标对应,通过求解变换系数来实现图像的恢复。
notion image
空间坐标变换分为直接法和间接法两种。
 
 
 
notion image
notion image
直接法是从畸变图像出发,根据已知点和上述函数关系式依次计算每个像素的校正坐标,将灰度值赋予对应像素。由于最后生成的图像像素分布是不均匀的,会出现像素挤压、疏密不均的情况,因此还需要进行像素内插。
notion image
notion image
间接法设恢复的图像像素在基准坐标系统为等距网格的交叉点,从网格交叉点的坐标(x,y)出发,根据已知点和上述函数关系式计算坐标 ,由于该坐标一般不为整数,不会位于像素中心,因此也许需要通过内插法来进行获得校正图像。但间接法的内插比直接法容易,因此间接法应用的更为广泛。
双线性内插法
双线性内插法本质上是利用一个像素周围的像素值来确定当前像素值的一种方法。
这个部分 ppt 中写的不是很清楚,我把上学期遥感图像处理的笔记中的推导拿过来了,这个推导描述的比较清楚。
推导利用的就是相似三角形来进行的,其中,底部的方形区域表示的是一个像素(虽然画的不太像,但它是一个边长为 1 的正方形):
notion image
几何变换
图像的几何变换包括图像的形状变换和图像的位置变换。图像的几何变换只涉及图像像素位置的变换,不涉及像素值的变化。
图像的形状变换
图像的形状变换包括图像的放大、缩小和错切。图像的形状变换通常在目标物识别中使用。
图像缩小其实就是对原图像的像素值进行挑选组合成缩小后的图像,最简单的方式就是等间隔选取数据。
图像缩小的算法
图像缩小的算法
图像放大看似是对图像缩小的反操作,但却比图像缩小复杂的多,图像放大需要对放大后图像多出的像素值进行插值操作,插值的过程是对信息进行估计的过程。
从简单的角度上来考虑,可以采用与图像缩小类似的算法来实现:
notion image
图像的错切变换实际上是三维图像投影到二维图像的一种操作,利用的数学模型和示例如下:
notion image
下面是 x 方向的错切,上面是 y 方向的错切
下面是 x 方向的错切,上面是 y 方向的错切
图像的位置变换
图像的位置变换包括图像的平移、镜像和旋转,位置变换过程中图像的形状不发生改变。
图像的平移操作很简单,就是将 x 方向和 y 方向的像素位置加上一个增量就行,数学模型如下:
x’ 和 y’ 表示的是平移后的位置。
x’ 和 y’ 表示的是平移后的位置。
📌
平移后的图像相比于原图像,画布要进行扩大,否则会造成信息的丢失。
图像的镜像操作包括水平镜像和垂直镜像两种,水平镜像是将图像上下颠倒,垂直镜像则是左右颠倒。
图像的镜像操作的数学模型也很简单,如果是水平镜像,则为:
notion image
如果是垂直镜像,则为:
notion image
但要注意的是,无论是水平镜像还是垂直镜像,在镜像结束后都需要对图像进行水平平移或是垂直平移,因为图像的像素位置不能是负数(图中的镜像公式会让像素位置变为负),因此需要平移图像高度的像素数或是图像宽度的像素数。
图像的旋转操作相对于平移和镜像而言需要考虑的问题比较多,主要利用的数学模型为:
notion image
由于上述公式中,计算出来的结果会使 x’ 和 y’ 为小数,同时图像的位置有可能会超出原来画布的大小,因此需要对图像进行前期处理。
图像的前期处理包括扩大画布、取整操作、平移处理。
扩大画布是为了避免图像的信息丢失,画布的扩大原则为以最小的面积承载所有的像素。画布扩大的一个思路为计算出旋转后 x’ 和 y’ 的最大值和最小值,将 x’ 的最大值和最小值相减得到画布的长,将 y’ 的最大值和最小值相减得到画布的宽。
在计算完图像新像素的所有位置后,要对位置进行取整操作,然后根据图像旋转选取的参考点对新图像进行平移。
在图像旋转后,得到的结果常与想象中的旋转是不一样的,因为进行取整操作后,旋转后的像素之间不一定是相邻的,还需要进行图像后处理
notion image
图像后处理就是对图像进行插值操作(通过增加分辨率来从整体上解决问题),将图像内部因旋转产生的空洞通过插值来填充。
notion image
图像的仿射变换(几何变换的通式)
图像的仿射变换是通过定义图像的齐次坐标来表示图像的像素位置的,齐次坐标相对于原坐标多出了一个维度,表示为 (wx, wy, w)。
可以通过下图所示的方式来理解图像的齐次坐标:
notion image
仿射变换的数学模型如下:
在仿射变换中,取第三个维度值为 1.
在仿射变换中,取第三个维度值为 1.
仿射变换其实可以作为图像变换的一个通式。
通过不同的 a, b, c, d 取值可以确定不同的图像变换操作,图像的平移和旋转操作表示如下:
notion image
图像的镜像操作表示如下:
notion image
图像的错切操作表示如下:
notion image
图像压缩
为什么要进行图像压缩?
由于数字图像需要的存储空间特别大,不利于存储和数据传输,为了尽可能减少图像的存储空间又不丢失或尽量少丢失图像的信息,就需要利用到图像压缩技术。
可以通过下面的示例来对图像的存储有一个了解:
相当于是 27 MB.
相当于是 27 MB.
由于彩色图像有三个通道(RGB),每个通道如果使用 8 位来表示,一个像素就需要 24 bits 的空间。
如果要存一个 40 秒长的视频,就要耗去我们 1 GB 左右的内存,大家想想如果按这样算,我们的手机能存几个视频。
为什么图像能够进行压缩?
由于图像中有大量的重复信息,也就是图像具有冗余度,因此可以针对图像的冗余度(包括数据冗余和视觉冗余)对图像进行压缩。
有损压缩和无损压缩
压缩是通过图像的冗余度进行的,冗余度包括数据冗余和视觉冗余。
数据冗余的消除可以通过改变图像信息的描述方式(编码)进行:
图像无损压缩的原理是将图像中相同的像素信息通过 数量+像素值 的方式来进行表示,而有损压缩的原理是将图像中相近的像素信息通过 数量+像素值 的方式来进行表示。
图像的无损压缩。
图像的无损压缩。
图像的有损压缩。
图像的有损压缩。
视觉冗余的消除可以通过适当的变换和数据重量化,做出一些视觉无法识别出来的变换,进行所谓的“有损压缩”

常用的编码方式如下:
notion image
RLE 编码(行程编码)
RLE,即 Run Length Encoding。典型的通过改变图像描述方式来进行压缩的方法。
行程编码是一种最为简单有效的编码方式,它的原理就是将一行中灰度值相同的相邻像素用一个计数值和该灰度值来表示(一维行程编码)。
示例:
一维行程编码。
一维行程编码。
二维行程编码是针对二维图像进行的编码方式,将二维图像的排列通过某种方式转换为一维排列,按照一维编码的方式进行编码。
常用的二维排列方式如下:
notion image
上述蛇形排列的好处是能够让尽可能多的相邻像素挨着,因为相邻像素之间的像素值相同的可能性更大,如果采用一行一行的方式排布,那么相邻像素像素值相同的可能性不大,压缩比小。
霍夫曼编码
霍夫曼编码本质上是行程编码的变式,它的改进之处在于为图像中出现频率更高的像素值分配比较短的位数进行编码,将出现频率比较低的像素值分配较多的位数进行编码。通过灵活的设置编码位数而非统一使用 8 位或 16 位可以增大图像的压缩比。
霍夫曼编码的步骤为:
  1. 首先求出图像的灰度直方图;
  1. 将灰度直方图按照频率由低到高进行排列;
  1. 构造霍夫曼二叉树对不同灰度级进行编码。每次从排列后的灰度直方图中选取两个出现频率最小的灰度级合并为一个节点。
  1. 对二叉树进行编码即可得到霍夫曼码字。
接下来通过一个示例来理解霍夫曼编码的过程:
对于下面的数据序列,已经求出了它的灰度直方图,并将各个灰度级的像素值(使用 a~f 替代)通过频率(概率分布)进行排列;
notion image
接下来就是构造霍夫曼二叉树,从低的频率(1/22)开始合并:
notion image
合并的过程为: 首先由于 1/22 小于 2/22 ,因此可以合并为 3/22;由于 3/22 与 3/22 相同,因此合并为 6/22;由于 6/22大于 4/22,因此 6/22 暂时搁置,由于 4/22 小于 5/22 ,因此将 4/22 和 5/22 进行合并,合并后的值为 9/22,此时只剩下三个未合并的值 7/22,9/22 和 6/22;将三个值进行排序,得到,6/22,7/22,9/22,将出现频率最小的两个概率 6/22 与 7/22 合并为 13/22,最后将 13/22 与 9/22 合并为 22/22 = 1,合并完成。
然后将下支路的值设置为 0,上支路的值设置为 1(也可以颠倒),设置完成后从最左侧节点往右读取到最右侧节点的编码就是该像素级的编码。
如果不进行上述的方式编码,计算出来的数据量为:
notion image
因此,最终可以计算出图像的压缩比为:
notion image
📌
在灰度级数较多的时候,如 256 级,若图像的像素数量大于 256,那么可能会出现最坏的情况——出现 256 中不同的码字,在这种情况下,霍夫曼编码的计算量将会非常大。若此时采用全局的霍夫曼编码,那么压缩比会非常低。
此时可以考虑使用局部的霍夫曼编码,将图像分成多个 8*8 的子块,对每个子块进行霍夫曼编码,这样可以降低出现不同码字的概率同时提升压缩比(可以提升几倍以上)。
费诺-香农编码
费诺-香农编码是对霍夫曼编码的改进,此方法是由费诺和香农分别单独提出的。
由于霍夫曼编码的编码量非常大,为了简化编码,费诺、香农提出了使用概率分组的方式进行编码,具体步骤如下:
  1. 将不同的灰度级按照概率从小到大排列(与霍夫曼编码类似);
  1. 将灰度级分为两组,使得两组灰度级的概率和相近(理想情况下均为 0.5),分别将两组灰度级编码为 0 和 1;
  1. 分别针对两组灰度级中的每一组再按照概率和拆分为两组,使得两组的概率和相近,分别编码为 0 和 1,不断重复上述步骤直到每组只有一种输入为止。
  1. 将每组所赋的值依次排列开就得到编码。
示例:
notion image
编码表如下:
notion image
算术编码
算术编码并没有沿用前面行程编码的思想,而是将图像的像素值映射到了一段实数区间(区间范围为 [0, 1)),用最后唯一的实数值来替代原来的多个像素值。
算术编码的执行过程:
  1. 与前面几种编码方式一样,计算图像不同灰度级的概率分布;
  1. 根据不同灰度级的概率分布将区间 [0, 1) 划分为不同的子区间(概率大小作为区间的边界);
  1. 图像像素集合中的每个像素都会被用于缩小区间。先判断像素集合中的第一个灰度位于哪个子区间,将该子区间作为新的区间,并根据概率分布重新划分为不同的子区间;
  1. 重复以上步骤直到集合中所有的像素值都被分配到了对应的区间,此时任取最后一个子区间中的实数值来表示这个像素集合。
示例:
notion image
算术编码的解码:
notion image
DPCM 编码(差分脉冲编码调制)
DPCM 编码是预测编码的一种,首先介绍一下什么是预测编码。
预测编码大体上分为两步:
  1. 首先将图像的前几个像素值代入数学模型中得到当前像素的预测值;
  1. 将当前像素的实际值与预测值相减作为误差值,对误差值进行(量化)编码。
通过预测编码,得到的误差值的大小将远远小于原始图像中像素的幅度,从而大大提高压缩比。
预测编码分为无损预测编码有损预测编码
其中无损预测编码就是在不进行量化的情况下直接对误差值进行编码。
有损预测编码是先对差值进行量化,然后再进行编码,有损编码中的“损”就表现在量化上。有损压缩的压缩比更高。
有损预测编码的基本原理为:
notion image
DPCM 的误差来源是发送端的量化器,与接收端无关。
📌
DPCM 既有使用有损预测编码的方式,也有使用无损预测编码的方式。
JPEG 编码的流程
JPEG 是用于制定图像压缩标准的一个小组,这个小组开发的压缩算法称为是 JPEG 算法,是国际上的通用标准。
JPEG 算法主要采用两种基本的压缩算法:
  1. 以离散余弦变换(DCT)为基础的有损压缩算法;
  1. 以 DPCM 为基础的无损压缩算法。
下面以 DCT 变换为基础说明一下 JPEG 编码的流程
  1. 首先,将原图像分成 8*8 的数据块,并进行 DCT 变换;
    1. 进行 DCT 变换后,图像的低频分量会集中在左上角,而高频分量分布在左上角以外的区域,右下角的频率最高。
      左上角 (0,0) 点的值表示的是图像的直流分量。
  1. 对 DCT 变换后的结果进行量化;
    1. 量化采用了两种量化表进行,第一种是色度量化表,第二种是亮度量化表。由于人眼对亮度信号的敏感程度大于色差信号,因此一般使用亮度量化表对 DCT 结果进行量化,量化的方式就是将 DCT 中的值与量化表中对应的值相除后向下取整。
      notion image
  1. 对 DC 直流系数进行 DPCM 编码,对 AC 交流系数进行 RLE 行程编码,将所有的 DCT 系数连成一行后进行哈夫曼编码。
    1. 哈夫曼编码与量化类似,针对色度分量和亮度分量都有对应的哈夫曼表。
JPEG 如何实现解码呢?
  1. 先通过哈夫曼表对哈夫曼编码进行解码操作量化图像;
  1. 利用量化表对量化图像进行反量化操作得到 DCT 系数;
  1. 再进行 IDCT 变换即可得到原始的数字图像。
下面是 JPEG 编码的流程图,课件中这部分就是比较糊的,大家见谅哈😅。
notion image
JPEG 解码的流程图:
notion image
图像质量下降的原因
由于在压缩过程中会进行量化操作,量化操作会导致图像质量下降。
图像分割
概述
过去所介绍的图像相关的概念都是图像处理,而从本节开始将步入图像分析的过程。
图像分割是图像处理到图像分析的关键步骤,也许你还记得,图像分析是图像工程的第二个层次,是为了让我们能够对感兴趣的部分进行检测和测量。
而要将我们感兴趣的部分进行分析,就必须先进行图像分割,将图像根据目标物、对象分割成多个区域。
notion image
📌
很多人可能一看到图像分割,想到的就是将图像进行裁剪,如果仅仅是裁剪图像,那只能是图像处理的部分。
阈值分割(自动阈值迭代法、大津法)
阈值分割最终得出的图像是二值图像,即只有 0 和 255 两个值。
图像的阈值分隔主要有两种方法: ① 自动阈值迭代法; ② Otsu 法(大津法)。下面以将图像分割为两个区域为例进行说明:
自动阈值迭代法的步骤如下:
  1. 首先确定一个初始阈值(比如图像所有像素的均值);
  1. 绘制图像的灰度直方图,通过阈值 T 将灰度直方图分割成两个区域 R1 和 R2;
  1. 计算区域 R1 和 R2 的均值 u1 和 u2,将 u1 和 u2 取平均后的值作为新的阈值;
  1. 再使用新的阈值对原先的灰度直方图进行分割,不断重复上述步骤,直到前后两次的阈值差小于某个值 是预先确定的,要迭代到什么程度才认为分割完成)。

Otsu 法的原理是比较两个区域的方差来确定阈值。方差可以有两种选择,一种是类内方差,一种是类间方差。
类内方差就是各个区域内部的方差,阈值分割的理想状态下,分割出来的两个区域内的类内方差应该最小;
类间方差就是各个区域之间的方差,理想情况下,类间方差应该要最大。类内方差和类间方差只需要选取一种即可。
方差的计算需要利用到 两个参数,其中 表示的是区域占比, 表示的是区域内部的均值。
Otsu 迭代法的步骤如下:
  1. 首先确定采用类间方差还是类内方差来实现算法,假定采用类间方差来进行分割;
  1. 初始化最佳阈值 T 和最大类间方差
  1. 计算图像的灰度直方图;
  1. 将阈值 T 由灰度直方图灰度级的最小值遍历到灰度直方图灰度级的最大值,将每一次迭代中的类间方差计算出来与最大类间方差进行比较,如果大于先前记录的最大类间方差,那么就将最佳阈值的值设为当前阈值,否则最佳阈值 T 不变,继续进行遍历;
    1. 类内方差的计算公式如下:
      类间方差的计算公式如下:
  1. 迭代完成后即可得到最佳阈值。

阈值法的好处在于算法实现简单,运算复杂度低;
阈值法的缺点在于目标与背景灰度有较大差异的时候比较有效,当图像背景比较复杂的时候效果不佳。
区域生长法
区域生长法从种子像素点出发,通过特定的生长规则对种子像素进行扩展,进而得到分割的区域。区域生长法的关键就在于选择种子像素点和生长规则。
生长规则通常是指定一个阈值,如果种子像素点周围的像素值与种子像素点的像素值差值小于等于阈值,那么就将周围的像素值赋值为种子的像素值,否则保持原来的值不变。
区域生长法的示例:
notion image
区域分割与合并
区域分割与合并是先将区域以四份为单位进行分割,当分割的区域内均匀性不满足要求(说明出现了区域内出现了不同的目标)时,对该区域继续以四份为单位进行分割,若分割的区域均匀性满足要求,则该区域不再进行分割操作。重复上述步骤直到区域分割完全。
然后执行合并的过程,比较相邻的区域内的像素值是否符合设定的标准,如果符合,则将相邻的区域进行合并,用参与合并区域的所有像素值的平均值作为新区域的像素值。重复以上步骤直到相邻区域间没有满足标准的区域,表示合并完全,此时就实现了图像分割。
示例一(过程的理解):
分割的过程:
notion image
分割的过程可以采用右侧的四叉树来表示。
合并的过程:
notion image
示例二(四叉树的绘制):
notion image
绘制的过程:
notion image
一阶、二阶算子
课件中这部分讲解的挺泛的,请谅解我的理解水平,感兴趣的可以看看 ppt 中这部分的内容(P519)。
图像分割其实还可以利用我们之前学习到的方法来实现,在图像锐化部分,我们可以采用梯度算子将边缘提取出来,同样地,图像分割也可以根据边缘信息将图像分割成不同区域。
梯度算子可以采用 Roberts 算子、Prewitt 算子等(这些都属于一阶算子),提取出图像边缘后,图像整体上会有向上、向下、向右或向左的偏移,偏移量都是半个像素。
Roberts 算子的提取结果
Roberts 算子的提取结果
通过上述算子提取出来的图像边缘往往并不是都是我们想要的,因此在提取后,我们需要通过一个阈值将我们感兴趣的目标边缘给识别出来,将一些没有的边缘(比如噪声等)给过滤掉,而如何选取阈值是一个难点(如何取,难在哪都没有说😶‍🌫️)。

二阶算子:
由于原始图像的边缘两侧灰度值相差比较大,因此会有如下图所示原始信号的跳变过程,灰度值变化过程中,斜率也是不断变化的,斜率变化最大的点可以当作是边缘点。因此可以使用一阶导数对图像边缘进行提取,就是前面所介绍的几种方法。
进一步地,当我们对一阶导数进行求导时,会发现边缘点所对应的二阶导数值为 0,零点两侧的导数值是异号的,利用这个特性,我们也可以实现边缘点的提取,这就有了二阶算子。
notion image
📌
需要注意的是,上述图像描述的都是连续图像的信息。而我们研究的数字图像是离散的,因此不会像上述图像那样光滑,对于二阶导数,往往不会有点刚刚好成为零点。这时,我们采取的一个策略是取一个像素点,如果该像素点的值大于 0,查看它的邻域像素点,若刚好有一个点是小于 0 的,那么就可以判定该像素点为边缘点(反之也成立)。
二阶算子常用的为 拉普拉斯算子 Marr 算子。在数字图像中,拉普拉斯算子使用卷积核来表示,如下图所示:
notion image
二阶算子的好处在于不会像一阶算子一样处理后出现图像边缘点的偏移,而且对细线和孤立点的检测较好;缺点是对噪声敏感,且具有双倍的加强。
💡
由于梯度算子和拉普拉斯算子都会对图像的噪声产生加强作用,因此在进行边缘检测前要先对图像进行平滑处理。
Marr 算子是拉普拉斯算子的改进版,它将平滑操作与拉普拉斯操作结合为一个函数(卷积核),称为是高斯-拉普拉斯滤波算子,也称为是 LOG 滤波器。由于它的频域图像与墨西哥草帽的形状很相似,因此又被称为是“墨西哥草帽”。
notion image
 
notion image
Marr 算子中主要是通过 的选择来决定图像边缘提取的能力的, 小时位置精度高,边缘细节变化多; 大时位置精度低,平滑作用大,细节损失多。
数字图像中 时的 Marr 算子:
notion image
Hough 变换(霍夫变换)
霍夫变换是一种用于检测直线的技术,它可以将图像中所有可能组成直线的像素坐标(x, y)映射到另一个参数空间中,在这个参数空间中求解直线的参数(如斜率、截距等)。
在原来的图像中,直线方程可能是 y=kx+b 或是极坐标 ρ=xcosθ+ysinθ(可以表示直线垂直的情形);但在参数空间中,是将直线的参数 (k, b)作为横纵坐标,将 (x, y)作为是直线的参数,如 b=xk+y
在参数空间中,霍夫变换采用“投票机制”来决定最终采用哪个直线参数,交叉点数越多的点,得到的票数越多,该点所代表的参数 (k, b)则会作为原图像中直线的参数。
notion image
霍夫变换除了能够用来检测直线以外,也可以用来检测曲线,同时,霍夫变换的抗噪声能力强,能够将断开的边缘重新连接起来,这对于边缘的提取很有帮助。
霍夫变换具体的算法步骤和细节在这里就不多阐述了,在课件中有霍夫变换的步骤。
二值图像处理
形态学运算
二值图像就是前面通过图像分割后得出的图像,二值图像中的值只有 0 和 255(或者用 0 和 1 表示),一般目标区域的值为 255.
二值化图像一般经过形态学运算进行处理。在形态学运算中,不再依赖卷积核进行操作,而是使用结构元素进行运算。结构元素也是像卷积核一样扫过图像的像素,但不同的是,结构元素与图像的像素间进行的不是积分或差分运算,而是逻辑运算(与、或操作),不同的结构元素能够产生不同的形态学运算。
最开始时,形态学运算只能应用于二值化图像,但随着形态学的发展,灰度图像甚至于彩色图像都能够使用形态学直接进行运算了。
结构元素与图像间的关系
  • 包含。结构元素位于图像内部,其实就是结构元素包含于图像集合中,a 属于 X。
  • 击中。其实就是数学中的交集,设有两幅图像 B 和 X,若存在这样一个点,它既是 B 的元素,又是 X 的元素,则称 B 击中 X,记作 B↑X。
  • 未击中。其实就是数学中的不相交,设有两幅图像 B 和 X,不存在任何一个点,它既是 B 的元素,又是 X 的元素,即 B 和 X 的交集是空,则称 B 不击中 X。
notion image
腐蚀
腐蚀是一种消除边界点的算法,可以使边界向内部收缩,消除小且无意义的点(如噪声点)。
腐蚀操作执行的逻辑运算是与运算,将结构元素中值为 1 的部分(值为 0 的部分不参与逻辑运算)与对应的像素相,如果最终的结果是 1 ,那么新像素值就是 1,如果最终的结果是 0,那么新像素值就是 0。
腐蚀操作的基本步骤为:
  1. 确定结构元素的形状和内部的值;
  1. 扫描原图像,找到第一个像素值为 1 的像素点作为结构元素的起始点;
  1. 将结构元素与所覆盖的像素做逻辑与操作得到新的像素值;
  1. 重复步骤 2 和 3 直到所有的像素都处理完成。
示例:
图中只进行了部分的腐蚀操作(左侧标红部分)。中间结构元素均标为红色,说明结构元素内的值均为 1.
图中只进行了部分的腐蚀操作(左侧标红部分)。中间结构元素均标为红色,说明结构元素内的值均为 1.
结构元素中红点的位置表示的是结构元素的“中心”位置,“中心”位置对应哪个元素就表示正在处理哪个像素。
示例二:
notion image

边界提取:
腐蚀操作也可以用于边界的提取,先对图像进行一次腐蚀操作,再将原图像与腐蚀后的图像作差即可得到图像的边界。
膨胀
膨胀操作可以将断裂开的目标物进行合并,扩大边界点。
膨胀操作与腐蚀操作相反,对图像进行的逻辑运算是或运算。将结构元素中的每一位与对应的像素相,只要结构元素覆盖的像素中有一个值为 1 则新像素值就是 1。
膨胀操作的基本步骤如下:
  1. 确定结构元素的形状和内部的值;
  1. 扫描原图像,找到第一个像素值为 0 的像素点作为结构像素的起始点;
  1. 将结构元素与所覆盖的像素做逻辑或操作得到新的像素值;
  1. 重复步骤 2 和 3 直到所有的像素都处理完成。
示例一:
膨胀操作未进行完全,只观察结构元素所覆盖的区域即可。
膨胀操作未进行完全,只观察结构元素所覆盖的区域即可。
示例二:
notion image

区域填充:
利用膨胀操作可以在已知边界点的情况下对区域内部进行填充。
开运算、闭运算
开运算、闭运算是将腐蚀和膨胀操作结合在一起的运算,若只进行腐蚀或膨胀操作,目标物的大小会发生改变,而开运算和闭运算则能利用腐蚀和膨胀为逆运算的特点,基本保持目标物的形状。
开运算是先对图像进行腐蚀操作,然后再进行膨胀操作;(目的是分离粘连,同时保持目标物大小基本不变)
只进行一次腐蚀和一次膨胀效果并不是很好。
只进行一次腐蚀和一次膨胀效果并不是很好。
闭运算则是先对图像进行膨胀操作,然后再进行腐蚀操作。(目的是合并断裂,同时保持目标物大小基本不变)
只进行一次膨胀和一次腐蚀效果并不是很好。
只进行一次膨胀和一次腐蚀效果并不是很好。
如果没能够很好的实现分离粘连或合并断裂的功能(如上面两幅图所示),那么可以先进行 N 次腐蚀(或膨胀),再进行 N 次膨胀(或腐蚀),只要保证前面进行的腐蚀(或膨胀)次数和后面进行的膨胀(或腐蚀)次数一致即可。
notion image
 
 
目标标记法
目标标记算法是利用邻域像素是否连通来判断识别不同的目标的。
notion image
如上图所示,图像的上半部分区域和下半部分区域是分别连通的,而两个区域之间互不连通(处于斜对角线上也算是连通),于是识别出图像中共存在两个目标,标记为 1 和 2。
目标标记法的步骤如下:
  1. 首先将原图像通过一个二维矩阵表示,白色像素表示为 1,黑色像素表示为 0;
    1. notion image
  1. 创建一个标记矩阵 g 用于存放目标的标签,初始时标记矩阵中的值全部为 0;同时,初始化标签 LAB = 0;
    1. notion image
  1. 标记时采用如下图所示的九宫格对 f 进行扫描,当当前像素所对应的矩阵 f 中的值为 1 时,会查看已扫描过的元素中是否存在同样为 1 的像素。若存在,则将当前的 LAB 值作为当前像素值,九宫格继续向前移动;若不存在,则将当前的 LAB 值加上 1,并将新的 LAB 值作为当前的像素值,然后九宫格继续向前移动。
    1. notion image
       
      notion image
       
  1. 如果在九宫格扫描过程中出现了九宫格内有多个不同的标签值存在,说明当前像素会将之前的几个目标连接为同一个连通区域(斜线连接),此时会将 LAB 的值重新赋值为九宫格中最小的标签值,并将九宫格内所有的标签值赋值为新的 LAB,九宫格继续向前移动;
    1. notion image
  1. 重复以上步骤直到九宫格移动到 f 的最后一个像素,此时 LAB 的值为多少就说明有几个目标被识别出来了,矩阵 g 中也就有几个不同的标签。
    1. notion image
链码
正常来说,如果我们要提取出一个目标的边界,我们需要记录图像中目标所有边界点的坐标,不仅表示起来不方便,存储时也会占用很多空间。为了更加方便地表示目标边界,可以使用链码来对目标边界进行表示。
使用链码表示边界非常简单,首先确定边界的一个起始点,将起始点的绝对坐标记录下来,然后只需记录每个边界点与上一个边界点之间的方向即可,方向可以使用数字来进行表示(如下图所示)。
notion image
使用链码表示边界时,起始点坐标的选择非常关键,不同的起始点坐标能够得到不同的链码。
为了让一个图像的边界具有一个链码,可以对链码进行归一化操作,具体的步骤为:
  1. 先从边界的任意一个点开始,得出此时的链码;
  1. 将链码中的每一位朝着一个方向循环移位,当链码所对应的自然数为所有移位情况下的最小值时,该最小值所对应的链码就作为归一化后的链码。
notion image

差分链码(旋转归一化):
当目标平移时,边界也平移,链码不会发生变化;
当目标旋转时,边界也会一起旋转,此时边界的链码发生了变化,也就是说,归一化后的链码就又无法唯一的表示边界了。
因此,还需要对链码进行旋转归一化的操作。
旋转归一化可以通过差分链码来实现,利用相邻值之间差值不变的原则得到归一化后的链码。
旋转归一化的过程如下:
假设共使用 N 个方向来表示链码,将链码从后向前差分,如果差分的值为负数,则将该值对 N 取模(如 N = 4,差值为 -1,则取模后的值为 -1 + 4 = 3)后的值作为差分值由此即可得到差分链码(如下图所示)。【对于第一个值,使用它与最后一个值之间的差分】
notion image
区域的空间特征
下面的内容针对二值图像进行分析。
在分析图像的各种特征前,需要先对以下概念有一个清晰的认识:
  • 四邻接。与当前像素相邻的四个像素中至少有一个像素的值与当前像素相同;
    • 若当前像素为黑,则其四个近邻像素中至少有一个像素为黑。
      若当前像素为黑,则其四个近邻像素中至少有一个像素为黑。
  • 八邻接。以当前像素为中心的九宫格内的其他像素至少有一个像素的值与当前像素值相同;
    • 若当前像素为黑,以其为中心的九宫格内的相邻像素中至少有一个为黑。
      若当前像素为黑,以其为中心的九宫格内的相邻像素中至少有一个为黑。
  • 连接成分。在二值图像中,只有 0 和 1 两种像素值(或 0 和 255),当对 1 采用八邻接方式进行连接时,符合八邻接的所有 1 像素集合组成的区域称为是连接成分。如果连接成分中没有孔洞,那么该连接成分就是单连接成分;如果连接成分中有孔洞存在,那么该连接成分就是多重连接成分(如下图所示)。连接成分中的孔洞就被称为是“孔”。
    • notion image
💡
需要特别注意的是,当像素 1 采用八邻接时,像素 0 就必须采用 4-邻接。如果像素 0 也采用 8-邻接,那么就会发生区域间相互冲突的情况,破坏区域的封闭性(如下图所示)。
notion image

图像内部空间域的特征:
图像内部空间域的特征包括 ① 拓扑性质; ② 凹凸性; ③ 区域的测量。
拓扑性质
图像的拓扑性质是使用欧拉数来进行描述的,欧拉数的计算规则为:一幅图像的 1 像素连接成分数(用 C 表示)减去图像中所有孔洞的数量(用 H 表示)就是这幅图像的欧拉数。
若将欧拉数使用 E 来表示,则欧拉数
当然,欧拉数也可以通过这种方式计算:对于每一个连接成分,都使用 1 减去该连接成分中所包含的孔洞数(若无孔洞则减去 0),得到的结果使用 表示,则欧拉数就为所有的 和,即
凹凸性
图像的凹凸性是区域的基本特征之一,图像的凹凸性可通过下面的描述来定义:
区域内任意两像素间的连线穿过区域外的像素,则此区域为凹形
相反,连接区域内任意两个像素的线段,如果不通过这个区域以外的像素,则此区域为凸形
notion image
对于凹形图来说,将该凹图形填充最少的区域使之成为凸图形,则填充后的凸图形就称为是该图形的凸闭包(把包含它的最小的凸图形叫这个图形的凸闭包 )。对于凸图形来说,凸闭包就是它本身。
绿框部分的内容就是凹形图填充的部分内容;
红框部分表示的是原凹形图的凸闭包。
绿框部分的内容就是凹形图填充的部分内容; 红框部分表示的是原凹形图的凸闭包。
填充的面积可以通过凸封闭包面积减去原凹形面积得到。
notion image
从凸闭包除去原始图形的部分后,所产生的图形的位置和形状将成为形状特征分析的重要线索。
区域的测量
面积:区域的像素总和;
周长:
  • 第一种定义,边界的像素总和;
  • 第二种定义,将两个相邻像素间的距离设为 1,相邻斜对角线像素的距离设为 ,则周长就是边界像素中所有相邻像素的距离和。
与第一种定义相比,第二种定义对周长的计算更加严格。
圆形度:
示例:
notion image
 
 
如果本篇笔记对你有用,能否『请我吃根棒棒糖🍭 』🤠…
相关文章
五种总线通讯协议笔记
Lazy loaded image
无线网络技术
Lazy loaded image
DSP 应用技术笔记
Lazy loaded image
GCC & GDB 学习笔记
Lazy loaded image
Git 学习笔记
Lazy loaded image
区块链的应用与技术笔记
Lazy loaded image
遥感数字图像处理笔记
Lazy loaded image
电磁场与电磁波笔记
Lazy loaded image
机器学习笔记(吴恩达)
Lazy loaded image
数字信号处理笔记
Lazy loaded image
通信电子线路笔记(高频电子线路)
Lazy loaded image
微机原理和系统设计笔记
Lazy loaded image
GCC & GDB 学习笔记Git 学习笔记
Loading...