一、Homography 单应矩阵
1.单应矩阵 描述:同一平面下的点
,从一个图像到另一个图像的投影映射
A Homography is a transformation ( a 3×3 matrix )
that maps the points
in one image to the corresponding points in the other image.
对于现实世界中在同一平面的点都适用Homography Matrix来进行对齐。但如果图像中有两个平面,我们就要用两个
Homography Matrix来分别进行。
2.单应矩阵的计算
[ x 2 y 2 1 ] = H [ x 1 y 1 1 ] = [ h 00 h 01 h 02 h 10 h 11 h 12 h 20 h 21 h 22 ] [ x 1 y 1 1 ] \begin{bmatrix} x_2 \\ y_2 \\ 1 \end{bmatrix} = H \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix} = \begin{bmatrix} h_{00} & h_{01} & h_{02} \\ h_{10} & h_{11} & h_{12} \\ h_{20} & h_{21} & h_{22} \\ \end{bmatrix} \begin{bmatrix} x_1 \\ y_1 \\ 1 \end{bmatrix} ⎣⎡x2y21⎦⎤=H⎣⎡x1y11⎦⎤=⎣⎡h00h10h20h01h11h21h02h12h22⎦⎤⎣⎡x1y11⎦⎤
(1) 齐次坐标
上式是一个齐次坐标式,因为Homography Matrix
是一个
3
∗
3
3*3
3∗3的矩阵,所以要整成
3
∗
1
3*1
3∗1的齐次坐标式形式,H乘以一个非零数
,上式仍然成立,所以我们一般取1。
[
x
1
y
1
]
\begin{bmatrix} x_1 \\ y_1 \end{bmatrix}
[x1y1]的齐次坐标为
[
x
1
y
1
w
1
]
\begin{bmatrix} x_1 \\ y_1 \\ w_1 \end{bmatrix}
⎣⎡x1y1w1⎦⎤,那它实际
在图像上对应的坐标就是
[
x
1
w
1
y
1
w
1
]
\begin{bmatrix} \frac{x_1}{w_1} \\ \frac{y_1}{w_1} \end{bmatrix}
[w1x1w1y1]
优点:
- 可以很清楚的确定一个点是否在直线/平面上
- 可以描述无穷远点:
(x,y,0)
- 更简洁的表达欧氏空间变换,可以把平移和旋转写到一个矩阵里
- 方便表达直线与直线,平面与平面的交点
- 能够区分一个向量和一个点
(2) 求解
(
x
2
y
2
1
)
=
(
h
11
h
12
h
13
h
21
h
22
h
23
h
31
h
32
h
33
)
(
x
1
y
1
1
)
⇔
p
2
=
H
p
1
\left(\begin{array}{c}x_2\\y_2\\1\end{array}\right)=\left(\begin{array}{ccc}h_{11}&h_{12}&h_{13}\\h_{21}&h_{22}&h_{23}\\h_{31}&h_{32}&h_{33}\end{array}\right)\left(\begin{array}{c}x_1\\y_1\\1\end{array}\right)\Leftrightarrow p_2= Hp_1
⎝⎛x2y21⎠⎞=⎝⎛h11h21h31h12h22h32h13h23h33⎠⎞⎝⎛x1y11⎠⎞⇔p2=Hp1
进行乘法展开,可得
{
x
2
=
h
11
x
1
+
h
12
y
1
+
h
13
y
2
=
h
21
x
1
+
h
22
y
1
+
h
23
1
=
h
31
x
1
+
h
32
y
1
+
h
33
\left\{ \begin{array}{c} x_2 = h_{11}x_1 + h_{12}y_1 + h_{13} \\ y_2 = h_{21}x_1 + h_{22}y_1 + h_{23} \\ 1 = h_{31}x_1 + h_{32}y_1 + h_{33} \end{array} \right.
⎩⎨⎧x2=h11x1+h12y1+h13y2=h21x1+h22y1+h231=h31x1+h32y1+h33
欲将上式转变为 A x = b Ax=b Ax=b 形式,则须做如下变换:
{
x
2
(
h
31
x
1
+
h
32
y
1
+
h
33
)
=
h
11
x
1
+
h
12
y
1
+
h
13
y
2
(
h
31
x
1
+
h
32
y
1
+
h
33
)
=
h
21
x
1
+
h
22
y
1
+
h
23
\left\{ \begin{array}{c} x_2(h_{31}x_1 + h_{32}y_1 + h_{33})=h_{11}x_1 + h_{12}y_1 + h_{13} \\ y_2(h_{31}x_1 + h_{32}y_1 + h_{33})=h_{21}x_1 + h_{22}y_1 + h_{23} \end{array} \right.
{x2(h31x1+h32y1+h33)=h11x1+h12y1+h13y2(h31x1+h32y1+h33)=h21x1+h22y1+h23
移项,将右式变成0
{ x 2 ( h 31 x 1 + h 32 y 1 + h 33 ) − h 11 x 1 + h 12 y 1 + h 13 = 0 y 2 ( h 31 x 1 + h 32 y 1 + h 33 ) − h 21 x 1 + h 22 y 1 + h 23 = 0 \left\{ \begin{array}{c} x_2(h_{31}x_1 + h_{32}y_1 + h_{33})-h_{11}x_1 + h_{12}y_1 + h_{13} = 0 \\ y_2(h_{31}x_1 + h_{32}y_1 + h_{33})-h_{21}x_1 + h_{22}y_1 + h_{23} = 0 \end{array} \right. {x2(h31x1+h32y1+h33)−h11x1+h12y1+h13=0y2(h31x1+h32y1+h33)−h21x1+h22y1+h23=0
将上式改成向量积形式,令
H
=
(
h
11
,
h
12
,
h
13
,
h
21
,
h
22
,
h
23
,
h
31
,
h
32
,
1
)
T
H=(h_{11}, h_{12},h_{13},h_{21},h_{22},h_{23},h_{31},h_{32},1)^T
H=(h11,h12,h13,h21,h22,h23,h31,h32,1)T
(因为H是一个齐次矩阵,所以最后一个元素可以归一化为1)
{
x
2
(
h
31
x
1
+
h
32
y
1
+
1
)
=
h
11
x
1
+
h
12
y
1
+
h
13
y
2
(
h
31
x
1
+
h
32
y
1
+
1
)
=
h
21
x
1
+
h
22
y
1
+
h
23
\left\{ \begin{array}{c} x_2(h_{31}x_1 + h_{32}y_1 + 1)=h_{11}x_1 + h_{12}y_1 + h_{13} \\ y_2(h_{31}x_1 + h_{32}y_1 + 1)=h_{21}x_1 + h_{22}y_1 + h_{23} \end{array} \right.
{x2(h31x1+h32y1+1)=h11x1+h12y1+h13y2(h31x1+h32y1+1)=h21x1+h22y1+h23
{ h 11 x 1 + h 12 y 1 + h 13 − h 31 x 1 x 2 − h 32 y 1 x 2 = x 2 h 21 x 1 + h 22 y 1 + h 23 − h 31 x 1 y 2 − h 32 y 1 y 2 = y 2 \left\{ \begin{array}{c} h_{11} x_1 + h_{12} y_1 + h_{13} - h_{31} x_1 x_2 - h_{32}y_1 x_2 = x_2 \\ h_{21} x_1 + h_{22} y_1 + h_{23} - h_{31} x_1 y_2 - h_{32}y_1 y_2 = y_2 \end{array} \right. {h11x1+h12y1+h13−h31x1x2−h32y1x2=x2h21x1+h22y1+h23−h31x1y2−h32y1y2=y2
⇒
\Rightarrow
⇒ 即有
A
∗
H
=
0
A*H=0
A∗H=0,其中
A
=
[
x
1
y
1
1
0
0
0
−
x
1
x
2
−
y
1
x
2
−
x
2
0
0
0
x
1
y
1
1
−
x
1
y
2
−
y
1
y
2
−
x
2
]
A=\begin{bmatrix} x_1\ \ y_1\ \ 1\ \ 0\ \ 0\ \ 0\ \ -x_1x_2\ \ -y_1x_2\ \ -x_2 \\ 0\ \ 0\ \ 0\ \ x_1\ \ y_1\ \ 1\ \ -x_1y_2\ \ -y_1y_2\ \ -x_2 \end{bmatrix}
A=[x1 y1 1 0 0 0 −x1x2 −y1x2 −x20 0 0 x1 y1 1 −x1y2 −y1y2 −x2]
为了求解H,H中有8个未知量,所以需要8个方程来求解,这就需要4对匹配点(即原图像中的4个点)
[
x
1
y
1
1
0
0
0
−
x
1
x
2
−
y
1
x
2
−
x
2
0
0
0
x
1
y
1
1
−
x
1
y
2
−
y
1
y
2
−
x
2
x
3
y
3
3
0
0
0
−
x
3
x
4
−
y
3
x
4
−
x
4
0
0
0
x
3
y
3
1
−
x
3
y
4
−
y
3
y
4
−
x
4
x
5
y
5
1
0
0
0
−
x
5
x
6
−
y
5
x
6
−
x
6
0
0
0
x
5
y
5
1
−
x
5
y
6
−
y
5
y
6
−
x
6
x
7
y
7
1
0
0
0
−
x
7
x
8
−
y
7
x
8
−
x
8
0
0
0
x
7
y
7
1
−
x
7
y
8
−
y
7
y
8
−
x
8
]
[
h
11
h
12
h
13
h
21
h
22
h
23
h
31
h
32
1
]
=
[
x
2
y
2
x
4
y
4
x
6
y
6
x
8
y
8
]
\begin{bmatrix} x_1\ \ y_1\ \ 1\ \ 0\ \ 0\ \ 0\ \ -x_1x_2\ \ -y_1x_2\ \ -x_2 \\ 0\ \ 0\ \ 0\ \ x_1\ \ y_1\ \ 1\ \ -x_1y_2\ \ -y_1y_2\ \ -x_2 \\ x_3\ \ y_3\ \ 3\ \ 0\ \ 0\ \ 0\ \ -x_3x_4\ \ -y_3x_4\ \ -x_4 \\ 0\ \ 0\ \ 0\ \ x_3\ \ y_3\ \ 1\ \ -x_3y_4\ \ -y_3y_4\ \ -x_4 \\ x_5\ \ y_5\ \ 1\ \ 0\ \ 0\ \ 0\ \ -x_5x_6\ \ -y_5x_6\ \ -x_6 \\ 0\ \ 0\ \ 0\ \ x_5\ \ y_5\ \ 1\ \ -x_5y_6\ \ -y_5y_6\ \ -x_6 \\ x_7\ \ y_7\ \ 1\ \ 0\ \ 0\ \ 0\ \ -x_7x_8\ \ -y_7x_8\ \ -x_8 \\ 0\ \ 0\ \ 0\ \ x_7\ \ y_7\ \ 1\ \ -x_7y_8\ \ -y_7y_8\ \ -x_8 \end{bmatrix} \begin{bmatrix} h_{11} \\ h_{12} \\ h_{13} \\ h_{21} \\ h_{22} \\ h_{23} \\ h_{31} \\ h_{32} \\ 1 \end{bmatrix} =\begin{bmatrix} x_2 \\ y_2 \\ x_4 \\ y_4 \\ x_6 \\ y_6 \\ x_8 \\ y_8 \end{bmatrix}
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡x1 y1 1 0 0 0 −x1x2 −y1x2 −x20 0 0 x1 y1 1 −x1y2 −y1y2 −x2x3 y3 3 0 0 0 −x3x4 −y3x4 −x40 0 0 x3 y3 1 −x3y4 −y3y4 −x4x5 y5 1 0 0 0 −x5x6 −y5x6 −x60 0 0 x5 y5 1 −x5y6 −y5y6 −x6x7 y7 1 0 0 0 −x7x8 −y7x8 −x80 0 0 x7 y7 1 −x7y8 −y7y8 −x8⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡h11h12h13h21h22h23h31h321⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡x2y2x4y4x6y6x8y8⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
可使用最小二乘法
(大于4对匹配点)或奇异值分解SVD
等方法求解。
但在真实场景中,往往会有很多噪声,为了精确地计算,我们通常使用远大于4个的点来进行计算,上述方程组也很难通过线性解法来获得最优解,要使用一些优化算法。
python中可直接调用openCV中对函数进行计算,求解代码如下:
H, status = cv2.findHomography(pts_src, pts_dst)
(3) 配准方法 常用RANSAC/RHO
-
最小二乘拟合
:使用所有的点method=0
(默认,一般不用)有噪声情况下,往往无法正确拟合数据,仅适合于理想状态下(没有匹配异常值且噪声相当小)。
代价计算函数:
基于约束方程计算得到错误值,反向传播不断更新参数,直到两次错误差值满足要求阈值为止。 -
LMEDS
:最小中值最小二乘法的改进 ,对
高斯噪声
敏感算法。注意:
不需要任何阈值,但只有在inlier超过50%以上
情况下才会拟合生成比较好的H。(1)从整个数据集中随机选取很多个子集
(2)根据各个子集数据计算参数模型
(3)使用计算出来的参数对整个数据集计算中值平方残差
(4)最终最小残差所对应的参数即为拟合参数。 -
RANSAC
:基于随机样本一致性method=cv2.RANSAC
像素迁移产生多余的描述子匹配点对可以分为outlier、inlier两类,RANSAC可以很好的过滤掉outlier点对。基本思想:
从给定的数据中随机选取
一部分(从匹配数据集中随机抽出4个样本并保证这四个样本之间不共线)进行模型参数计算
,然后使用全部点对
进行计算结果评价
,不断迭代,直到选取的数据计算出来的错误率最低,eg.低于0.5%,步骤如下:(1)选择求解模型要求的最少随机点对
(2)根据选择随机点对求解/拟合模型,得到参数
(3)根据模型参数,对所有点对做评估,分为outlier跟inlier
(4)如果所有inlier的数目超过预定义的阈值,则使用所有inlier重新评估模型参数,停止迭代
(5)如果不符合条件,则继续1~4循环。核心就是
随机性和假设性
。随机性用于减少计算了,那个循环次数就是利用正确数据出现的概率。假设性
即随机抽出来的数据都认为是正确的,并以此去计算其他点,获得其他满足变换关系的点,然后利用投票机制,选出获票最多(范围内点最多)的那一个变换。代价函数:最小时的是最优模型
优点:
鲁棒性好,即使数据集包含很多outlier,仍然可以获得高精度的参数。
缺点:
1.计算参数的迭代次数没有上限;如果设置迭代次数的上限,得到的结果可能不是最优的结果,甚至可能得到错误的结果。
2.RANSAC只有一定的概率得到可信的模型,概率与迭代次数成正比。
3.它要求设置跟问题相关的阀值,且RANSAC只能从特定的数据集中估计出一个模型,如果存在两个(或多个)模型,RANSAC不能找到别的模型。
-
PROSAC(RHO)
:基于渐近样本一致性因为RANSAC是一种
全随机
的数据选取方式,完全没有考虑到数据质量不同,有时候RANSAC方法不会收敛
,导致图像对齐或者配准失败。该方法采用
半随机方法
,对所有点对进行质量评价计算Q值
,然后根据Q值降序排列,每次只在高质量点对
中进行模型假设与验证,这样就大大降低了计算量,在RANSAC无法收敛的情况下,PROSAC依然可以取得良好的结果。
Mat cv::findHomography (
InputArray srcPoints, # 目标图像的特征点集合
InputArray dstPoints, # 场景图像的特征点集合
int method = 0, # 0表示使用最小二乘拟合,还有cv2.RANSAC,cv2.LMEDS,cv2.RHO
double ransacReprojThreshold = 3, # 该参数只有在method参数为RANSAC与RHO的时启用,默认为3
OutputArray mask = noArray(), # 当method方法为RANSAC或LMEDS可用,掩模确定了inlier和outlier点
const int maxIters = 2000, # 最大迭代次数(使用RANSAC方法)
const double confidence = 0.995 # 置信参数,默认为0.995
)
(4) 应用
图像整合和拼接(合成全景图)
图像对齐
透视校正
相机标定
图像间的相机运动计算
虚拟广告牌
增强现实
二、图像拼接
1. 步骤
2. 示例
3.一个小demo
参考链接:
OpenCV单应性矩阵发现参数估算方法详解
《机器视觉》:单应性矩阵Homography matrix
使用OpenCV(Python / C ++)的同构示例