总结:Homography和图像拼接

一、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=Hx1y11=h00h10h20h01h11h21h02h12h22x1y11

(1) 齐次坐标

上式是一个齐次坐标式,因为Homography Matrix是一个 3 ∗ 3 3*3 33的矩阵,所以要整成 3 ∗ 1 3*1 31的齐次坐标式形式,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]

优点:
  1. 可以很清楚的确定一个点是否在直线/平面上
  2. 可以描述无穷远点:(x,y,0)
  3. 更简洁的表达欧氏空间变换,可以把平移和旋转写到一个矩阵里
  4. 方便表达直线与直线,平面与平面的交点
  5. 能够区分一个向量和一个点

从零开始一起学习SLAM | 为什么要用齐次坐标?

(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=h11h21h31h12h22h32h13h23h33x1y11p2=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+h13h31x1x2h32y1x2=x2h21x1+h22y1+h23h31x1y2h32y1y2=y2

⇒ \Rightarrow 即有 A ∗ H = 0 A*H=0 AH=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  x8h11h12h13h21h22h23h31h321=x2y2x4y4x6y6x8y8
在这里插入图片描述
可使用最小二乘法(大于4对匹配点)或奇异值分解SVD等方法求解。

但在真实场景中,往往会有很多噪声,为了精确地计算,我们通常使用远大于4个的点来进行计算,上述方程组也很难通过线性解法来获得最优解,要使用一些优化算法。

python中可直接调用openCV中对函数进行计算,求解代码如下:

H, status = cv2.findHomography(pts_src, pts_dst)

(3) 配准方法 常用RANSAC/RHO
  1. 最小二乘拟合:使用所有的点   method=0 (默认,一般不用)

    有噪声情况下,往往无法正确拟合数据,仅适合于理想状态下(没有匹配异常值且噪声相当小)。

    代价计算函数:
    在这里插入图片描述
    基于约束方程计算得到错误值,反向传播不断更新参数,直到两次错误差值满足要求阈值为止。

  2. LMEDS:最小中值

    最小二乘法的改进 ,对高斯噪声敏感算法。

    注意:不需要任何阈值,但只有在inlier超过50%以上情况下才会拟合生成比较好的H。

    (1)从整个数据集中随机选取很多个子集
    (2)根据各个子集数据计算参数模型
    (3)使用计算出来的参数对整个数据集计算中值平方残差
    (4)最终最小残差所对应的参数即为拟合参数。

  3. 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不能找到别的模型。

    随机抽样一致算法(Random sample consensus,RANSAC)

  4. 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 ++)的同构示例

Homography Matrix 单应矩阵
单应性Homograph估计:从传统算法到深度学习
图像和图像的映射

关于齐次坐标的理解(经典)
特征匹配与单应性查找对象

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值