分享

仿射相关理论

 WXGWJS 2016-12-16

1. 仿射变换的应用

1
2
3
1. 在用PS时,大家一定用过旋转、水平剪切和垂直剪切的操作。
2. spm在fmri图像数据预处理时,normalize归一化这一步时,需要将带配准图像与来自standard space的模板图像进行配准,配准除了涉及旋转、平移这些刚体变换之外,还包括放缩、错切。这就构成了a full affine transformation全仿射变换。
3. 做计算机图形学的朋友都知道,尽管描述一个三维对象只需要三维向量,但所有的计算机图形学变换矩阵都是4 x 4的。说其原因,很多书上都写着“为了使用中方便”,这在我看来简直就是企图蒙混过关。真正的原因,是因为在计算机图形学里应用的图形变换,实际上是在仿射空间而不是向量空间中进行的。

2. 仿射变换的定义  

  仿射变换是二维平面中一种重要的变换,在图像图形领域有广泛的应用。许多人对“仿射”没有一个感官的认识,我觉得很有必要先来说一下“仿射”。

所谓的“仿射变换”就是一种简单的变换,它的变化包括旋转、平移、伸缩,原来的直线仿射变换后还是直线,原来的平行线经过仿射变换之后还是平行线,这就是仿射。保持二维图形的“平直线”和“平行性”,其可以通过一系列的原子变换的复合来实现,包括

1
2
3
4
5
平移(Translation)
缩放(Scale)
翻转(Flip)
旋转(Rotation)
剪切(Shear)

仿射变换的矩阵的平移(Translation)+旋转(Rotation)操作是其次坐标形式的变换矩阵

这个矩阵包含的变换有旋转和平移,其实是两个矩阵的混合体,许多文章都对这个做了很详细的描述。仿射变换的数学公式里,是如何做到坐标点位置的平移呢?清楚这个才是弄明白仿射变换的关键。

利用此图可以完成仿射变换公式的推导,推导如下:

2.1 旋转操作的矩阵实现

一个点P在原始坐标系下的坐标是(Xsp,Ysp)。然后要完成旋转操作,旋转操作是基于原点的,如何得到旋转之后的点的坐标,这里用到一个技巧,坐标系中某个点的旋转可以等价地去旋转坐标轴,所以有了上图中以(Xs0,Ys0)为中心的虚线与屏幕水平垂直的坐标系。在这个坐标系中确定P的坐标,和在蓝色坐标系中确定旋转之后P的坐标是等价的。基于这个结论,我们可以通过简单的立体几何知识确定P在新坐标系中的坐标。P在新坐标系中的X坐标和Y坐标分别是

经典的仿射变换的模型呼之欲出了。整理上面两个式子得:

这就是仿射变换模型中旋转部分的原理,还有一步,就是平移。

2.2 平移的实现

旋转变换之后,我们确定了P点在新坐标系中的位置,然后在这个位置的基础上加上其在X轴和Y轴的偏移即可

仿射变换的矩阵横空出世。当然上图中对这个变换的处理更巧妙,它还是利用了不移动点移动坐标系的策略,将坐标系向相反方向移动了相应的距离。于是有了上图这个经典仿射变换模型的图示展现。

上图中我们可以看到,整个在对P点进行仿射变换的过程中,P点的位置并没有移动,我们是通过不断的坐标系的调整来间接达到P点移动的效果,这充分说明了一件事:

1
运动都是相对的。

 

3. 几种典型的仿射变换API

3.1.public static AffineTransform getTranslateInstance(double tx, double ty)

平移变换,将每一点移动到(x+tx, y+ty),变换矩阵为:

(译注:平移变换是一种“刚体变换”,rigid-body transformation,中学学过的物理,都知道啥叫“刚体”吧,就是不会产生形变的理想物体,平移当然不会改变二维图形的形状。同理,下面的“旋转变换”也是刚体变换,而“缩放”、“错切”都是会改变图形形状的。) 

3.2.public static AffineTransform getScaleInstance(double sx, double sy)

缩放变换,将每一点的横坐标放大(缩小)至sx倍,纵坐标放大(缩小)至sy倍,变换矩阵为:

3.3.public static AffineTransform getShearInstance(double shx, double shy)

剪切变换,变换矩阵为:

相当于一个横向剪切与一个纵向剪切的复合

(译注:“剪切变换”又称“错切变换”,指的是类似于四边形不稳定性那种性质,街边小商店那种铁拉门都见过吧?想象一下上面铁条构成的菱形拉动的过程,那就是“错切”的过程。) 

3.4.public static AffineTransform getRotateInstance(double theta)

旋转变换,目标图形围绕原点顺时针旋转theta弧度,变换矩阵为:

3.5.public static AffineTransform getRotateInstance(double theta, double x, double y)

旋转变换,目标图形以(x, y)为轴心顺时针旋转theta弧度,变换矩阵为:

[   cos(theta)    -sin(theta)    x-x*cos+y*sin]

[   sin(theta)     cos(theta)    y-x*sin-y*cos ]

[       0              0          1            ]

相当于两次平移变换与一次原点旋转变换的复合:

[1  0  -x][cos(theta)  -sin(theta)  0][1  0  x]

[0  1  -y][sin(theta)   cos(theta)  0][0  1  y]

[0  0  1 ][   0           0        1 ][0  0  1]

4. 仿射变换效果图    

顺时针旋转30度:


水平剪切:


垂直剪切:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多