CS231A:Transformation in 2D

2D的点、线、面

这里的点都是齐次式

点在线上的条件
x T l = 0 x^T \cdot l=0

求过两点 x x x x' 的直线的表达式
l = x × x l = x \times x'

求两条直接直线的交点
x = l × l x = l \times l'

这里是叉乘,得到的是齐次式,换成非齐次就是交点的坐标

另一种写法:

x = l × l = i j k x 1 x 2 x 3 y 1 y 2 y 3 x = l \times l' = \begin{vmatrix} i & j & k \\ x_1 & x_2 & x_3 \\ y_1 & y_2 & y_3\end{vmatrix}

理想点和无穷远线

具有齐次坐标 ( x , y , 0 ) T (x,y,0)^T 的点,一般来说不会和二维平面中的有限点对应,求两个平行线的交点的时候就会有这样的结果,也和平行线相交于无穷远的概念相吻合。

这样的点也被称为理想点,或无穷远点,这些点的集合为 ( x 1 , x 2 , 0 ) T (x_1,x_2,0)^T ,都集合在无穷远线上,无穷远线为 I = ( 0 , 0 , 1 ) T I_{\infty}=(0,0,1)^T ,且:
( 0 , 0 , 1 ) ( x 1 , x 2 , 0 ) T = 0 (0,0,1) \cdot (x_1,x_2,0)^T=0

二次曲线

二次曲线方程: a x 2 + b x y + c y 2 + d x + e y + f = 0 ax^2 + bxy + cy^2 + dx + ey + f = 0

五个点定义一条二次曲线,设参数为$ c= (a,b,c,d,e,f)^T$,把五个点约束起来得到:

在这里插入图片描述
求过曲线 C C 上的点 x x 的切线 l l
l = C x l = Cx


中心投影

在这里插入图片描述
中心投影图
中心投影把一张平面的点映射成另一张平面的点,就是连接原点、 x x' x x 会在一条直线上,这种情况下直线还是被映射成直线,也能用 x = H x x'=Hx 来表示。

如果在两个平面建立的是直角坐标系,那么就会有比普通射影更多的约束,被称为透视映射

虽然直线被映射成直线,但是直线与直线之间的夹角变了


2D平面间的变换类型

交比(cross ratio)

在这里插入图片描述
定义式
关于交比的性质:

  1. 交比的值和各点的具体齐次值无关
  2. 如果每个点都是有限点,并且齐次表示中均选择 x 2 = 1 x_2=1 ,那么 x i ˉ x j ˉ |\bar{x_i}\bar{x_j} 就表示由 x i ˉ \bar{x_i} x j ˉ \bar{x_j} 的带符号的距离
  3. 如果其中有一个理想点,交比的定义仍然有效
  4. 在任何直线的射影变换下,交比的值不变

等距变换(Isometries transformations)

很简单,旋转与平移,也就是欧式变换
在这里插入图片描述
矩阵表示
ϵ = ± 1 \epsilon = \pm 1 ,表示等距变换是保向(+)的还是逆向(-1)的
在这里插入图片描述
分块形式
在这里插入图片描述
效果图
自由度:三个自由度:旋转一个,平移两个
不变量:长宽、角度、面积

相似变换(Similarity transformations)

欧式变换均匀缩放的复合:
在这里插入图片描述
矩阵表示

在这里插入图片描述
分块形式

在这里插入图片描述
效果图
自由度:比欧式变换多一个缩放,四个,可用两组点求出
不变量:夹角、长宽比例、面积比例

仿射变换(Affine transformations)

仿射变换是非奇异线性变换和一个平移变换的复合
在这里插入图片描述
矩阵表示

在这里插入图片描述
分块形式

其中 A A 是一个 2 × 2 2\times 2 是一个非奇异矩阵

理解A

可以把 A A 看成两种基本变换(旋转和非均匀缩放)的复合,可以分解为:
A = U D V T = ( U V T ) ( V D V T ) = R ( θ ) R ( ϕ ) D R ( ϕ ) A =UDV^T=(UV^T)(VDV^T)= R(\theta)R(-\phi)DR(\phi)
左边的式子是SVD算来的,对应起来如下:
R ( θ ) = U V T ,   D = D ,   R ( ϕ ) = V T R(\theta) = UV^T,\ D = D,\ R(\phi) = V^T
其中 R ( θ ) R(\theta) R ( ϕ ) R(\phi) 分别表示转角为 θ \theta ϕ \phi 的旋转, D D 是对角矩阵:
D = [ λ 1 0 0 λ 2 ] D = \begin{bmatrix} \lambda_1 & 0 \\ 0 & \lambda_2 \end{bmatrix}

解释下A做了什么:

先进行 ( ϕ ) (\phi) 的旋转,再旋转的基础上对 x , y x,y 分别进行比例因子 λ 1 , λ 2 \lambda_1,\lambda_2 的缩放,然后再加一个回转 ( ϕ ) (-\phi) ,再加一个旋转 ( θ ) (\theta) ,可以看下图:
在这里插入图片描述
1 4 顺序从1到4

为啥要旋转后再缩放再旋转回来?
缩放的方向是根据图像固定的吗,比如说垂直于坐标系?
答:应该是固定的,两个缩放轴还是正交的,和坐标系相关联,旋转到需要的角度,然后对着这个角度来进行缩放,一套组合拳

在这里插入图片描述
a : R ( θ )        b : R ( ϕ ) D R ( ϕ ) a:R(\theta)\ \ \ \ \ \ b:R(-\phi)DR(\phi)

在这里插入图片描述
效果图
自由度:比相似变换多了两个自由度,一个是缩放方向的 ϕ \phi ,京一个是缩放 x , y x,y 的比例 λ 1 : λ \lambda_1 : \lambda ,所以是六个

不变量

  1. 平行线。
  2. 平行线段的长度比。假定线段和正交缩放方向 x x- 轴的夹角是 α \alpha ,那么缩放比例就是 λ 1 2 c o s α 2 + λ 2 2 s i n 2 α \sqrt{\lambda^2_1cos^2_\alpha + \lambda^2_2sin^2\alpha} ,那么平行的线段夹角相同,缩放也就一样了
  3. 面积比。面积被缩放了 λ 1 λ 2 \lambda_1 \lambda_2 倍,所有的都是。

射影变换(Projective transformations)

是仿射变换的一种推广

在这里插入图片描述
分块形式

和仿射变换的区别
仿射变换在无穷远点的情况:
在这里插入图片描述
射影变换在无穷远点的情况:
在这里插入图片描述
我的理解就是多了个“放躺”的操作,这样无穷远点就能被映射到有限点,所以能对消影点进行建模。

射影变换作用
射影变换也叫单应(homography),将点从一个平面映射到另一个平面上,假设射影变换就是 h h ,那么满足射影变换的条件为:当且仅当 h ( x 1 ) , h ( x 2 ) , h ( x 3 ) h(x_1),h(x_2),h(x_3) 共线的时候, x 1 , x 2 , x 3 x_1,x_2,x_3 也共线。

构成 h h 的充要条件:存在一个 3 × 3 3 \times 3 非奇异矩阵 H H ,使得一平面上的任一个用矢量 x x 表示的点都满足 h ( x ) = H x h(x)=Hx h ( x ) h(x) 是对应平面的点。

在这里插入图片描述
矩阵表示

在这里插入图片描述
效果图
这个 H H 是一个齐次矩阵,就是说和点的齐次一样,乘上任何非零的常数都不会改变射影变换的效果,在这九个元素中有八个独立比率,因为一个射影变换有八个自由度

不变量:四共线点的交比。

总结

( 3 ) + ( 1 ) = ( 4 ) + ( 1 ) + ( 1 ) = 仿 ( 6 ) + v ( 2 ) = ( 8 ) 等距变换(3) + 缩放(1) = 相似变换(4) + 新缩放方向(1) + 缩放比例(1) = 仿射变换(6) + v(2) = 射影变换(8)
射影变换可以分解成一串变换链的复合:
在这里插入图片描述
其中 A = s R K + t V T / v A=sRK+tV^T/v K K 是行列式为1的归一化上三角矩阵。

H S , H A , H P H_S,H_A,H_P 分别是相似变换、仿射百年换、射影变换

一个分解的实例:
在这里插入图片描述
可以被分解为:
在这里插入图片描述
在这里插入图片描述


消除平面透视图象的摄影失真

有些东西形状的变化,比如原本是矩形,在图片中却变成了平行四边形,原本平行的线变得不平行,且相交于一个有限点。

在这里插入图片描述
此时,已知平面的中心投影图像和原来的图像是通过射影变换 H H 相关联的,所以这个图像就是原景物的射影失真,通过求 H H 的逆变换就能还原到原图,撤销射影变换的影响。

这是2D到2D,投影是3D到2D

方法

找两个图片的对应坐标,但是咱也不知道点啊?是手动把照片跳过去,然后求 H H ? 坐标系按照 中心投影图 那样,从左下角开始,作为原点?
还是说找四个本应平行的点,设为平行?要不写个代码看看行否
答:需要四个点,可以再原图取四个点,然后根据想要的关系设置对应的点,例子可以看后面的代码

假设两个平面有一对匹配点 x , x x,x' ,对应的非齐次坐标是 ( x , y ) T ,   ( x , y ) T (x,y)^T,\ (x',y')^T ,两个平面间的射影变换可写成如下非齐次形式:
在这里插入图片描述
一组点可以提供两个方程,简化后:
在这里插入图片描述

H H 有八个参数,所以四个点就可以求出来 H H 的解,但是这四个点不能太特殊,比如共线。

这是最一般的方法,使用最小二乘就能求出来,而且现在也能直接用opencv来求


代码

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('C:\\Users\\saber\\Desktop\\CS231A\\python\\aa.png')
fig, ax = plt.subplots(2,3)
rows,cols = img.shape[:2]


# 原图
ax[0][0].imshow(img)
ax[0][0].set_title('original')


# 等距变换
H = np.float32([[1,0,100],[0,1,50]])
# 注意行列顺序
iso_t = cv2.warpAffine(img,H,(cols,rows))
ax[0][1].imshow(iso_t)
ax[0][1].set_title('iso')

# 缩放
# 想直接用比例就要在第二个参数设置None,这个是控制resize后大小的
scale = cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
ax[0][2].imshow(scale)
ax[0][2].set_title('scale')

# 旋转
# 参数为:旋转中心、旋转角度(逆时针)、缩放比例
rot_matrix = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
rot = cv2.warpAffine(img,rot_matrix,(cols,rows))
ax[1][0].imshow(rot)
ax[1][0].set_title('rot')

# 仿射
# 仿射需要三个点对应起来
# 109,50 对 109 50
# 63 272 对 109 272
# 256 50 对 256 50
point_1 = np.float32([[109,50],[63,272],[256,50]])
point_2 = np.float32([[109,50],[109,272],[256,50]])
Aff_mat = cv2.getAffineTransform(point_1,point_2)
Aff = cv2.warpAffine(img,Aff_mat,(cols,rows))
ax[1][1].imshow(Aff)
ax[1][1].set_title('Aff')

# 透视
# 透视需要四个点
poi_1 = np.float32([[109,50],[63,272],[256,50],[300,272]])
poi_2 = np.float32([[109,50],[109,272],[256,50],[256,272]])
Per_mat = cv2.getPerspectiveTransform(poi_1,poi_2)
Per = cv2.warpPerspective(img,Per_mat,(cols,rows))
ax[1][2].imshow(Per)
ax[1][2].set_title('Per')

plt.show()

在这里插入图片描述
结果图

发布了63 篇原创文章 · 获赞 2 · 访问量 8031

猜你喜欢

转载自blog.csdn.net/McEason/article/details/104106971
2D