【CV & Unity】仿射变换原理

这篇具有很好参考价值的文章主要介绍了【CV & Unity】仿射变换原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是仿射变换?

仿射变换(Affine Transformation)是空间直角坐标系的变换,从一个二维坐标变换到另一个二维坐标,仿射变换是一个线性变换,他保持了图像的“平行性”和“平直性”,即图像中原来的直线和平行线,变换后仍然保持原来的直线和平行线,仿射变换比较常用的特殊变换有平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)。

线性变换和仿射变换的差别

线性变换 仿射变换
变换前是直线的,变换后依然是直线直线比例保持不变变换前是原点的,变换后依然是原点 变换前是直线的,变换后依然是直线直线比例保持不变

线性变换和仿射变换的差别在原点是否改变

空间变换的两个主要类别

仿射变换

【CV & Unity】仿射变换原理

仿射变换:平移、旋转、放缩、剪切、反射

仿射变换的公式表达

( X 2 Y 2 1 ) = [ A 11 A 12 B 11 A 21 A 22 B 12 0 0 1 ] × ( X 1 Y 1 1 ) \left(\begin{array}{c} X_{2} \\ Y_{2} \\ 1 \end{array}\right)=\left[\begin{array}{ccc} A_{11} & A_{12} & B_{11} \\ A_{21} & A_{22} & B_{12} \\ 0 & 0 & 1 \end{array}\right] \times\left(\begin{array}{c} X_{1} \\ Y_{1} \\ 1 \end{array}\right) X2Y21 = A11A210A12A220B11B121 × X1Y11

通过上述的矩阵转换可以将图像进行平移、缩放、旋转和剪切,如下图所示

【CV & Unity】仿射变换原理

仿射变换在ML机器学习领域的应用

仿射变换的思想在机器学习“图像处理”领域对应单应性矩阵

在三轴坐标中 X Y Z , Z = 1 XYZ,Z=1 XYZZ=1这个有点类似于三维的齐次坐标。单应性矩阵主要用来解决两个问题,

  1. 表述真实世界(Unity中的主世界相机视角)中一个平面与对应它图像的透视变换
  2. 从通过透视变换实现图像从一种视图变换到另外一种视图
    【CV & Unity】仿射变换原理

上图的中零点分别表示两个平面中任意两个点,a1、a2与b1、b2是这两点对应的两个方向上的线性向量。对于这两个平面之间的关系,我们可以通过这些点从而一步确定两个平面直接的关系,而两个平面之间的关系用单应性矩阵来描述如下:
p h → = H q ⃗ h ⃗ \overrightarrow{p^{h}}=H \vec{q}^{\vec{h}} ph =Hq h
其中, − p h → , q ⃗ h ⃗ - \overrightarrow{p^{h}},\vec{q}^{\vec{h}} ph q h 表示三维的齐次坐标向量
这种关系被称为平面单应性。这个当中有一些数学知识推导,这里不做证明,只是明白这个概念怎么来的。

  • 此外两个计算机图形学的应用场景分布是纹理渲染与计算平面阴影。
  • 用来实现图像拼接时候解决对齐问题

投影变换

( x 1 t x 2 t x 3 t ) = [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] ( x 1 x 2 x 3 ) \left(\begin{array}{l} x_{1}^{t} \\ x_{2}^{t} \\ x_{3}^{t} \end{array}\right)=\left[\begin{array}{lll} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{array}\right]\left(\begin{array}{l} x_{1} \\ x_{2} \\ x_{3} \end{array}\right) x1tx2tx3t = h11h21h31h12h22h32h13h23h33 x1x2x3
投影和仿射变换之间的区别

投影变换 仿射变换
变换前是直线的,变换后依然是直线直线比例改变变换前平行的两条线,变换后不一定平行 变换前是直线的,变换后依然是直线直线比例改变变换前平行的两条线,变换后不一定平行

这些仿射变换和投影变换之间的唯一区别在于变换矩阵的最后一行。对于仿射变换,该行的前两个元素为零。这导致操作属性存在以下差异:

  • 投影变换不保留平行度、长度和角度。

  • 仿射变换与投影变换不同,保留了并行性。

射影变换可以表示为任意四边形(即四点系统)到另一个四边形的变换。仿射变换是三角形的变换。下图说明了这一点:

【CV & Unity】仿射变换原理

直观的例子:

仿射变换:

【CV & Unity】仿射变换原理

【CV & Unity】仿射变换原理

仿射变换C#代码实现

在Graphics Mill中应用仿射变换,请执行以下步骤:

  1. 指定源和目标三角形。

  2. 使用Matrix.CreateFromAffinePoints(PointF[], PointF[])创建仿射变换矩阵。将先前指定的点作为方法参数传递。

  3. 使用MatrixTransform.#ctor构造函数创建转换。这里之前创建的矩阵是构造函数的参数。

  4. 通过调用MatrixTransform.Apply方法应用转换。

   using (var bitmap = new Bitmap(@"Images\in.jpg"))
  {
    System.Drawing.PointF[] source = {
        new System.Drawing.PointF(0f, 0f),
        new System.Drawing.PointF(0f, 80f),
        new System.Drawing.PointF(80f, 0f)
    };
    


    System.Drawing.PointF[] target = {
        new System.Drawing.PointF(20, 0f),
        new System.Drawing.PointF(0f, 80f),
        new System.Drawing.PointF(80f, 0f)
    };

    using (var matrix = Matrix.CreateFromAffinePoints(source, target))
    {
        using (var transform = new MatrixTransform(matrix))
        {
            using (var result = transform.Apply(bitmap))
            {
                result.Save(@"Images\Output\out.jpg");
            }
        }
    }
}


投影变换:

【CV & Unity】仿射变换原理
【CV & Unity】仿射变换原理

投影变换C#代码实现

在Graphics Mill中应用投影变换,请执行以下步骤:

  1. 指定源四边形和目标四边形。
  2. 使用Matrix.CreateFromProjectivePoints(PointF[], PointF[])创建投影变换矩阵。将先前指定的点作为方法参数传递。
  3. 使用MatrixTransform.#ctor构造函数创建转换。这里之前创建的矩阵是构造函数的参数。
  4. 通过调用MatrixTransform.Apply方法应用转换。
 
using (var bitmap = new Bitmap(@"Images\in.jpg"))
{
    System.Drawing.PointF[] source = {
        new System.Drawing.PointF(0f, 0f),
        new System.Drawing.PointF(0f, bitmap.Height),
        new System.Drawing.PointF(bitmap.Width, bitmap.Height),
        new System.Drawing.PointF(bitmap.Width, 0f)
    };

    System.Drawing.PointF[] target = {
        new System.Drawing.PointF(0f, 0f),
        new System.Drawing.PointF(0f, bitmap.Height),
        new System.Drawing.PointF(bitmap.Width * 0.75f, bitmap.Height - 50f),
        new System.Drawing.PointF(bitmap.Width * 0.75f, 80f)
    };

    using (var matrix = Matrix.CreateFromProjectivePoints(source, target))
    {
        using (var transform = new MatrixTransform(matrix))
        {
            using (var result = transform.Apply(bitmap))
            {
                result.Save(@"Images\Output\out.jpg");
            }
        }
    }
}


仿射变换在机器学习中的应用

在用CNN模型处理MINST手写数据集的识别中,引入了仿射变换的方法提升了识别准确性
论文:https://arxiv.org/abs/1506.02025

【CV & Unity】仿射变换原理

参考资料:

仿射和投影变换 - Graphics Mill
Review: STN — Spatial Transformer Network (Image Classification)
如何通俗地讲解「仿射变换」这个概念? - 马同学的回答 - 知乎文章来源地址https://www.toymoban.com/news/detail-465089.html

到了这里,关于【CV & Unity】仿射变换原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能

    仿射变换是一种二维变换,它可以将一个二维图形映射到另一个二维图形上,保持了图形的“形状”和“大小”不变,但可能会改变图形的方向和位置。仿射变换可以用一个线性变换矩阵来表示,该矩阵包含了六个参数,可以进行平移、缩放、旋转等操作。通过原理、函数和

    2024年02月05日
    浏览(63)
  • 【opencv】几何变换——仿射变换(4 计算仿射矩阵getAffineTransform(src, ds)

    对于空间变换的仿射矩阵有两种计算方式: 仿射变换矩阵有六个未知数,需要三组对应位置坐标,构造出由六个方程组成的方程组即可解六个未知数; 函数getAffineTransform();通过方程法计算参数src到dst的对应仿射变换矩阵; 头文件:#includeopencv2/imgproc.hpp 函数getAffineTransform()输

    2024年02月12日
    浏览(46)
  • 仿射变换和变换矩阵

    一、2D图像的仿射变换 仿射变换 包括 平移、旋转、错切、放缩(各向同性和各向异性) 欧式变换(刚体变换)包括 平移和旋转 相似变换包括平移、旋转、放缩(各向同性) 相似变换矩阵 有4个自由度 s,θ,tx,ty: 仿射变换矩阵 有6个自由度: 所有变换矩阵只需关注一点: 坐

    2024年02月14日
    浏览(42)
  • opencv实现仿射变换和透射变换

    OpenCV中的仿射变换和透视变换是常用的图像几何变换方法,可以用于实现图像的旋转、缩放、平移、扭曲等操作。这两种变换方式在计算机视觉、图像处理以及计算机图形学等领域广泛应用。 仿射变换 仿射变换是一种保持直线平行性质的线性变换,它可以对图像进行平移、

    2024年02月07日
    浏览(46)
  • Halcon区域几何变换和仿射变换

    算子参数: move_region(Region : RegionMoved : Row, Column : ) 1.Region(输入要移动的区域) 2.RegionMoved(输出移动后区域) 3.Row(输入要移动区域的向量的行距离 point.y ) 4.Column(输入要移动区域的向量的列距离 point.x) 实例: 效果图:

    2023年04月08日
    浏览(58)
  • 仿射变换中的旋转缩放变换矩阵推导

    仿射变换可以将矩阵形状转换为平行四边形。可以挤压形状,但是必须保持两边平行。常见的是旋转、缩放、平移变换。缩放和平移比较简单,本文重点推导旋转缩放变换矩阵。 任意一点 ( x 0 , y 0 ) (x_0,y_0) ( x 0 ​ , y 0 ​ ) 可以看成 ( x 0 , 0 ) (x_0, 0) ( x 0 ​ , 0 ) 向量和 ( 0 ,

    2024年04月24日
    浏览(88)
  • 【OpenCV • c++】图像几何变换 | 图像仿射变换

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月16日
    浏览(52)
  • opencv仿射变换

    #include opencv2/opencv.hpp /* 功能:对一系列坐标点进行平移仿射变换 参数: srcPoints:输入点坐标 dstPoints:变换后的点坐标 x:x方向平移的距离 y:y方向平移的距离 */ void tranlatePoints(std::vectorcv::Point2f srcPoints, std::vectorcv::Point2f dstPoints,double x,double y) {     cv::Mat affineMatrix = (cv::Mat_double

    2024年01月16日
    浏览(41)
  • 图像尺寸、仿射、透视变换

      1.2.1 图像缩放  1.2.2 图像翻转 1.2.3 图像拼接    4个像素坐标,图有误  3.4 透视变换函数  

    2024年02月12日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包