zoukankan      html  css  js  c++  java
  • 单应性(homography)变换的推导

    矩阵的一个重要作用是将空间中的点变换到另一个空间中。这个作用在国内的《线性代数》教学中基本没有介绍。要能形像地理解这一作用,比较直观的方法就是图像变换,图像变换的方法很多,单应性变换是其中一种方法,单应性变换会涉及到单应性矩阵。单应性变换的目标是通过给定的几个点(通常是4对点)来得到单应性矩阵。假设单应性矩阵为:

    $$
    H= egin{bmatrix}
    h_{11} & h_{12} & h_{13} \
    h_{21} & h_{22} & h_{23} \
    h_{31} & h_{32} & h_{33}
    end{bmatrix}
    $$
     上面的矩阵$H$会将一幅图像上的一个点的坐标$a=(x,y,1)$映射成另一幅图像上的点的坐标$b=(x_1,y_1,1)$,但H是未知的。通常需要根据在同一平面上已知的一些点对(比如$a$,$b$)来求$H$。 假设已知点对($a$,$b$),则有下面的公式:
    egin{equation}
    b=Ha^T
    end{equation}
    即:
    egin{equation}
    left{
    egin{aligned}
    x_1=h_{11}x + h_{12}y + h_{13}\
    y_1=h_{21}x + h_{22}y + h_{23}\
    1=h_{31}x + h_{32}y + h_{33} \
    end{aligned}
    ight.
    end{equation}
    由上面这个公式中的$1=h_{31}x + h_{32}y + h_{33}$可得到下面两个等式
    egin{equation}
    left{
    egin{aligned}
    x_1=frac{x_1}{1}=frac{h_{11}x + h_{12}y + h_{13}}{h_{31}x + h_{32}y + h_{33}}\
    y_1=frac{y_1}{1}=frac{h_{21}x + h_{22}y + h_{23}}{h_{31}x + h_{32}y + h_{33}}\
    end{aligned}
    ight.
    end{equation}
    egin{equation*}
    Rightarrow
    end{equation*}
    egin{equation}
    left{
    egin{aligned}
    h_{11}x+h_{12}y+h_{13}=h31xx_1+h_{32}yx_1+h_{33}x_1\
    h_{21}x + h_{22}y + h_{23}=h31xy_1+h_{32}yy_1+h_{33}y_1\
    end{aligned}
    ight.
    end{equation}
    egin{equation*}
    Rightarrow
    end{equation*}
    egin{equation}
    label{eq1}
    left{
    egin{aligned}
    0=h_{31}xx_1+h_{32}yx_1+h_{33}x_1-(h_{11}x+h_{12}y+h_{13})\
    0=h_{31}xy_1+h_{32}yy_1+h_{33}y_1-( h_{21}x + h_{22}y + h_{23})\
    end{aligned}
    ight.
    end{equation}
    对于方程(1)可写成一个矩阵与一个向量相乘,即:
    egin{equation}
    label{eq2}
    egin{bmatrix}
    -x & -y &-1&0&0&0&xx_1&yx_1&x_1 \
    0&0&0& -x & -y &-1&xy_1&yy_1&y_1 \
    end{bmatrix} h=0
    end{equation}
    其中,$h=[h_{11} , h_{12} , h_{13} , h_{21} , h_{22} , h_{23} , h_{31} , h_{32} , h_{33}]^T$,是一个9维的列向量。若令:
    egin{equation}
    A=egin{bmatrix}
    -x & -y &-1&0&0&0&xx_1&yx_1&x_1 \
    0&0&0& -x & -y &-1&xy_1&yy_1&y_1 \
    end{bmatrix}
    end{equation}
    则$eqref{eq2}$可以记为
    egin{equation}
    Ah=0
    end{equation}
    这里的$Ain R^{2 imes 9}$。这只是1对点所得到的矩阵$A$。究竟要多少点对才能求出$H$?由于我们是采用齐次坐标(即(x,y,1))来表示平面上的点,所以存在一个非零的标量$s$,使得$b_1=sHa^T$与$b=sHa^T$都表示同一个点$b$。若令$s=frac{1}{h_{33}}$,则$frac{1}{h_{33}}H$为

    egin{equation}
    label{eq3}
    frac{1}{h_{33}}H=
    egin{bmatrix}
    frac{h_{11}}{h_{33}} &frac{h_{12}}{h_{33}} &frac{h_{13}}{h_{33}} \
    frac{h_{21}}{h_{33}} &frac{h_{22}}{h_{33}} &frac{h_{23}}{h_{33}} \
    frac{h_{31}}{h_{33}} &frac{h_{32}}{h_{33}} &1
    end{bmatrix}
    end{equation}

    从公式$eqref{eq3}$可以看出,其实$H$只有8个变量(8个自由度)。因此,只需要4个点对,然后通过解线性方程组就可以求得$H$。也可以多于4个点对。

    假设有$ngeq 4$个点对,则得到的矩阵$Ain R^{2n imes 9}$。如何求解向量$h$呢?方法很简单,真接对$A$进行SVD分解,即
    egin{equation}
    U*Sigma*V^T
    end{equation}
    然后取$V$的最后一列出来作为求解$h$。因为矩阵$A$是行满秩,即只有一个自由度。
    具体实现时,先要得到两幅图,然后在两幅图之间找到4对点的坐标,由此得到矩阵$A$,然后在matlab中可以这样实现:

    [U,S,V]=svd(A);

    h=V(:,9);

    H= reshape(h,3,3);

    由单应性矩阵可以得到仿射变换,还可以在单应性矩阵上做图像拼接。

  • 相关阅读:
    html+css第五篇
    客户退出后操作-不能查询之后的数据,可以查询到退出前的历史数据
    html+css第四篇
    让bat文件自动以管理员身份运行
    MS SQLServer相关自动化程序的问题汇总 (SQLServer每天定时输出EXCEL或xml的格式的问题等 )
    统一操作系统 UOS 回应质疑 (独立思考)
    JAVA是否最适合企业应用开发?
    运维常说的 5个9、4个9、3个9 的可靠性,到底是什么鬼?
    百度网盘分享创建自定义密码的方法失效了怎么办(2020年)?
    Win10如何设置休眠选项(关于睡眠、休眠、快速启动这几个伪关机功能如何设置更适合笔记本电脑?)
  • 原文地址:https://www.cnblogs.com/ml-cv/p/5871052.html
Copyright © 2011-2022 走看看