zoukankan      html  css  js  c++  java
  • 仿射相关理论

    1. 仿射变换的应用

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

    2. 仿射变换的定义  

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

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

    平移(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点移动的效果,这充分说明了一件事:

     运动都是相对的。
    

    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度:
    空间域图像处理——仿射变换

    水平剪切:
    空间域图像处理——仿射变换

    垂直剪切:
    空间域图像处理——仿射变换

  • 相关阅读:
    Java 设计模式之桥接模式,Java 桥接模式 ,java Bridge Pattern
    Java判断Object对象是否为数组,Java判断Object对象是否为集合,Java判断数组是否包含某个值
    Java Map转二维数组,Map转数组
    Java 设计模式之装饰模式,Java 装饰模式,java装饰模式和代理模式的区别
    Java 设计模式之适配器模式,Java 类适配器,Java 对象适配器
    获取List<Map<String, Object>中Map的属性值列表,获取所有map对象的某个属性列表
    Mybatis 一级缓存,Mybatis 二级缓存,Mybatis 缓存失效
    Java 设计模式之代理模式,Java 静态代理,Java 动态代理
    MongoDB安装和使用,MongoDB Like查询,Or查询,分页查询
    docker 安装 showdoc
  • 原文地址:https://www.cnblogs.com/haore147/p/3618758.html
Copyright © 2011-2022 走看看