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

$$
H= \begin{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)$,也就是说,我们已知$a$和$b$,它们是在同一平面上。 则有下面的公式:
\begin{equation}
b=Ha^T
\end{equation}
即:
\begin{equation}
\left\{
\begin{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}
\right.
\end{equation}
由上面这个公式中的$1=h_{31}x + h_{32}y + h_{33}$可得到下面两个等式
\begin{equation}
\left\{
\begin{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}
\right.
\end{equation}
\begin{equation*}
\Rightarrow
\end{equation*}
\begin{equation}
\left\{
\begin{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}
\right.
\end{equation}
\begin{equation*}
\Rightarrow
\end{equation*}
\begin{equation}
\label{eq1}
\left\{
\begin{aligned}
0=h31xx_1+h_{32}yx_1+h_{33}x_1-(h_{11}x+h_{12}y+h_{13})\\
0=h31xy_1+h_{32}yy_1+h_{33}y_1-( h_{21}x + h_{22}y + h_{23})\\
\end{aligned}
\right.
\end{equation}
对于方程$\eqref{eq1}$ ,可写成一个矩阵与一个向量相乘,即:
\begin{equation}
\label{eq2}
\begin{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维的列向量。若令:
\begin{equation}
A=\begin{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}$可以记为
\begin{equation}
Ah=0
\end{equation}
这里的$A\in R^{2\times 9}$。这只是1对点所得到的矩阵$A$,若有4对点,则得到的矩阵$A\in R^{8\times 9}$。如何求解向量$h$呢?方法很简单,真接对$A$进行SVD分解,即
\begin{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);

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

单应性(homography)变换的推导的更多相关文章

  1. 【Computer Vision】图像单应性变换/投影/仿射/透视

    一.基础概念 1. projective transformation  = homography = collineation. 2. 齐次坐标:使用N+1维坐标来表示N维坐标,例如在2D笛卡尔坐标 ...

  2. OpenCV仿射变换+投射变换+单应性矩阵

    本来想用单应性求解小规模运动的物体的位移,但是后来发现即使是很微小的位移也会带来超级大的误差甚至错误求解,看起来这个方法各种行不通,还是要匹配知道深度了以后才能从三维仿射变换来入手了,纠结~ esti ...

  3. OpenCV 之 平面单应性

    上篇 OpenCV 之 图象几何变换 介绍了等距.相似和仿射变换,本篇侧重投影变换的平面单应性.OpenCV相关函数.应用实例等. 1  投影变换 1.1  平面单应性 投影变换 (Projectiv ...

  4. 相机标定 和 单应性矩阵H

    求解相机参数的过程就称之为相机标定. 1.相机模型中的四个平面坐标系: 1.1图像像素坐标系(u,v) 以像素为单位,是以图像的左上方为原点的图像坐标系: 1.2图像物理坐标系(也叫像平面坐标系)(x ...

  5. 机器学习进阶-案例实战-图像全景拼接-图像全景拼接(RANSCA) 1.sift.detectAndComputer(获得sift图像关键点) 2.cv2.findHomography(计算单应性矩阵H) 3.cv2.warpPerspective(获得单应性变化后的图像) 4.cv2.line(对关键点位置进行连线画图)

    1. sift.detectAndComputer(gray, None)  # 计算出图像的关键点和sift特征向量 参数说明:gray表示输入的图片 2.cv2.findHomography(kp ...

  6. python opencv3 FLANN单应性匹配

    git:https://github.com/linyi0604/Computer-Vision 匹配准确率非常高. 单应性指的是图像在投影发生了 畸变后仍然能够有较高的检测和匹配准确率 # codi ...

  7. opencv 仿射变换 投射变换, 单应性矩阵

    仿射 estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵 (2行x3列),H可以是部分自由度,比如各向一致的切变. getAffineTransform( ...

  8. OpenCV-Python 特征匹配 + 单应性查找对象 | 四十五

    目标 在本章节中,我们将把calib3d模块中的特征匹配和findHomography混合在一起,以在复杂图像中找到已知对象. 基础 那么我们在上一环节上做了什么?我们使用了queryImage,找到 ...

  9. OpenCV,计算两幅图像的单应矩阵

    平面射影变换是关于其次3维矢量的一种线性变换,可以使用一个非奇异的$3 \times 3$矩阵H表示,$X' = HX$,射影变换也叫做单应(Homography).计算出两幅图像之间的单应矩阵H,那 ...

随机推荐

  1. JUST SORT

    We define B is a Divisor of one number A if A is divisible by B. So, the divisors of 12 are 1, 2, 3, ...

  2. java socket网络编程(多线程技术)

    Client.java import java.io.*; import java.net.*; import java.util.*; public class Client { public st ...

  3. Android----->多线程的实现Thread、IntentService的运用

    首先建立一个Intent.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...

  4. CodeForces 687C The Values You Can Make(动态规划)

    这个也可以说是一个01背包了,里面也有一些集合的思想在里面,首先dp方程,dp[i][j]代表着当前数值为i,j能否被构成,如果dp[i][j] = 1,那么dp[i+m][j] 和 dp[i+m][ ...

  5. 学习笔记——策略模式Strategy

    策略模式,与模板模式一样,都是为了将接口和算法实现解耦,但策略模式更主要是整体算法的替换,而模板模式主要是流程一致,部分算法的替换. 个人理解为,一般算法替换,使用策略模式,当算法流程一致,可以提取为 ...

  6. 基于VirtualBox 安装和配置Fuel OpenStack(V6.1)

    1.环境准备 准备一台内存较大的主机,12G以上 下载安装VirtualBox及其匹配的扩展包 virtualbox: http://download.virtualbox.org/virtualbo ...

  7. Review Board的使用

    代码审核工具.先在命令行界面,进入到工程的Main目录下,然后使用命令 svn diff>yus.diff  这样就将Main里面的所有内容生成了,然后在浏览器里进入到自己的Review Boa ...

  8. JQuery中一个简单的表单验证的实例

    html代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  9. 【转】Build Your own Simplified AngularJS in 200 Lines of JavaScript

    原文:http://blog.mgechev.com/2015/03/09/build-learn-your-own-light-lightweight-angularjs/ Build Your o ...

  10. Java 六种异常处理的陋习(转)

    Java 六种异常处理的陋习 原文链接:  http://www.cnblogs.com/Android-and-android/archive/2013/05/02/3054469.html 你觉得 ...