摘要
本篇博客参考八斗学院AI课程的图像处理部分,对部分内容进行总结,以便加深理解和记忆
数字图像
1.基本概念
-
像素:像素是构成位图图像的基本单位,是分辨率的单位
-
分辨率(解析度):单位英寸(对角线上)内的像素点个数,单位是PPI(Pixels Per Inch)。注意避免将分辨率误认为是图像内的像素点个数
-
灰度、通道、RGB模型
-
对比度:对比度=最大灰度值比最小灰度值
-
频率:灰度值变化剧烈程度的指标,是灰度在平面空间的梯度(高频、低频)
2.图像的取样与量化
图像数字化过程由图像的取样与量化来完成
- 取样:用多少点来描述一副图像,取样结果质量的高低就是用分辨率来描述(数字化坐标值)M × N个像素点
- 量化:用多大范围的数值来表示图像采样后的一个点(数字化幅度值)
3.采样
- 下采样(降采样):缩小图像 (M/s) × (N/s)
- 上采样(图像插值):放大图像
- 最近邻插值(The nearest interpolation)
- 双线性插值(比最近邻插值复杂、计算量大,但是灰度连续,图像看起来更光滑)
4.直方图
- 灰度直方图:描述图像中灰度的分布情况,是灰度级的函数,描述图像中不同灰度级像素出现的频数
- 颜色直方图
图像直方图不关心像素所处的空间位置,因此不受图像旋转和平移变化的影响,可作为图像的特征。若一张图像上有两个不相连的区域组成,且每个区域的直方图已知,则整个图像的直方图是两个区域的直方图之和
![](https://i-blog.csdnimg.cn/blog_migrate/1ca1d85672b9b79a37c43a259b6aa870.png)
- 直方图均衡化
将原图像的直方图通过函数映射变为均均匀的直方图,然后按照均匀的直方图修改原图像,从而获得一幅灰度均衡的新图像
q
≈
∑
k
=
0
p
h
i
s
t
i
n
p
u
t
(
k
)
H
∗
W
∗
256
−
1
q ≈ \sum^p_{k=0} \frac {hist_{input}(k)} {H * W} * 256 -1
q≈k=0∑pH∗Whistinput(k)∗256−1
5.滤波
-
滤波器
- 大小应该为奇数,这样它有了中心,因而也有了半径,如5×5的滤波器,半径为2
- 滤波器所有元素之和应该为1,这样可以保证滤波前后图像的亮度不变(非必要),若滤波器所有元素之和大于1,滤波后的图像会变亮,反之会变暗
- 滤波后的负值可以截断到0-255范围内或取绝对值
-
卷积:卷积与滤波类似,但卷积在做乘积之前,需要先将卷积核反转180°。具体应用中,往往有多个卷积核,可以将每个卷积核认为代表了一种图像模式。若某个图像块与某个卷积核卷积出的值大,则认为此图像块十分接近与此卷积核
-
常见滤波器
- 没有任何效果的卷积
[ 0 0 0 0 1 0 0 0 0 ] \begin{bmatrix} 0 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 0 \end{bmatrix} 000010000
- 平滑均值滤波
[ 1 / 9 1 / 9 1 / 9 1 / 9 1 / 9 1 / 9 1 / 9 1 / 9 1 / 9 ] \begin{bmatrix} 1/9 & 1/9 & 1/9 \\ 1/9 & 1/9 & 1/9 \\ 1/9 & 1/9 & 1/9 \end{bmatrix} 1/91/91/91/91/91/91/91/91/9
- 高斯平滑:水平和垂直方向呈现高斯分布,更突出了中心点在像素平滑后的权重,相比于均值滤波而言有着更好的平滑效果
[ 1 / 16 2 / 16 1 / 16 2 / 16 2 / 16 2 / 16 1 / 16 2 / 16 1 / 16 ] \begin{bmatrix} 1/16 & 2/16 & 1/16 \\ 2/16 & 2/16 & 2/16 \\ 1/16 & 2/16 & 1/16 \end{bmatrix} 1/162/161/162/162/162/161/162/161/16
- 图像锐化:拉普拉斯变换核函数
[ − 1 − 1 − 1 − 1 9 − 1 − 1 − 1 − 1 ] [ 0 − 1 0 − 1 5 − 1 0 − 1 0 ] \begin{bmatrix} -1 & -1 & -1 \\ -1 & 9 & -1 \\ -1 & -1 & -1 \end{bmatrix} \;\; \begin{bmatrix} 0 & -1 & 0 \\ -1 & 5 & -1 \\ 0 & -1 & 0 \end{bmatrix} −1−1−1−19−1−1−1−1 0−10−15−10−10
- Soble边缘检测:Soble更强调边缘相邻像素点对边缘的影响
水平: [ − 1 0 1 − 2 0 2 − 1 0 1 ] 垂直: [ − 1 − 2 − 1 0 0 0 1 2 1 ] 水平:\begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix} \;\; 垂直:\begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix} 水平: −1−2−1000121 垂直: −101−202−101
特征选择与提取
1.特征的一种分类:相关特征、无关特征、冗余特征
2.特征选择的目的:降维、降低学习难度、提升模型效率
3.特征选择:从N个特征中选择M个子特征,且在M个子特征中,准则函数可以达到最优解
选择尽可能少的子特征,模型的效果不会显著下降,且结果的类别分类尽可能接近真实的类别分布
4.特征选择流程与方法
-
生成过程:生成候选的特征子集,是一个搜索过程
- 完全搜索:根据评价函数进行完全搜索,穷举搜索和非穷举搜索
- 广度优先搜索:完全搜索、距离度量评价函数
- 定向搜索:完全搜索、误分类率评价函数
- 最优优先搜索
- 启发式搜索:根据一些启发式规则在每次迭代时决定剩下的特征应该被选择还是被拒绝
- 序列前向选择SFS、广义序列前向选择GSFS、序列后向选择SBS、广义序列后向选择GSBS、双向搜索BDS
- 增L去R选择算法
- 序列浮动选择、序列浮动前向选择、序列浮动后向选择
- 决策树
- LVF:一致性度量评价指标
- 随机搜索:每次迭代设置一些参数,参数的选择会影响特征选择的效果
- 完全搜索:根据评价函数进行完全搜索,穷举搜索和非穷举搜索
-
评价函数:评价特征子集的好坏,一个特征子集是最优的往往指相对于特定的评价函数。评价函数主要用于度量一个特征[子集]可以区分不同分类的能力
- 方法
- 过滤式Filter:先进行特征选择,再训练学习器。特征选择过程与模型训练无关。相当于先对特征集合进行过滤,然后用特征子集训练模型,对每一维特征进行“打分”,即给每一维特征赋权,再排序
- 包裹式Wrapper:直接将最后的模型的损失函数作为特征选择的评价函数,对于特定模型选择最优的特征子集,将子集的选择看作一个搜索寻优问题
- Filter和Wrapper组合方法:先Filter再Wrapper
- 嵌入式Embedding:将特征选择的过程与模型训练的过程融合在一起,在学习过程中进行特征选择
- 常见评价函数
- 距离度量:若特征X不同类别中能产生比特征Y更大的差异,说明X更好
- 信息度量:计算一个特征的信息增益,度量先验不确定性和期望,后验不确定性之间的差异
- 依赖度量:度量特征通过一个变量预测另一变量的能力,最常见的是关系系数(用来发现一个特征和一个类别的相关性)若特征X与类别的相关性高于特征Y与与类别的相关性,那么X优于Y。相关系数还可以度量两个特征之间的冗余度
- 一致性度量:对于两个不同类样本,其输入特征是相同的,则它们是不一致的,否则是一致的。找到与特征全集具有统一分类能力的最小特征子集(严重依赖于特定训练集与最小特征偏见Min-Feature bias、找到满足可接受的不一致率的最小规模的特征子集)
- 误分类度量:主要用于Wrapper评价方式中
- 方法
-
停止条件:决定迭代过程何时停止
- 达到预定义的最大迭代次数
- 达到预定义的最大特征数
- 增加(删除)任何特征都不会产生更好的特征子集
- 根据评价函数产生最优特征子集
-
验证过程:验证特征子集是否有效
-
一些特征选择算法
![](https://i-blog.csdnimg.cn/blog_migrate/da16f5be43a9adf37fd70604c2a89eac.png)
-
补充:遗传算法
-
简介
使用误分类作为评价函数,随机产生一批特征子集,使用评价函数对特征子集进行评分,通过选择、交叉、突变操作产生下一代特征子集,且得分越高的子集被选中产生下一代的几率越高。经过N次迭代后,种群中就会形成评价函数值最高的特征子集。遗传算法比较依赖于随机性,因为选择、交叉、突变都由一定概率控制,因而结果难以复现。
-
过程
- 随机产生初始种群
- 非支配排序,通过遗传算法的三个算子(选择算子、交叉算子、变异算子)进行变更操作得到第一代种群
- 将父代种群和子代种群合并得到大小为N的初始化种群
- 对包括N个个体的种群进行快速非支配排序
- 对每个非支持层中的个体进行拥挤度计算
- 根据非支配关系及个体的拥挤度选取合适的个体组成新的父代种群
- 通过遗传算法的基本变更操作产生新的子代种群
- 重复上述过程直到满足结束条件(遗传进化代数)
-
5.特征提取:卷积
边缘检测
1.边缘:图像的边缘是指图像局部区域变化显著的部分,该区域的灰度剖面一般可以看作是一个阶跃。边缘也有正负之分,由暗到亮为正,由亮到暗为负
2.边缘检测:图像灰度变化的度量、检测和定位
3.高频信号(高频分量)、低频信号(低频分量)
- 高频信号:图像强度(灰度/亮度)变化剧烈的地方,也就是边缘(轮廓)
- 低频信号:图像强度(灰度/亮度)变化平缓的地方,也就是大片色块
人眼对高频信号更为敏感
4.边缘检测的原理和步骤
- 步骤
- 滤波:边缘检测的算法主要是基于图像强度的一阶、二阶导数,但导数对噪声敏感,因此使用滤波器来改善与噪声有关的边缘检测器的性能(去噪)常见的滤波器有高斯滤波
- 增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将图像灰度点邻域强度值显著变化的点凸显出来。具体实现时,可通过计算梯度幅度值确定
- 检测:经过增强的图像,邻域中的很多点往往有较大的梯度值。在特定应用中,这些点并非我们要寻找的边缘点,因此应该采用某种方法对这些点进行取舍。实际工程中常采用阈值化方法检测
- 原理
边缘部分的像素值会出现“跳跃”或较大的变化。因而边缘部分的一阶导数为极值,二阶导数为0,据此进行边缘检测:
①某像素点的一阶梯度值大于邻域像素点的一阶梯度值(推广到大于一个阈值)
②某像素点的二阶梯度值近0
![](https://i-blog.csdnimg.cn/blog_migrate/d1180db2bc6cb27336f8d317670f7cae.png)
5.求边缘幅度的算法
- sobel算子
Sobel算子包含两组3x3的矩阵,分别为横向及纵向模板,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值(见上滤波器)
缺点:Sobel算子没有将图像的主题与背景严格地区分开来,换言之就是Sobel算子并没有基于图像灰度进行处理。由于Sobel算子并没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。
- Prewitt算子
Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用 。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。
水平:
[
−
1
0
1
−
1
0
1
−
1
0
1
]
垂直:
[
1
1
1
0
0
0
1
1
1
]
水平:\begin{bmatrix} -1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1 \end{bmatrix} \;\; 垂直:\begin{bmatrix} 1 & 1 & 1 \\ 0 & 0 & 0 \\ 1 & 1 & 1 \end{bmatrix}
水平:
−1−1−1000111
垂直:
101101101
- Canny边缘检测算法
Canny边缘检测算法是目前传统图像处理中最优秀的边缘检测算法,其目标是找到一个最优的边缘。
最优边缘的定义:
①好的检测:算法能够尽可能地标出图像中的实际边缘
②好的定位:标识出的边缘要与实际图像中的边缘尽可能接近
③最小响应:图像中的边缘只能标记一次
算法流程:
对图像进行灰度化 → 对图像进行高斯滤波(根据滤波像素点及其邻域点的灰度值按照一定规则进行加权平均,由此可以有效滤去理想图像中叠加的高频噪声) → 检测图像中的水平、垂直和对角边缘(通过Prewitt、Sobel算子等) → 对梯度幅值进行NMS(搜索局部最大值、抑制非极大值) → 用双阈值算法检测和连接边缘
1)NMS非极大值抑制:寻找像素点的局部最大值,将非极大值点所在的灰度值置为0,由此剔除掉一大部分非边缘点
①将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较
②若当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则将其抑制(灰度置为0)
![](https://i-blog.csdnimg.cn/blog_migrate/77caa6d87f2f1cbf8a9120a5e7cb0ace.png)
2)双阈值算法检测(滞后阈值)
NMS后会得到一个二值图像,非边缘点的灰度值均为0,可能为边缘的局部灰度极大值可设置为128(或其他值)。这样的检测结果还是包含了很多由噪声及其他原因造成的假边缘,因此需要进一步的处理
①如果边缘像素的梯度值高于高阈值,则将其标记为强边缘像素
②如果边缘像素的梯度值小于高阈值且大于低阈值,则将其标记为弱边缘像素
③如果边缘像素的梯度值小于低阈值,则会被抑制
3)抑制孤立阈值点
至此,强边缘点可以被确定为边缘,弱边缘点可能是真实边缘也可能是由噪声、颜色变化等引起。现对弱边缘点进行进一步的处理:
①由真实边缘引起的弱边缘像素将连接到强边缘像素,噪声应未连接
②为了跟踪边缘连接,通过查看边缘像素及其8个邻域像素,只要其中一个为强边缘像素,则该弱边缘点就可以保存为真实的边缘
- Roberts、Laplacian算子
6.图像锐化
图像锐化是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得更清晰。锐化是为了突出图像上物品的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法提高了地物边缘与周围像元之间的反差,因而也被称为边缘增强。
图像锐化常用的是拉普拉斯变换核函数(见上滤波器)
7.图像平滑
图像平滑是指用于突出图像的宽大区域,低频成分、主干部分或抑制图像噪声和干扰高频成分的图像处理方法,目的是使图像亮度平稳渐变,减少突变梯度,改善图像质量
相机模型
1.相机模型
- 针孔相机模型
![](https://i-blog.csdnimg.cn/blog_migrate/8cd9943f552825195fd1da1f60c84d35.png)
- 坐标系
- 世界坐标系: 客观三维世界的绝对坐标系,也称客观坐标系,是物体在真实世界中的坐标。世界坐标系是随着物体的大小和位置变化的,单位是长度单位: P w ( X w , Y w , Z w ) P_w(X_w,Y_w,Z_w) Pw(Xw,Yw,Zw)
- 对应的摄像机坐标系:以相机的光心为坐标系的原点,以平衡于图像的x、y方向为x轴和y轴,z轴与光轴平行,单位是长度单位: P o ( x , y , x ) P_o(x,y,x) Po(x,y,x)
- 对应的图像物理坐标系:以主光轴和图像平面交点为坐标原点,单位是长度单位: P ′ ( x ′ , y ′ ) P'(x',y') P′(x′,y′)
- 对应的图像像素坐标系:以图像的顶点为坐标原点,u、v平行于x’、y’方向,单位是像素: p ( u , v ) p(u,v) p(u,v)
![](https://i-blog.csdnimg.cn/blog_migrate/f8169bd043add9425ce0910a5a9e90a0.png)
- 坐标系转换
世界坐标 → 摄像机坐标 → 图像物理坐标 → 图像像素坐标
1)世界坐标系映射到相机坐标系
欧氏变换:旋转、平移
[
X
c
Y
c
Z
c
1
]
=
[
R
t
0
T
1
]
[
X
Y
Z
1
]
=
L
w
[
X
Y
Z
1
]
\begin{bmatrix} X_c \\ Y_c \\ Z_c \\ 1 \end{bmatrix} = \begin{bmatrix} R & t\\ 0^T & 1 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix} = L_w \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix}
XcYcZc1
=[R0Tt1]
XYZ1
=Lw
XYZ1
旋转矩阵R,平移矩阵t
2)相机坐标系到图像物理坐标系
相似三角形
![](https://i-blog.csdnimg.cn/blog_migrate/3db56db21911ae3324172acb0c8f9012.png)
X
′
=
f
X
c
Z
c
Y
′
=
f
Y
c
Z
c
X' = f \frac{X_c}{Z_c} \\ Y' = f \frac{Y_c}{Z_c}
X′=fZcXcY′=fZcYc
矩阵形式:
Z
c
[
x
y
1
]
=
[
f
0
0
0
f
0
0
0
1
]
[
X
c
Y
c
Z
c
]
Z_c \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} f & 0 & 0\\ 0 & f & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X_c \\ Y_c \\ Z_c \end{bmatrix}
Zc
xy1
=
f000f0001
XcYcZc
3)图像物理坐标系到图像像素坐标系
![](https://i-blog.csdnimg.cn/blog_migrate/5bae8b505b2a3f180c1f177a846c4b8f.png)
u
=
x
d
x
+
u
0
v
=
y
d
y
+
v
0
d
x
、
d
y
表示
x
、
y
方向的一个像素占多少个长度单位
u = \frac{x}{d_x} + u_0 \\ v = \frac{y}{d_y} + v_0 \\ d_x、d_y表示x、y方向的一个像素占多少个长度单位
u=dxx+u0v=dyy+v0dx、dy表示x、y方向的一个像素占多少个长度单位
齐次坐标下:
[
u
v
1
]
=
[
1
d
x
0
u
0
0
1
d
y
0
0
0
1
]
[
x
y
1
]
\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} \frac 1{d_x} & 0 & u_0\\ 0 & \frac 1{d_y} & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}
uv1
=
dx1000dy10u001
xy1
4)整合映射过程
![](https://i-blog.csdnimg.cn/blog_migrate/fc0b7e88daa6dc5805c72c633998585b.png)
2.相机畸变
- 镜头畸变:透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像失真,镜头畸变分为:径向畸变和切向畸变
![](https://i-blog.csdnimg.cn/blog_migrate/f0bfef8b0701924f4fed98df9210c7fe.png)
- 径向畸变(泰勒级数的前几项):由透镜形状引起的畸变称为径向畸变
![](https://i-blog.csdnimg.cn/blog_migrate/f5ea2dbe7fe1e563eb3c5b682345d0e2.png)
- 切向畸变:由于镜头本身与相机传感器平面(成像平面)或图像平面不平行产生的,这种情况多是由于透镜被粘贴到镜头模组上时的安装偏差导致
![](https://i-blog.csdnimg.cn/blog_migrate/1736c7187e6360b1431a1c2b3129bd0a.png)
- 畸变矫正
径向畸变和切向畸变模型中共有5个畸变参数 k 1 、 k 2 、 p 1 、 p 2 、 k 3 k_1、k_2、p_1、p_2、k_3 k1、k2、p1、p2、k3,这5个参数就是相机标定中需要确定的5个畸变系数,由这5个参数就可以校正由于镜头畸变造成的图像失真
①径向畸变:
x
d
i
s
t
o
r
t
e
d
=
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
x
y
d
i
s
t
o
r
t
e
d
=
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
y
x_{distorted} = (1+k_1r^2+k_2r^4+k_3r^6)x \\ y_{distorted} = (1+k_1r^2+k_2r^4+k_3r^6)y
xdistorted=(1+k1r2+k2r4+k3r6)xydistorted=(1+k1r2+k2r4+k3r6)y
②切向畸变:
x
d
i
s
t
o
r
t
e
d
=
x
+
(
2
p
1
x
y
+
p
2
(
r
2
+
2
x
2
)
)
y
d
i
s
t
o
r
t
e
d
=
y
+
(
2
p
2
x
y
+
p
1
(
r
2
+
2
y
2
)
)
x_{distorted} = x + (2p_1xy +p_2(r^2+2x^2)) \\ y_{distorted} = y + (2p_2xy +p_1(r^2+2y^2))
xdistorted=x+(2p1xy+p2(r2+2x2))ydistorted=y+(2p2xy+p1(r2+2y2))
3.透视变换
-
透视变换:将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。透视变换的目的是把现实世界中为直线的物体在图片上呈现为斜线,通过透视变换转换成直线的变换
-
仿射变换:几何中,图像从一个向量空间进行一次线性变换和一次平移,变换到另一向量空间的过程。仿射变换是透视变换的一个特例。
![](https://i-blog.csdnimg.cn/blog_migrate/996fc4c7cf3fd44591f3e0bcdd056954.png)
- 透视变换公式
[ X Y X ] = [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] [ x y 1 ] X ′ = X Z = a 11 x + a 12 y + a 13 a 31 x + a 32 y + a 33 Y ′ = Y Z = a 21 x + a 22 y + a 23 a 31 x + a 32 y + a 33 Z ′ = 1 \begin{bmatrix} X \\ Y \\ X \end{bmatrix} = \begin{bmatrix} a_{11} & a_{12} & a_{13}\\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}\\ X' = \frac X Z = \frac {a_{11}x + a_{12}y + a_{13}} {a_{31}x + a_{32}y + a_{33}} \\ Y' = \frac Y Z = \frac {a_{21}x + a_{22}y + a_{23}} {a_{31}x + a_{32}y + a_{33}} \\ Z' = 1 XYX = a11a21a31a12a22a32a13a23a33 xy1 X′=ZX=a31x+a32y+a33a11x+a12y+a13Y′=ZY=a31x+a32y+a33a21x+a22y+a23Z′=1
立体视觉
1.立体视觉
立体视觉是一种计算机视觉技术,可以从图像中推理出每个像素点的深度信息。立体视觉借鉴了人类双眼的“视差”原理,即左右眼对于真实世界中某一物体的观测是存在差异的,我们的大脑正是利用了左右眼的差异,使我们能够识别物体的远近
2.单目系统
![](https://i-blog.csdnimg.cn/blog_migrate/5b0d30283050d7d954ce43089339d3d0.png)
3.双目系统
![](https://i-blog.csdnimg.cn/blog_migrate/0e1e04156939239aaa7f4f6b6102a2d3.png)
-
极平面: O 1 , O 2 , P O_1,O_2,P O1,O2,P三点确定的平面
-
基线: O 1 O 2 O_1O_2 O1O2
-
极线:极平面与两个像平面之间的交线: l 1 、 l 2 l_1、l_2 l1、l2
-
极点: O 1 , O 2 O_1,O_2 O1,O2连线与像平面 l 1 、 l 2 l_1、l_2 l1、l2的交点 e 1 、 e 2 e_1、e_2 e1、e2
4.视差Disparity
将同一空间的物理点在不同图像中的映射点对应起来,这个差别被称为视差图像
如上图,
∵
△
P
O
R
O
T
~
△
P
p
p
′
∴
B
Z
=
p
p
′
Z
−
f
=
B
−
(
X
R
−
W
2
)
−
(
W
2
−
X
T
)
Z
−
f
=
B
+
X
T
−
X
R
Z
−
f
变形化简得,
Z
=
B
f
X
R
−
X
T
=
B
f
d
如上图,∵ \;\;△PO_RO_T \;\;~ \;\;△Ppp' \\ ∴ \;\;\frac B Z = \frac {pp'} {Z-f} = \frac {B-(X_R-\frac W 2) - (\frac W 2 - X_T)} {Z - f} = \frac {B+X_T-X_R} {Z-f} \\ 变形化简得, Z = \frac {B f} {X_R - X_T} = \frac {Bf} {d}
如上图,∵△POROT~△Ppp′∴ZB=Z−fpp′=Z−fB−(XR−2W)−(2W−XT)=Z−fB+XT−XR变形化简得,Z=XR−XTBf=dBf
其中,D即为视差。Z与D成反比
点云模型
1.三维图像与点云
1)三维图像
三维图像是表达三位空间中的数据,和二维图形相比,三维图像借助第三个维度信息,可以天然得实现物体和背景解耦。对于视觉测量而言,物体的二维信息往往随映射方式而变化,但其三维特征对不同测量方式具有更好的统一性。
三维图像是对一类信息的统称,信息还需要具体的表现形式,如:深度图(以灰度表达物体与相机的距离)、几何模型(CAD软件建立)、点云模型(逆向工程设备将物体采样成点云)
2)点云
点云是在同一空间参考系下表达目标空间分布和目标表面特性的海量点集合,在获取物体表面每个采样点的空间坐标后,得到的点的集合,称为点云(Point Cloud)
- 根据激光测量原理得到的点云:包括
三维坐标XYZ
和激光反射强度
,强度信息与目标的表面材质、粗糙度、入射角方向、仪器的发射能力和激光波长有关 - 根据摄影测量原理得到的点云:包括
三维坐标XYZ
和颜色信息RGB
- 结合激光测量和摄影测量得到的点云:包括
三维坐标XYZ
、颜色信息RGB
和激光反射强度
2.点云处理的三个层次
- 低层次处理方法
- 滤波方法:双边滤波、高斯滤波、条件滤波、直通滤波、随机采样一致性滤波
- 关键点:ISS3D、Harris3D、NARF、SIFT3D
- 中层次处理方法
- 特征描述:法线和曲率计算、特征值分析、SHOT、PFH、FPFH、3D Shape、Context、Spin Image
- 分割:区域生长、Ransac线面提取、全局优化平面提取、K-Means、Normalize Cut(Context based)、3D Hough Transform(线面提取)、连通分析
- 分类:基于点的分类、基于分割的分类、基于深度学习的分类(PointNet、OctNet)
- 高层次处理方法
- 配准
- 粗配准阶段:在点云相对位姿完全未知的情况下对点云进行配准,可为精准配准提供良好的初始值
- 精配准阶段:在粗配准的基础上让点云之间的空间位置差别最小化
- 基于穷举搜索的配准算法:遍历整个变换空间以换取使误差函数最小化的变换关系或列出使最多点满足的变换关系。如RANSAC配准算法、四点一致集配准算法(4-Point Congruent Set,4PCS)、Super4PCS算法…
- 基于特征匹配的配准算法:通过被测物体本身所具备的形态特性构建点云间的匹配对应,然后采用相关算法对变换关系进行估计。如基于点FPFH特征的SAC-IA、FGR等算法、基于点SHOT特征的AO算法及基于线特征的ICL等…
- SLAM图优化
- Ceres(谷歌的最小二乘优化库)、g2o、LUM、ELCH、Toro、SPA
- SLAM方法:ICP、MBICP、IDC、likehood Field、NDT
- 三维重建
- 泊松重建、Delaunay triangulations、表面重建、人体重建、建筑物重建、树木重建
- 实时重建:重建植被或农作物的4D(3D+时间)生长姿态、点云LOD(金字塔)、海量点云的渲染
- 配准
3.spin image
- 介绍
spin image是基于点云空间分布的最经典的特征描述方法,其思想是将一定区域的点云分布转换成二维的spin image,然后对场景和模型的spin images进行相似度度量
-
生成spin image的步骤
- 定义一个定向点Oriented Point:点p和法向量n定义一个定向点
- 以Oriented Point为轴生成一个圆柱坐标系
- P:三维网格某顶点p的切面
- α:x点在P上投影与p的距离
- β:x点与P平面的垂直距离
-
定义Spin Image的参数,Spin Image是一个具有一定大小(行列数)、分辨率(二维网格大小)的二维图像(网格)
- 分辨率:二维网格/像素的实际尺寸。使用和三维网格相近的尺寸比较合适,因而通常取三维网格所有边的平均值作为spin image的每个网格尺寸,通常将网格的长宽定义相等,即边长。边长的计算公式为: r = 1 N ∑ i = 1 N ∣ e i ∣ r = \frac 1 N \sum_{i=1}^N |e_i| r=N1∑i=1N∣ei∣(e为三维网格中的一条边,N为边的总数)
- 大小:sping image的行列数,两者一般也相等,可参考10×10或20×20
- support angle:法向量夹角的大小限制,空间中顶点的法向量与创建圆柱坐标系所选点法向量之间的夹角。对support angle限制后,那些相对于切面的凹点(大于90°)被剔除,保留了主要信息,降低了后续的计算量(一般support angel 在 60-90度之间)
-
将圆柱体内的三维坐标投影到二维Spin Image上,该过程可以理解为一个Spin Image绕着法向量n旋转一周,Spin image扫到的三维空间会落到Spin image的网格中
-
根据spin image中每个网络落入点的不同,计算每个网格的强度I:显示spin image时以每个网格(像素)I为依据。最直接的方法是直接计算每个网格中落入点的个数。考虑到降低对位置的敏感度、降低噪音影响、增加稳定性,Johnson在论文中通过双线性插值的方法将一个点分部到4个像素中,即当一个点落入网格(i,j)中会被双线性插值分散到(i,j)、(i,j+1)、(i+1,j)、(i+1,j+1)四个网格中: i = 向下取整 ( W 2 − β b ) , j = 向下取整 ( a b ) i = 向下取整(\frac {\frac W 2 - β} b) ,\;\;j = 向下取整(\frac a b) i=向下取整(b2W−β),j=向下取整(ba),其中b为网格大小、W为图像尺寸
4.三维重建
三维重建:从二维图像中恢复三维场景结构,3D导航、3D打印、虚拟游戏等
-
三维重建分类
- 基于SFM的运动结构恢复
- 基于深度学习的深度估计和结构重建
- 基于RGB-D深度摄像头的三维重建
-
SFM(Structure From Motion)
1)介绍
SFM是一个估计相机参数和三维点位置的问题。主要基于多视觉几何原理,用于从运动中实现3D重建,即从无时序的2D图像中推算三维信息,是CV的重要分支,广泛用于AR/VR和自动驾驶领域。随着CNN的发展,基于CNN的三维重建也在不断深入,呈现上升趋势。但传统的基于多视觉几何方法的研究热情不减,在实际应用较多。
传统SFM基于目标为刚体的假设,基于相机是运动的,周围环境是静止的假设。当目标移动时,整体系统重建效果显著降低。
2)方法流程
![](https://i-blog.csdnimg.cn/blog_migrate/b7871e28b1e1dd36057aa8a90669db68.png)
①检测2维图片的特征点,对特征点进行匹配,只保留满足集合约束的匹配
②执行一个迭代的、鲁棒的SFM来恢复相机的内参和外参
③由三角化得到三维点坐标
3)方法
①增量式SFM
首先用SIFT特征检测器提取特征点,并计算每个特征点对应的描述子,然后使用ANN方法进行匹配,低于某个匹配数阈值的匹配将被移除。对于保留下来的匹配对,使用RANSAC来估计基本矩阵,在估计基本矩阵时被判定为外点的匹配将被看作错误的匹配而被移除。满足以上几何约束的匹配对,将被合并为tracks。然后通过incremental方式的SFM来恢复场景结构。
好的初始匹配的满足条件:足够多的匹配点、宽基线(之后增量地增加摄像机,估计摄像机的内外参并由三角化得到三维坐标点,然后使用Bundle Adjustment优化)
流程:图像特征提取 → 特征匹配 → 几何约束 → 重建初始化 → 图像注册 → 三角化 → outlier过滤 → Bundle adjustment
②全局式SFM ③混合式SFM ④ 层次式SFM ⑤基于语义的SFM ⑥基于深度学习的SFM
![](https://i-blog.csdnimg.cn/blog_migrate/bfe3e4284cb5db0d839b94e135b387d9.png)
增量、全局、混合式SFM的优缺点比较
- OpenMVG
openMVG(Open Multiple View Geometry)是开源的多视角立体几何库,是CV领域处理多视角立体几何的著名开源库,可以用于:
①解决多视角立体几何的精准匹配问题
②提供一系列SFM需要的特征提取和匹配方法
③提供完整的SFM工具链(校正、参估、重建、表面处理等)
④代码可读性强,方便二次开发,尽可能精简
git clone --recursive https://github.com/openMVG/openMVG.git
mkdir openMVG_Build
cd openMVG_Build
cmake -DCMAKE_BUILD_TYPE=RELEASE -DOpenMVG_BUILD_TESTS=ON -DOpenMVG_BUILD_EXAMPLES=ON. ../openMVG/src/
make
make test
- CMVS-PMVS
将运动结构SFM的输出作为输入,然后将输入图像分解为一组可管理大小的图像簇,MVS软件可以用来独立和并行地处理每个簇
git clone https://github.com/pmoulon/CMVS-PMVS
mkdir build
cd build
cmake ..
make
cd openMVG_Build/software/SfM
python tutorial_demo.py
cd tutorial_out/reconstruction_global
pmvs2 ./PMVS/pmvs_options.txt
meshlab
图像聚类
1.K均值聚类算法
一种原型聚类算法。在图像处理中,通过K-Means算法可以实现图像分割、图像聚类、图像识别等,将像素点聚类成K个簇,然后使用每个簇内的质心替换簇内所有像素点,这样就可以在不改变分辨率的情况下量化压缩图像颜色,实现图像颜色级的分割
优点:经典算法,简单,快速、对于大数据集依旧高效、结构簇是密集的,效果好
缺点:需要事先给出K,对噪声和孤立点数据敏感
对于服从高斯分布的数据用K-Means进行聚类的效果较好
2.层次聚类
层次法:计算样本之间的距离,每次将距离最近的样本合并到一类。然后再计算类与类之间的距离,将距离最近的类合并为一类,重复上述过程直到合并为一类。
距离计算法:最短距离法、最长距离法、中间距离法、类平均法等
层次聚类根据层次分解的顺序,可以分为:自下而上(凝聚的层次聚类算法)、自上而下(分裂的层次聚类),上述说的层次法,即为自下而上
特点:
- 凝聚的层次聚类没有K均值聚类的目标函数,没有局部极小值问题或是很难选择初始点的问题
- 合并的操作往往是最终的,不能撤销
- 计算存储代价高
优点:距离和规则的相似度容易计算,限制少、不需要预先制定聚类数、可以发现类的层次关系、可以聚类成其他形状
缺点:计算复杂度高、奇异值能产生很大影响、算法可能聚类成链状
对于类别之间存在层次结构的数据,用层次聚类的效果较好
3.密度聚类DBSCAN
超参数:半径e,形成高密度区域所需的最少点数minPts
由任意一个未被访问的点开始,探索该点的e-邻域,若e-邻域中的点数超过minPts则建立一个新的簇,否则该点被标记为噪声。噪声点在后面也可能被发现在其他点的e-邻域中,届时也将噪声点加入对应的类中
优点:对噪声不敏感、能发现任意形状的聚类
缺点:聚类结果与参数有很大关系、用固定参数聚类时,聚类的稀疏程度不同时,相同的判定标准可能会破坏聚类的自然结构,即较稀疏的聚类会被划分为多个类或密度较大且离得近的类会被合并为一个聚类
4.谱聚类
- 将数据构造成一个图,每个节点对应一个数据点,将相似的节点连接起来,边的权重用于表示数据之间的相似度。将图G用邻接矩阵表示出来,记为W
- 将W的每一列元素加起来得到N个数,把它们放到对角线上(其余位置都填充0),组成一个N×N的矩阵,记为D
- 令 L = D - W,求出L的前k个特征值,及其对应的特征向量
- 将这k个特征向量排列在一起组成N×k的矩阵,将其中每一行看作K维空间中的一个向量,并用K-means进行聚类。聚类的每一行所属类别即为原来图中每个节点的类别
谱聚类的过程可以看作构图和切图两个过程,切出的不同子图即为不同的类别
![](https://i-blog.csdnimg.cn/blog_migrate/c08a255052e46635590740a238a20011.png)
图像滤波
1.图像噪声
图像噪声是图像在获取或传输过程中受到随机信号干扰,妨碍人们对图像理解及分析处理的信号。图像噪声的产生来自图像获取中的环境条件和传感原器件自身的质量,图像在传输过程中产生图像噪声的主要原因是所用的传输信道受到了噪声的污染
-
白噪声:噪声的任意两个采样样本之间不相关
-
高斯噪声:噪声的概率密度函数服从高斯分布
产生原因:图像传感器拍摄时不够明亮、亮度不够均匀;电路各元器件自身噪声和相互影响;图像传感器长期工作,温度过高
Pout = Pin + random.gaouss(标准差,均值)
- 椒盐噪声(脉冲噪声):随机出现的白点或黑点
椒盐噪声 = 椒噪声(pepper noise:0低灰度噪声) + 盐噪声(salt noise:255高灰度噪声)
呈现在图像上就是黑白杂点。对于彩色图像,也有可能表现在单个像素RGB三个通道随机出现的0或255
产生原因:部分像素值在传输时丢失,影像讯号受到突如其来的强烈干扰
加噪声方法:
①指定信噪比SNR(信号和噪声的占比),取值在[0,1]之间
②计算总像素数目SP,得到要加的像素数目:NP = SP × SNR
③随机获取要加噪声的像素位置P(i,j)
④指定像素值为0或255
- 泊松噪声:符合泊松分布的噪声模型,适合描述单位时间内随机事件发生次数的概率分布。时间越长,事件发生的可能性越大,且不同时间内该事件发生的概率是相互独立的。对于非常短的一段时间来说,出现两次的概率几乎为0。多用于描述某一服务在一定时间内受到请求的次数,电话交换机接到呼叫的次数,机器的故障数,自然灾害发生的次数,DNA序列的变异数等
- 乘性噪声:一般由信道不理想引起,与信号的关系是相乘
- 瑞利噪声:相比高斯噪声而言,其形状右歪斜,可用于描述某些歪斜的直方图,可以通过平均噪声来实现
- 伽马噪声:分布服从伽马曲线,需要b个服从指数分布的噪声叠加而来。指数分布的噪声可以使用均匀分布实现(b=1时为指数噪声,b>1时通过若干个指数噪声叠加)
2.图像滤波
在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏直接影响后续图像处理和分析的有效性和可靠性。消除图像中的噪声成分叫做图像的平滑化或滤波操作。信号或图像的能量大部分集中于幅度谱的低频和中频,在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器能够削弱噪声的影响。
平滑滤波是低频增强的空间域滤波技术,其目的有两类:①模糊②消除噪音。空间域的平滑滤波一般采用简单平均法进行,即求邻近像元点的平均亮度值。领域的大小与平滑的效果直接相关,邻域越大平滑的效果越好。但邻域过大,平滑会使边缘信息的损失越大,从而输出的图像变得模糊。因此需要合理选择邻域的大小
可以将滤波器想象成一个包含加权系数的窗口,当使用该滤波器平滑处理图像时,将将窗口放到图像之上,透过窗口看图像
滤波的目的:去噪、提特征
滤波的要求:不能损坏图像轮廓或边缘、视觉效果好
一些滤波器:
- 均值滤波、中值滤波、最值滤波
- 引导滤波
引导滤波使用了局部线性模型,该模型认为某函数上一点与其临近部分的点成线性关系,一个复杂的函数就可以用很多局部的线性函数表示。当需要求该函数上某一点的值时,只需计算所有包含该点的线性函数的值并求平均即可。这种模型在非解析函数上,非常有用
![](https://i-blog.csdnimg.cn/blog_migrate/ef0b612bd83253965442727fe96e55c1.png)
同理,将图像看作一个二维函数,不过无法写出表达式。因此,假设该函数的输出与输入在一个二维窗口满足线性关系:$ O_i = a_k I_i + b_k$,其中i、k为像素的索引值,I、O是像素的输入和输出,a、b是线性函数的参数。通过对函数两侧进行求导得,当输入图像I有梯度时,输出图像O也有类似的梯度,也就是说引导滤波具有边缘保持特性。
下一步即求线性函数的系数,方法是通过最小化输入值I和输出值O之间的均方误差最小,回到了回归问题。由于一个像素点会被多个滤波窗口覆盖,因此目标函数为每个像素点在每个覆盖的滤波窗口上输入和输出的和。
引导滤波的最大优势就是能够写出时间复杂度与窗口大小无关的算法,因此大窗口处理图像时的效率更高
3.图像增强
- 概念
有目的地强调图像的整体或局部特征,将原来不清晰的图像变得清晰或强调某些感兴趣的特征,扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,使之改善图像质量、丰富信息量,加强图像判读或识别效果
- 技术
- 点处理技术:只对单个像素点进行处理
- 线性变换:主要对图像的对比度和亮度进行调整: y = a x + b y = a x + b y=ax+b,a影响对比度,b影响亮度,a>1时图像对比度增加,图像更清晰。a=1,b>0时图像变亮
- 分段线性变换:根据x的取值不同,将不同区域的像素点进行亮度和对比度的不同调整
- 对数变换:将低灰度值的部分扩展,将高灰度值部分压缩,以达到强调图像低灰度值部分的目的,同时可以很好的压缩像素值变化较大的动态范围: y = c l o g ( 1 + x ) y = c log(1+x) y=clog(1+x)
- 幂律变换/伽马变换:主要用于图像矫正,对漂白或过黑的图片进行修正: y = c x γ y=c x^γ y=cxγ,γ>1处理漂白图像,进行灰度级压缩、γ<1,处理过黑图像,增强对比度,使细节可以看得更清晰
- 领域处理技术:使用卷积核对像素点及其周围区域进行处理
- 直方图均匀化
- 图像滤波
- 点处理技术:只对单个像素点进行处理
尺度不变性
1.概念
尺度不变性SIFT(Scale Invariant Feature Transform)提取图像的局部特征,在尺度空间寻找极值点,并提取出其位置、尺度、方向信息。其特点有:
- 对旋转、尺度缩放、亮度变化保持不变性,对视角变化、噪声等也存在一定程度的稳定性
- 独特性,信息量丰富,适用于海量特征数据中快速、准确匹配
- 多量性,即少数个体也可以产生大量的sift特征向量
- 可扩展性,可以方便得与其他形式的特征向量进行联合
Sfit算法的实质是在不同的尺度空间上查找关键点 特征点),计算关键点的大小、方向、尺度信息,利用这些信息组成关键点对特征点进行描述的问题。Sf所查找的关键点都是一些十分突出,不会因光照,仿射变换和噪声等因素而变换的“稳定”特征点,如角点、边缘点、暗区的亮点以及亮区的暗点等。匹配的过程就是对比这些特征点的过程:
![](https://i-blog.csdnimg.cn/blog_migrate/dbd690b5dfc2e1c31739ff7cf0240f6b.png)
2.SIFT特征提取和匹配的具体过程
- 生成高斯差分金字塔(DOG金字塔),构建尺度空间
- 尺度空间:试图在图像领域模拟人眼观察物体的概念与方法,如通过生成不同分辨率的图像,模拟人眼观察物体时不同尺度的情景
- 图像金字塔:以多分辨率解释图像的结构(高斯金字塔、DOG差分金字塔)
- 尺度空间极值点检测(关键点的初步查探):检测点与它同尺度的8给临近点和上下相邻尺度的9×2共26个点进行比较
![](https://i-blog.csdnimg.cn/blog_migrate/4fd9570ea6e56f797588098bc2189a94.png)
- 稳定关键点的精确定位:去除不稳定和误检的关键点:利用阈值的方法进行限制
- 稳定关键点方向的信息分配:获取关键点所在尺度空间的邻域,计算该区域的梯度和方向,根据计算结果创建方向直方图,设直方图的峰值为主方向,其他高于主方向80%的方向为辅助方向
![](https://i-blog.csdnimg.cn/blog_migrate/cce245a032a2aaf0440c367a68cce186.png)
- 关键点描述:对于每一个关键点都有位置、尺度、方向三个信息,用向量表示。对关键点周围像素区块分块,计算块内梯度直方图,用生成的向量表示该区域
- 特征点匹配:通过计算两组特征点的向量的欧氏距离计算,距离越小,相似度越高。模板图、实时图
3.Python中的SIFT函数
pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16
OpenCV
1.OpenCV
开源的计算机视觉库,用C++实现
2.随机采样一致性RANSAC(random sample consensus)
RANSAC是一种迭代的方法,用于一组包含离群的样本中估计数学模型参数,它是一个非确定性算法。从某种意义来说,它会产生一个在一定概率下合理的结果,允许通过多次的迭代使得概率增加。
其基本假设是:“内群”数据可以通过几组模型参数来叙述其数据分布,而“离群“数据则是不适合模型化的数据。数据会受噪声影响,噪声是指离群。RANSAC假定:给定一组(通常很小)的内群,存在一个程序,这个程序可以估算最佳解释或最适用于这一组数据模型的参数
RANSAC步骤:
- 在数据中随机选择几个点作为内群
- 计算适合内群的模型
- 将其他未选到的点带入刚才建立的模型中,计算其是否为内群
- 记下内群数量
- 重复上述步骤,比较哪次计算中内群的数量最多,即为我们所要求的解
3.图像相似度比较
- 均值哈希
- 差值哈希
- 感知哈希
4.离散余弦变换DCT(Discrete Cosine Transform)
主要用于将数据或图像进行压缩,能够将空域信号转换到频域上,具有良好的相关性性能。DCT本身是无损和对称的,因此我们可以在接收端进行数据还原
F
(
u
,
v
)
=
c
(
u
)
c
(
v
)
∑
i
=
0
N
−
1
∑
j
=
0
N
−
1
f
(
i
,
j
)
c
o
s
[
(
i
+
0.5
)
π
N
u
]
c
o
s
[
(
j
+
0.5
)
π
N
v
]
c
(
u
)
=
1
N
,
u
=
0
c
(
u
)
=
2
N
,
u
≠
0
F
(
u
,
v
)
是输出的变换结果,
N
为原始信号的点数,
f
(
i
,
j
)
是原像素点
(
i
,
j
)
的像素值,
c
(
u
)
,
c
(
v
)
是
D
C
T
系数
F(u,v) =c(u)c(v) \sum_{i=0}^{N-1}\sum_{j=0}^{N-1}f(i,j)cos[\frac {(i+0.5)π} {N}u]cos[\frac {(j+0.5)π} {N}v] \\ c(u) = \sqrt{\frac 1 N},\;u=0 \\ c(u) = \sqrt{\frac 2 N},\;u≠0 \\ F(u,v)是输出的变换结果,N为原始信号的点数,f(i,j)是原像素点(i,j)的像素值,c(u),c(v)是DCT系数
F(u,v)=c(u)c(v)i=0∑N−1j=0∑N−1f(i,j)cos[N(i+0.5)πu]cos[N(j+0.5)πv]c(u)=N1,u=0c(u)=N2,u=0F(u,v)是输出的变换结果,N为原始信号的点数,f(i,j)是原像素点(i,j)的像素值,c(u),c(v)是DCT系数