透视变换原理实例代码详解
Posted 修炼之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了透视变换原理实例代码详解相关的知识,希望对你有一定的参考价值。
导读
在上篇文章中,我们介绍了仿射变换
,我们只需要通过一个两行三列的变换矩阵M
就能够对图像实现平移
、缩放
、翻转
、旋转
操作。我们发现这些变换其实都属于平面变换
,如果我们想要进行空间变换
呢?
将上图的扑克牌单独提取出来,如下图所示
这时候我们应该如何来实现这个功能呢?这个其实就涉及到了图像的一个空间变换,就需要用到我们所说的透视变换
了。
透视变换
透视变换
(Perspective Transformation)是指利用透视中心
、像点
、目标点
三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。简而言之,就是将一个平面通过一个投影矩阵投影到指定平面上
。
- 原理解析
透视变换通用的变换公式:
[ x ′ y ′ ω ′ ] = [ u v ω ] [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] \\left[ \\beginmatrix x' &y'&\\omega' \\\\ \\endmatrix \\right] = \\left[ \\beginmatrix u &v&\\omega \\\\ \\endmatrix \\right] \\left[ \\beginmatrix a_11 & a_12 & a_13 \\\\ a_21 & a_22 & a_23 \\\\ a_31 & a_32 & a_33 \\\\ \\endmatrix \\right] [x′y′ω′]=[uvω]⎣⎡a11a21a31a12a22a32a13a23a33⎦⎤
u u u和 v v v是原始图片,参数 ω \\omega ω等于1,通过透视变换后得到的图片坐标 x x x, y y y,其中
x = x ′ ω ′ y = y ′ ω ′ x = \\fracx'\\omega'\\\\ y = \\fracy'\\omega' x=ω′x′y=ω′y′
上式中的变换矩阵,可以将其拆成四个部分,第一部分表示线性变换
:
[ a 11 a 12 a 21 a 22 ] \\left[ \\beginmatrix a_11 & a_12\\\\ a_21 & a_22\\\\ \\endmatrix \\right] [a11a21a12a22]
这部分矩阵主要用于图像的缩放
、旋转
操作,在仿射变换中我们也介绍过。第二部分用来进行平移
操作 [ a 31 a 32 ] \\left[\\beginmatrixa_31 & a_32\\endmatrix\\right] [a31a32],第三部分用来产生透视变换
[ a 13 a 23 ] \\left[\\beginmatrix a_13 & a_23\\endmatrix\\right] [a13a23],第四部分参数 a 33 a_33 a33等于1。
在上篇文章中我们介绍的仿射变换矩阵
一共有6个参数,所以我们只需要3个坐标对
(6个方程)就能求解,而透视变换矩阵
一共有8个参数,所以需要4个坐标对
(8个方程)才能求解,其实仿射变换
也是透视变换
的一种特殊形式。
所以变换后 x x x和 y y y的表达式为
x = x ′ ω ′ = a 11 ∗ u + a 21 ∗ v + a 31 ∗ 1 a 13 ∗ u + a 23 ∗ v + 1 ∗ 1 y = y ′ ω ′ = a 12 ∗ u + a 22 ∗ v + a 32 ∗ 1 a 13 ∗ u + a 23 ∗ v + 1 ∗ 1 x=\\fracx'\\omega'=\\fraca_11*u+a_21*v+a_31*1a_13*u+a_23*v+1*1\\\\ y=\\fracy'\\omega'=\\fraca_12*u+a_22*v+a_32*1a_13*u+a_23*v+1*1 x=ω′x′=a13∗u+a23∗v+1∗1a11∗u+a21∗v+a31∗1y=ω′y′=a13∗u+a23∗v+1∗1a12∗u+a22∗v+a32∗1
接下来我们看一个例子,原始图像
的四个点的坐标分别为 ( 0 , 0 ) 、 ( 1 , 0 ) 、 ( 1 , 1 ) 、 ( 0 , 1 ) (0,0)、(1,0)、(1,1)、(0,1) (0,0)、(1,0)、(1,1)、(0,1)与之对应变换后的四个点坐标分别为 ( x 1 , y 1 ) 、 ( x 2 , y 2 ) 、 ( x 3 , y 3 ) 、 ( x 4 , y 4 ) (x_1,y_1)、(x_2,y_2)、(x_3,y_3)、(x_4,y_4) 以上是关于透视变换原理实例代码详解的主要内容,如果未能解决你的问题,请参考以下文章