affine transformation

来源:互联网 发布:欧洲难民知乎 编辑:程序博客网 时间:2024/05/29 10:06
什么是仿射变换以及仿射变换矩阵?
仿射变换可以理解为
?对坐标进行放缩,旋转,平移后取得新坐标的值。
?经过对坐标轴的放缩,旋转,平移后原坐标在在新坐标领域中的值。
 
如上图所示,XY坐标系坐标轴旋转θ,坐标原点移动(x0,y0)。
XY坐标系中的坐标(X,Y),则求新坐标系xy中的坐标值的方程组为:
 
X = X・cosθ - Y・sinθ + x0
Y = X・sinθ + Y・cosθ + y0
 
写成矩阵形式为
 
| x |             | cosθ   sinθ |   | x0 |
|   | = | X Y | * |            | + |    |
| y |             | -sinθ  cosθ |   | y0 |
 
为将原点移动的值放入矩阵,则可以加入一个不影响原方程组的解的冗余方程。于是可以写成
 
X = X・cosθ - Y・sinθ + x0
Y = X・sinθ + Y・cosθ + y0
1 = X・0     + Y・0     + 1
 
写成矩阵形式为
| x |               | cosθ   sinθ   0|
| y | = | X 1 | * | -sinθ  cosθ   0|
| 1 |               | x0      y0    1|
 
这个矩阵就是Helmert变换矩阵。
 
考虑到新坐标系对于原坐标系在x,y两个坐标轴上的放缩率,可分别表示为λx和λy,则Helmert变换方程组可以修改为
 
X = (λx)X・cosθ - (λy)Y・sinθ + x0
Y = (λx)X・sinθ + (λy)Y・cosθ + y0
 
同样按照前述方法写成三阶矩阵为
 
| x |                | (λx)cosθ   (λx)sinθ   0|
| y | = | X 1 | *  | (λy)-sinθ  (λy)cosθ   0|
| 1 |                |  x0          y0       1|
 
这个矩阵就是affine变换矩阵,仿射矩阵。
----------------------------------------------------------------------------------------------------

OpenVG中可以使用投影变换(本例中为仿射变换)来实现图像的变形效果,进而可以用于纹理映射。
为简单起见只考虑三角形到三角形的映射。
变换矩阵T为:
|sx  shx  tx|
|shy  sy  ty|
|0    0   1 |
其中sx,sy表示伸缩,shx,shy表示变形,tx,ty表示位移。
设纹理图像中的坐标为(u,v),目标区域中的坐标表示为(x,y),则纹理映射即是从纹理图像到目标区域坐标的转换:
(x y 1)'=T*(u v 1)'        (1)
其中
u=(tx1 tx2 1),v=(ty1 ty2 1)表示纹理图像的三个顶点坐标
x=(x1 x2 1), y=(y1 y2 1)表示目标区域的三个顶点坐标
我们需要把变换矩阵T求出来。为简洁起见,(1)式简写为
B=T*A
则 T=B*inv(A)
而inv(A)=A*/|A|
其中inv(A)表示A的逆矩阵
A*表示A的伴随矩阵
|A|表示A的行列式

//求变换矩阵T的代码
void vg_GetTexTransMatrix(short x1, short y1, short x2, short y2, short x3, short y3,
                          short tx1, short ty1, short tx2, short ty2, short tx3, short ty3)

{

       //求行列式|A|
       int detA;
       detA = tx1*ty2 + tx2*ty3 + tx3*ty1 - tx3*ty2 - tx1*ty3 - tx2*ty1;      

       // 求伴随矩阵A*
       int A11,A12,A13,A21,A22,A23,A31,A32,A33;
       A11 = ty2 - ty3;
       A21 = -(ty1 - ty3);
       A31 = ty1 - ty2;
       A12 = -(tx2 - tx3);
       A22 = tx1 - tx3;
       A32 = -(tx1 - tx2);
       A13 = tx2*ty3 - tx3*ty2;
       A23 = -(tx1*ty3 - tx3*ty1);
       A33 = tx1*ty2 - tx2*ty1;      

     //求变换矩阵T
       float texMatrix[9]={0};
       texMatrix[0] = (x1*A11 + x2*A21 + x3*A31)/detA;//t11
       texMatrix[1] = (y1*A11 + y2*A21 + y3*A31)/detA;//t21
       texMatrix[2] = (   A11 +    A21 +    A31)/detA;//t31
       texMatrix[3] = (x1*A12 + x2*A22 + x3*A32)/detA;//t12
       texMatrix[4] = (y1*A12 + y2*A22 + y3*A32)/detA;//t22
       texMatrix[5] = (   A12 +    A22 +    A32)/detA;//t32
       texMatrix[6] = (x1*A13 + x2*A23 + x3*A33)/detA;//t13
       texMatrix[7] = (y1*A13 + y2*A23 + y3*A33)/detA;//t23
       texMatrix[8] = (   A13 +    A23 +    A33)/detA;//t33
}

PS:仿射变换与投影变换都会将直线映射为直线,但仿射变换把直线上等距分布的点映射为等距分布的点,投影变换则不一定(Both affine and projective transformations map straight lines to straight lines. However, affine transformations map evenly spaced points along a source line to evenly   spaced points   in   the   destination, whereas...)。当为仿射变换时,数学上表现为变换矩阵中的齐次项[w0,w1,w2]等于[0 0 1].

 

--------------------------------------------------------------------------------------------------------

在计算机视觉的背景下,2d affine是2D homography的子集。

从几何意义上讲,2D homography是用来计算一堆在同一个三维平面上的点在不同的二
维图像中的投影位置的,是一个一对一的映射。2D affine是2D homography的一个特例
,它对应着的情况是这个三维平面在无穷远。

从代数特性上讲,2D homography是一个rank=3或者说可逆的矩阵,一般可以表示为:
H11 H12 H13
H21 H22 H23
H31 H32 1
Affine是它的简化形式,不但可逆而且第三行没有未知数:
A11 A12 A13
A21 A22 A23
  0   1

计算homography(线性解)需要4对不共线的点,计算affine只需要3对不共线的点。一般
要用RANSAC这个方法来得到精确、鲁棒的结果。affine一般比homography更稳定一些,
所以可以先计算affine,然后再用affine作为homography的初始值,进行非线性优化(
比如Levenberg Marquardt)。

几何视觉方向最经典的教科书还是Multiple View Geometry in Computer Vision,讲
得很详细、很透彻。实在是求学教课居家旅行必备啊。

当然affine在数学中有更广泛、更准确的定义了,可以看看wiki上的说法(在教科书里
也说到了):http://en.wikipedia.org/wiki/Affine_transformation
楼上各位解释的没错啊,homography是共线不变, affine是不但保证共线,而且保证距离的比不变。

你说的object的变换不太对。homography可以用来计算一幅图像中的不同平面的变换,
也可以是不同图像中的同一个平面的变换。affine是它的特殊情况。

【 在 pintern (pintern) 的大作中提到: 】
: 是不是Affine是homography的子集呢?貌似Affine是一副图像里的Object变换,而
Homo
: grphy是两幅图像(或帧)之间的Object的变换。但不太确定它们之间究竟是什么关
系?
: 有谁能解释解释?


http://blog.sina.com.cn/s/blog_6cf7b91b0100prps.html

0 0
原创粉丝点击