矩阵变换小知识

如何将一个任意正方形变换为任意形状的四边形(不知道是否包含凹的啊,这个先不考虑)

仿射变换肯定不行的了,它保持了平行性,即原两条线平行,变换之后还平行
投影变换就可以,因为它仅仅保持了共线性,即只保证一条直线上的点变换之后仍然在一条直线上(参见Multiple View Geometry in computer vision P33)
下面用程序说明一下,具体参见:http://alumni.media.mit.edu/~cwren/interpolator/
先把目标点和对应的点给出来

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
oriD=[(0,0),(0,1),(1,1),(1,0)]
dstD=[(2,1),(3,3),(4,2),(3,0)]
ori=np.array(oriD)
dst=np.array(dstD)
plt.scatter(ori[:,0],ori[:,1],s=30,c=['r','g','b','c'])
plt.scatter(dst[:,0],dst[:,1],s=120,c=['r','g','b','c'])

大点代表变换后的,颜色对应
source_dst_points.gif

def getLeft(a,b):
    t1=(a[0],a[1],1,0,0,0,-1*b[0]*a[0],-1*b[0]*a[1])
    t2=(0,0,0,a[0],a[1],1,-1*b[1]*a[0],-1*b[1]*a[1]) 
    dotLeft=t1+t2
    return dotLeft
def getWright(b):    
    return (b[0],b[1])
def getMatrix(x,y):
    A=np.array([getLeft(a,b) for (a,b) in zip(x,y)]).reshape((8,-1))
    B=np.vstack([getWright(b) for b in y]).flatten()
    m=np.linalg.solve(A,B)
    m=np.array(list(m)+[1]).reshape((3,3))
    return m
变换过去:
m=getMatrix(ori,dst)
[m.dot(np.array(list(x)+[1])) for x in oriD]
[array([ 2.,  1.,  1.]),
 array([ 3.,  3.,  1.]),
 array([ 4.,  2.,  1.]),
 array([ 3.,  0.,  1.])]
逆变换也能够变回来:
m_inv=np.linalg.pinv(m)
[m_inv.dot(np.array(list(x)+[1])) for x in dstD]
[array([  3.33066907e-16,   2.22044605e-16,   1.00000000e+00]),
 array([  5.55111512e-16,   1.00000000e+00,   1.00000000e+00]),
 array([ 1.,  1.,  1.]),
 array([  1.00000000e+00,   2.22044605e-16,   1.00000000e+00])]

注:投影变换应使用齐次坐标来理解,变换矩阵又叫齐次矩阵,对于齐次变换,由于矩阵元素的比才是重要的,因此齐次矩阵其实只有8个自由度,计算的时候,将齐次矩阵的[3,3]元素,即角落里那个设为1,源和目标坐标的齐次坐标也设为1

行列式和线性变换

本文源自:http://mathinsight.org/determinant_linear_transformation
T:Rn→Rm 是一个从n维到m维空间的映射,对应一个m*n的矩阵

One-dimensional linear transformations

T(x)=ax
a 看作a 1×1 matrix,行列式就是a

一维变换的行列式对应‘长度’
例如T(x)=3x,将长度拉长为原来的3倍,方向不变
linear_transformation_3x.png
还有 T(x)=−1/2,行列式为负,将朝向改变,实际是就是‘镜像’了
linear_transformation_minus_half_x.png

Two-dimensional linear transformations

T:R2→R2
\({T}(x,y) = (ax+by,cx+dy) = \left[\begin{array}{cc}a &b\\ c &d\end{array}\right]\left[\begin{array}{c}x\\y\end{array}\right],\)

更简洁一点
\(\{T}(\vc{x}) = A\vc{x},\)
We will view T as mapping objects from the xy-plane onto an x′y′-plane: (x′,y′)=T(x,y).

\(\vc{T}(x,y) = \left[\begin{array}{cc}-2 &0\\ 0 &-2\end{array}\right]\left[\begin{array}{c}x\\y\end{array}\right].\)
行列式为4,不改变朝向,即顺时针旋转过来,各个颜色还能对应上
linear_transformation_2d_m2_0_0_m2.png
下面这个就不同了,顺时针旋转过来,各个颜色对应不上了
linear_transformation_2d_m1_m1_1_3.png

Three-dimensional linear transformations

T:R3→R3改变的是体积和朝向

转载于:https://www.cnblogs.com/marquis/p/4349387.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值