0
点赞
收藏
分享

微信扫一扫

OpenCV学习(60)

图像变换(14):仿射变换

一,认识仿射变换;

二,仿射变换的求法;

三,进行仿射变换:warpAffine()函数;

四,计算二维旋转变换矩阵:getRotationMatrix2D()函数;

一,认识仿射变换

       仿射变换(Affine Transformation或 Affine Map),又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间的过程。它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。
        一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式。
        那么,我们能够用仿射变换来表示如下三种常见的变换形式:

       ·旋转,rotation(线性变换)
       ·平移,translation(向量加)

       ·缩放,scale(线性变换)
       进行更深层次的理解,仿射变换代表的是两幅图之间的一种映射关系。

        而我们通常使用2x3的矩阵来表示仿射变换。


 

二,仿射变换的求法

    我们知道,仿射变换表示的就是两幅图片之间的一种联系,关于这种联系的信息大致可从以下两种场景获得。
   ·已知X和T,而且已知它们是有联系的。接下来的工作就是求出矩阵M。

   ·已知M和X,想求得T。只要应用算式T=M·X即可。对于这种联系的信息可以用矩阵M清晰地表达(即给出明确的2×3矩阵),也可以用两幅图片点之间几何关系来表达。
    形象地说明一下,因为矩阵M联系着两幅图片,就以其表示两图中各三点直接的联系为例。如图7.37所示。

       图中,点1、2和3(在 Imagel中形成一个三角形)与Image2中的三个点是一一映射的关系,且它们仍然形成三角形,但形状已经和之前不一样了。我们能通过这样两组三点求出仿射变换(可以选择自己喜欢的点),接着就可以把仿射变换应用到图像中去。
       OpenCV仿射变换相关的函数一般涉及到 warpAffine和 getRotationMatrix2D这两个函数:

     ·使用OpenCV函数 warpAffine 来实现一些简单的重映射。

     ·使用OpenCV函数getRotationMatrix2D来获得旋转矩阵。下面分别对其进行讲解。

三,进行仿射变换:warpAffine()函数

warpAffine函数的作用是依据以下公式子,对图像做仿射变换。


 

     ·第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。
     ·第二个参数,OutputArray类型的 dst,函数调用后的运算结果存在这里,需和源图片有一样的尺寸和类型。
     ·第三个参数,InputArray类型的M,2×3的变换矩阵。

     ·第四个参数,Size类型的dsize,表示输出图像的尺寸。
     ·第五个参数,int类型的 flags,插值方法的标识符。此参数有默认值INTER LINEAR(线性插值),可选的插值方式如表7.1所示。

      ·第六个参数,int类型的 borderMode,边界像素模式,默认值为BORDER_CONSTANT。
      ·第七个参数,const Scalar&类型的 borderValue,在恒定的边界情况下取的值,默认值为Scalar(),即0。
另外提一点,WarpAffine函数与一个叫做cvGetQuadrangleSubPix()的函数类似,但是不完全相同。WarpAffine要求输入和输出图像具有同样的数据类型,有更大的资源开销(因此对小图像不太合适)而且输出图像的部分可以保留不变。而cvGetQuadrangleSubPix可以精确地从8位图像中提取四边形到浮点数缓存区中,具有比较小的系统开销,而且总是全部改变输出图像的内容。
 

四,计算二维旋转变换矩阵:getRotationMatrix2D()函数

getRotationMatrix2D()函数用于计算二维旋转变换矩阵。变换会将旋转中心映射到它自身。

     ·第一个参数,Point2f类型的center,表示源图像的旋转中心。
     ·第二个参数,double类型的 angle,旋转角度。角度为正值表示向逆时针旋转(坐标原点是左上角)。
     ·第三个参数,double类型的scale,缩放系数。此函数计算以下矩阵:

 

举报

相关推荐

0 条评论