CS231A:Transformation in 2D

2D的点、线、面

这里的点都是齐次式

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

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

求两条直接直线的交点
x = l × l ′ x = l \times l' x=l×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=l×l=ix1y1jx2y2kx3y3

理想点和无穷远线

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

这样的点也被称为理想点,或无穷远点,这些点的集合为 ( x 1 , x 2 , 0 ) T (x_1,x_2,0)^T (x1,x2,0)T,都集合在无穷远线上,无穷远线为 I ∞ = ( 0 , 0 , 1 ) T I_{\infty}=(0,0,1)^T I=(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 (0,0,1)(x1,x2,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 ax2+bxy+cy2+dx+ey+f=0

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

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


中心投影

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

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

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


2D平面间的变换类型

交比(cross ratio)

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

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

等距变换(Isometries transformations)

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

相似变换(Similarity transformations)

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

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

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

仿射变换(Affine transformations)

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

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

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

理解A

可以把 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) A=UDVT=(UVT)(VDVT)=R(θ)R(ϕ)DR(ϕ)
左边的式子是SVD算来的,对应起来如下:
R ( θ ) = U V T ,   D = D ,   R ( ϕ ) = V T R(\theta) = UV^T,\ D = D,\ R(\phi) = V^T R(θ)=UVT, D=D, R(ϕ)=VT
其中 R ( θ ) R(\theta) R(θ) R ( ϕ ) R(\phi) R(ϕ)分别表示转角为 θ \theta θ ϕ \phi ϕ的旋转, D D D是对角矩阵:
D = [ λ 1 0 0 λ 2 ] D = \begin{bmatrix} \lambda_1 & 0 \\ 0 & \lambda_2 \end{bmatrix} D=[λ100λ2]

解释下A做了什么:

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

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

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

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

不变量

  1. 平行线。
  2. 平行线段的长度比。假定线段和正交缩放方向 x − 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} λ12cosα2+λ22sin2α ,那么平行的线段夹角相同,缩放也就一样了
  3. 面积比。面积被缩放了 λ 1 λ 2 \lambda_1 \lambda_2 λ1λ2倍,所有的都是。

射影变换(Projective transformations)

是仿射变换的一种推广

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

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

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

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

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

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

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

总结

等 距 变 换 ( 3 ) + 缩 放 ( 1 ) = 相 似 变 换 ( 4 ) + 新 缩 放 方 向 ( 1 ) + 缩 放 比 例 ( 1 ) = 仿 射 变 换 ( 6 ) + v ( 2 ) = 射 影 变 换 ( 8 ) 等距变换(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 A=sRK+tVT/v K K K是行列式为1的归一化上三角矩阵。

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

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


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

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

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

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

方法

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

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

H H 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()

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值