单应性变换与仿射变换

经典的仿射变换 初始来自于 ABB实习的项目;目前看有关于多帧去噪论文 Burst Image Deblurring,发现论文作者使用单应性变换进行多帧图片之间的粗对齐。

1、详细的总结性文章 知乎专栏

2、简明的总结性文章 CSDN blog

3、总结以及广告牌图片更替 广告牌更替

4、单应性变换,配图说明很经典出彩 homography知多少

5、全面了解:图像单应性变换理解

1、基础入门

什么是单应性?

图像中的2D点(x,y)(x,y)可以被表示成3D向量的形式(x1,x2,x3)(x1,x2,x3),它被叫做点的齐次表达,位于投影平面P上。所谓单应就是发生在投影平面P上的点和线可逆的映射。其它叫法包括射影变换、投影变换和平面投影变换等。

单应变换矩阵是一个3*3的矩阵H。这个变换可以被任意乘上一个非零常数,而不改变变换本身。所以它虽然具有9个元素,但是具有8个自由度。这意味这它里面有8个未知参数待求;矩阵中[3,3]位置的变量值为1。

典型地,可以通过图像之间的特征匹配来估计单应矩阵。

和其它几何变换的比较

更好地理解单应变换,可将它与其它几何变换做比较。单应变换具有8个自由度,其它一些更简单的变换也是3*3矩阵,只不过它们包含一些特定的约束来降低自由度的数量。

从紧约束至松约束,逐步接近单应变换,下面展示了这些变换的层级,以及展示把单应变换分解成简单变换的集合。

刚体变换

它是保持欧式距离的变换,这意味着图像之间只有2D旋转和2D平移运动。它只有3个自由度。刚体变换表示如下:其中R是个2*2的旋转矩阵,t是2维列向量,0T是为0的二维行向量。

相似变换
相比刚体变换增加了均匀的缩放。均匀的意思是各个方向的缩放比例相同。尺度变换增加了一个自由度,所以自由度为4。和刚体一样,具有保角性。点之间的距离不再保持不变,但距离比保持不变。相似变换表示如下,s是缩放尺度。:

仿射变换

仿射变换和相似变换近似,不同之处在于:相似变换具有单一旋转因子和单一的缩放因子,而仿射变换是两个旋转因子和两个缩放因子的组合。所以它又多了两个自由度,共6个自由度。和相似变换不同,它不具有保角性和保持距离比的性质。尽管如此,它仍具有“保持平行”的特性,即原图的平行线,变换后仍是平行线。仿射变换表示如下:

投影变换

千呼万唤始出来,终于到了投影变换,或者叫做单应变换。投影变换是齐次坐标下非奇异的线性变换。然而在非齐次坐标系下却是非线性的,这说明齐次坐标的发明是很有价值的。投影变换比仿射变换多2个自由度,具有8个自由度。上面提到的仿射变换具有的“不变”性质,在投影变换中已不复存在了。尽管如此,它还是有一项不变性,那就是在原图中保持共线的3个点,变换后仍旧共线。投影变换表示如下:

透视变换

到此为止,我们已经领教了2D到2D的变换。另外一个受到广泛研究的变换是透视变换,它描述了将空间3D点投影成2D点的变换。这种投影发生于这种情形:相机拍摄真实世界多幅图像,然后将结果显示在一副图像平面上。

在齐次坐标下,透视投影被表示为一个3*4的相机矩阵P,如下:

2、原理介绍

单应性矩阵:在两视几何中,可以这样理解,两架相机拍同一空间上得到两幅图像AB,其中一幅A在另一幅B存在一种变换而且是一一对应的关系,这种一一对应的关系可以用矩阵来进行表示,即为单应矩阵 。

透视变换与单应性变换:
两者联系:
都用于计算单应矩阵,即解一个线性方程组。由于单应矩阵有8个未知数(3*3,其中第9个数为1),所以至少需要4个点(每个点包括x,y,提供2个约束方程)。

两者区别:
1.计算方法不同:通过跟踪源码,发现getPerspectiveTransform用的是SVD分解,findHomography看不出是用什么方法(没注释,一堆等式)。但两者计算结果是一样的。

2.输入参数不同:getPerspectiveTransform只会拿前4个点去计算,findHomography则会拿一堆点(>=4)去计算(其是不断从一堆点中重复拿出4个点去计算出一个结果,再采用一些优化算法RANSAC/LMEDS去筛选出最优解)。

3、OpenCV方法

通常的来说求解的变换矩阵有2*3或者3*3矩阵两种方法,一般而言与Affine相关的求解均为2*3矩阵,与Perspective相关的内容均为3*3矩阵。

  • estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵
    (2行x3列),H可以是部分自由度,比如各向一致的切变。#opencv更新之后函数由estimateAffine2D所替.

  • findHomography: 计算多个二维点对之间的最优单映射变换矩阵 H(3行x3列) ,使用最小均方误差或者RANSAC方法 。#与上一行方法类似。

  • getAffineTransform():计算3个二维点对之间的仿射变换矩阵H(2行x3列),自由度为6.

  • warpAffine():对输入图像进行仿射变换

  • getPerspectiveTransform():计算4个二维点对之间的透射变换矩阵 H(3行x3列)

  • warpPerspective(): 对输入图像进行透射变换

  • perspectiveTransform():对二维或者三维矢量进行透射变换,也就是对输入二维坐标点或者三维坐标点进行投射变换。

  • estimateAffine3D:计算多个三维点对之间的最优三维仿射变换矩阵H (3行x4列)

  • transform():对输入的N维矢量进行变换,可用于进行仿射变换、图像色彩变换.

  • findFundamentalMat:计算多个点对之间的基矩阵H。

  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值