linux vim编辑矩阵乘,LM算法计算单应矩阵

LM算法计算单应矩阵

slam

单应矩阵

单应矩阵的定义

什么是单应矩阵呢?其实简单来说,就是两个图像之间的变换矩阵。什么意思呢,可以考虑这样一个情形:

你有一个相机,拍摄一个建筑物,首先在某一个视角拍了一张,然后又走到另一个角度再拍一张,这样你就得到了对同一个场景进行拍摄的两张不同的图像,容易理解的是,既然是刻画同一个场景,那么这两图之间必然存在着一定的联系(映射),这个联系如果用一个矩阵来刻画,那么得到的这个矩阵,我们就把它叫做单应矩阵了(hemography),如果用一个公式来刻画,那么自然而然可以吧公式写成:

其中是齐次坐标,即说,u,v为图像坐标,是新的图像坐标下,对原来图像坐标下同一点的观测结果。值得注意的是,对于其次坐标,我们可以任意乘以一个常数,这个坐标的意义并不改变,或者可以不那么严格的写这样一个算式, 因此,对于映射来说,H矩阵让x释放出一个尺度上的不确定度,因此H矩阵的自由度等于8,或者说,计算H矩阵,只用计算出8个数,然后令最后一个数等于1就行了,或者也可以给出一个其他的约束,确定这个矩阵

单应矩阵的作用

那么单应矩阵有什么用呢?

最直接的应用当然是图像拼接了,可以理解的是,当你对一个大场景进行观测时,或者说你拍了很多照片,每个照片有重叠部分又有新的不分,假如我们选择其中某一个图作为基准,所有的图像都像基准图进行坐标变换,然后再把重叠部分叠再一起,那么多出来的图像信息也就自然而然地加到基准图上了。

其他的应用,包括图像增稳,透视纠正,视图合成等,它在图像领域是一个很好很强大的工具,大多数应用的第一步而且是最核心的一步都是计算这个矩阵,之后再进行其他处理,这个矩阵的算法很多,接下来就介绍一个超级强大,应用超级广泛的算法,即基于LM的迭代优化算法

单应矩阵的计算

基本原理

首先想要通过优化得到这个矩阵,自然而然需要建立一个基于优化的数学模型,我们从它的定义开始

把那个叉积方程整理之后有:

其中,

由于坐标是其次坐标(第三个坐标可以理解为尺度,但是同一个点不同尺度表达同一个点),这三个方程实际上是相容的,用两个方程就足以刻画所有的约束,即

简单记为

正如先前讲的,这个方程看似9个未知数,但其中有一个是用来控制比例的,可以通过它随意缩放,矩阵,因此实际上只有8个未知数,一个点有两个方向的约束,可以提供两个方程,所以理论上只需要4个点就能够算出一个H矩阵来,这样的解叫做最小配置解,但实际上你的到的图像上对应点的数一般总是多于8个的,而且可能存在各种各样的噪声,最小配置解总是不那么鲁棒的,比较好的策略是尽量多使用正确的匹配点,得到一个使得全局误差最小的H矩阵,比如基本DLT算法,即计算的最小特征值所对应的特征向量和A的零空间等价...

在这里,我们介绍的是一个强大的迭代优化算法,它总是在实际应用中用得更加广泛

LM算法

Sampson近似的Newton迭代

定义点满足等式,我们认为这个点受到h的约束,使得它根据某种规则定义的矩阵A有的结果,这种关系我们将他记为

现在我们约定一些符号:

:表达,之间的几何距离

:表示最优估计

: 表示二范数

记:,且我们希望最优解正好满足约束

那么可以得到:

记:,可得: ,

最后我们的问题简化成了:求在满足条件下,使得最小的向量,由此可以算出

那么现在算法是比较显然的

对于某一次迭代得到,然后求出对应的雅可比矩阵,之后算出新的增量,由此

Levenberg-Marquardt迭代

在Newton迭代的基础上,我们对它进行改进,将用代替,其中

之后我们需要判断得到的是否使得误差减小,如果变小,那么接受它,并且将除以10,否则将乘以10,重新解方程,直到误差减小为止

这个算法其实就这么简单,比Newton迭代多了几步,但实际上会减少一些迭代次数,效率更高,但是,实际上这个算法就直接这样套用去计算单应矩阵,这会是一件无比坑爹的事情,因为假设有n个匹配点,那么就会出现2n+9个参数,然而核心计算的时间复杂度是可怕的(解线性方程),而且这个核心计算会运行无比多次,这会直接导致你算到个矩阵算到明年。

但是你大可不必担心,接下来,隆重推出稀疏算法,这样将会无比愉快地得到一个时间复杂度为n的超高效算法,这个算法的优越性在大量实际应用中得到体现

稀疏LM求解2D单应

现在让我们忘掉那些该死的抽象的数学吧,重新从方程入手(实际上你可以发现,由于这个方程是线性的,所以sampson近似的误差其实和代数误差等价的,所以我们有理由回到最初的方程),由于这个问题的特殊化,可以得到一个十分简洁快速的算法

基本问题描述

给定两幅图中的对应点集,我们使用代数误差来进行优化计算,定义测量向量,在当前情况下,参数向量,其中是第一幅图的估计值,h是单应矩阵H的元素组成的向量,函数把映射到,对于每一个

在这种情况下,每个仅仅由和确定,因此必然会有

于是就能有一个很强大的形式摆在眼前

算法步骤

定义:

其中

那么方程可以化简为如下形式

之后,我们可以得到这样一系列的矩阵

其中代表协方差矩阵(如果给出了协方差矩阵,可以考虑马氏距离,这样得到的算法会更鲁棒,结果也会更好),代表需要估计的参数值,代表误差

最后,让我们来列一下算法详细流程:

已知   测量矢量 以及它的协方差矩阵 , 参数集合,测量集合 , 对任意的,

目标 求最小化的参数集合,其中

算法

1. 初始化常数(一般取0.001),参数集合

2. 计算微分矩阵以及 以及误差矢量

3. 计算中间值

,其中

,其中

, 其中

4. 下列方程计算

5. 由方程 计算每个

6. 通过向量更新,并计算新的误差

7. 判断误差是否减小,如果减小,那么接受更新的参数值,并把减小至之前的10分之1,继续迭代或终止;否则,拒绝参数更新,把扩大10倍,重新计算

你可能感兴趣的:(linux,vim编辑矩阵乘)