仿射变换 Affine Transformation

仿射变换:由一个平面/立体图形变换到另一个平面/立体图形的一种变换。在改变的过程中,保持直线和平行线不变(平行线映射为平行线),任何放射变换都可以分解为缩放旋转平移切变的组合。

仿射变换矩阵:

$$

\begin{bmatrix}

x' \

y' \

1

\end{bmatrix} =

\begin{bmatrix}

a & b & c \

d & e & f \

0 & 0 & 1

\end{bmatrix}

\begin{bmatrix}

x \

y \

1

\end{bmatrix}

$$

  • 指定变换矩阵的参数(a,b,c,d,e,f)
  • 使用一个简单的输入点(x,y) = (2,3)在齐次坐标中表示为(2,3,1)
  • 计算得到输出点(x',y') = (a*2+b*3+c,d*2+e*3+f)

1.平移(Translation)

标准定义:平移由平移向量(Tx,Ty)定义,矩阵为:

$$

\begin{bmatrix}

1 & 0 & Tx \

0 & 1 & Ty \

0 & 0 & 1

\end{bmatrix}

$$

  • 示例:取平移向量(Tx,Ty) = (4,5)
  • 变换矩阵:

    $$

    \begin{bmatrix}

    1 & 0 & 4 \

    0 & 1 & 5 \

    0 & 0 & 1

    \end{bmatrix}

    $$
  • 计算过程:

    $$

    \begin{bmatrix}

    1 & 0 & 4 \

    0 & 1 & 5 \

    0 & 0 & 1

    \end{bmatrix}

    \begin{bmatrix}

    2 \

    3 \

    1

    \end

    \begin{bmatrix}

    6 \

    8 \

    1

    \end{bmatrix}

    $$

  • 结果:点(2,3)变换到点(6,8)
  • 解释:点沿 x 轴移动 4 单位,沿 y 轴移动 5 单位。

Halcons算子:hom_mat2d_translate在现有变换矩阵基础上添加平移分量。

  • 参数:
  • HomMat2D:输入变换矩阵(若从零开始,需先初始化单位矩阵)
  • Tx, Ty:X/Y方向的平移量
  • HomMat2DTranslate:输出变换矩阵
* 初始化单位矩阵
hom_mat2d_identity(HomMat2DIdentity)
* 添加平移 (Tx=100, Ty=50)
hom_mat2d_translate(HomMat2DIdentity, 100, 50, HomMat2DTranslate)

2.缩放(Scaling)

标准定义:缩放由缩放因子Sx(x方向)Sy(y方向)定义,矩阵为:

$$

\begin{bmatrix}

Sx & 0 & 0 \

0 & Sy & 0 \

0 & 0 & 1

\end{bmatrix}

$$

  • 示例:取缩放因子Sx=2Sy=3

  • 变换矩阵:

    $$

    \begin{bmatrix}

    2 & 0 & 0 \

    0 & 3 & 0 \

    0 & 0 & 1

    \end{bmatrix}

    $$

  • 计算过程:

    $$

    \begin{bmatrix}

    2 & 0 & 0 \

    0 & 3 & 0 \

    0 & 0 & 1

    \end{bmatrix}

    \begin{bmatrix}

    2 \

    3 \

    1

    \end

    \begin{bmatrix}

    4 \

    9 \

    1

    \end{bmatrix}

    $$

    • 结果:点(2,3)变换到点(4,9)
    • 解释:点沿 x 轴缩放 2 倍,沿 y 轴缩放 3 倍。

Halcons算子:hom_mat2d_scale以指定中心点缩放。

  • 参数:
  • HomMat2D:输入变换矩阵(若从零开始,需先初始化单位矩阵)
  • Sx, Sy:X/Y方向的缩放因子
  • Px, Py:缩放中心坐标(图像坐标系)
  • HomMat2DScale:输出变换矩阵
* 初始化单位矩阵
hom_mat2d_identity(HomMat2DIdentity)
* 以点 (Px=300, Py=300) 为中心,X方向放大2倍,Y方向缩小0.5倍
hom_mat2d_scale(HomMat2DIdentity, 2, 0.5, 300, 300, HomMat2DScale)

3.旋转(Rotation)

标准定义:旋转由旋转角度θ(逆时针为正)定义,矩阵为:

$$

\begin{bmatrix}

\cos(\theta) & -\sin(\theta) & 0 \

\sin(\theta) & \cos(\theta) & 0 \

0 & 0 & 1

\end{bmatrix}

$$

  • 示例:取旋转角度θ=90°(π/2弧度),则sin 90° = 1, cos 90° = 0

  • 变换矩阵:

    $$

    \begin{bmatrix}

    0 & -1 & 0 \

    1 & 0 & 0 \

    0 & 0 & 1

    \end{bmatrix}

    $$

  • 计算过程:

    $$

    \begin{bmatrix}

    0 & -1 & 0 \

    1 & 0 & 0 \

    0 & 0 & 1

    \end{bmatrix}

    \begin{bmatrix}

    2 \

    3 \

    1

    \end

    \begin{bmatrix}

    -3 \

    2 \

    1

    \end{bmatrix}

    $$

  • 结果:点(2,3)变换到点(-3,2)

  • 解释:点沿 x 轴旋转 90°,即逆时针旋转 90°。

Halcons算子:hom_mat2d_rotate绕指定中心点旋转。

  • 参数:
  • HomMat2D:输入变换矩阵(若从零开始,需先初始化单位矩阵)
  • Angle: 旋转角度(弧度制)
  • Px, Py:旋转中心坐标(图像坐标系)
  • HomMat2DRotate:输出变换矩阵
* 初始化单位矩阵
hom_mat2d_identity(HomMat2DIdentity)
* 绕点 (Px=200, Py=200) 旋转 30°(弧度 ≈0.5236)
AngleRad := 30 * 3.1415926 / 180
hom_mat2d_rotate(HomMat2DIdentity, AngleRad, 200, 200, HomMat2DRotate)

4.错切(Shearing)

标准定义:错切由错切系数Sx(x方向)Sy(y方向)定义,矩阵为:

$$

\begin{bmatrix}

1 & Sx & 0 \

Sy & 1 & 0 \

0 & 0 & 1

\end{bmatrix}

$$

  • 示例:取错切系数Sx=0.5Sy=0.2

  • 变换矩阵:

    $$

    \begin{bmatrix}

    1 & 0.5 & 0 \

    0.2 & 1 & 0 \

    0 & 0 & 1

    \end{bmatrix}

    $$

  • 计算过程:

    $$

    \begin{bmatrix}

    1 & 0.5 & 0 \

    0.2 & 1 & 0 \

    0 & 0 & 1

    \end{bmatrix}

    \begin{bmatrix}

    2 \

    3 \

    1

    \end

    \begin{bmatrix}

    1.5 \

    2.6 \

    1

    \end{bmatrix}

    $$

    • 结果:点(2,3)变换到点(1.5,2.6)
    • 解释:点沿 x 轴错切 0.5 单位,沿 y 轴错切 0.2 单位。
  • 注意:错切矩阵的逆矩阵是:

    $$

    \begin{bmatrix}

    1 & -0.5 & 0 \

    -0.2 & 1 & 0 \

    0 & 0 & 1

    \end{bmatrix}

    $$

5.复合变换(Composition)

多个仿射变换可以组合成一个复合变换,矩阵的乘积表示。

  • 示例:先平移再缩放再旋转,平移向量(Tx,Ty)=(4,5),缩放因子Sx=2Sy=3,旋转角度θ=90°(π/2弧度)

  • 变换矩阵:

    $$

    \begin{bmatrix}

    2 & 0 & 0 \

    0 & 3 & 0 \

    0 & 0 & 1

    \end{bmatrix}

    \begin{bmatrix}

    1 & 0 & 4 \

    0 & 1 & 5 \

    0 & 0 & 1

    \end{bmatrix}

    \begin{bmatrix}

    0 & -1 & 0 \

    1 & 0 & 0 \

    0 & 0 & 1

    \end{bmatrix}

    $$

  • 合并后的复合变换矩阵:

    $$

    \begin{bmatrix}

    0 & -2 & 8 \

    3 & 0 & 15 \

    0 & 0 & 1

    \end{bmatrix}

    $$

  • 计算过程:

    $$

    \begin{bmatrix}

    0 & -2 & 8 \

    3 & 0 & 15 \

    0 & 0 & 1

    \end{bmatrix}

    \begin{bmatrix}

    2 \

    3 \

    1

    \end

    \begin{bmatrix}

    -1 \

    6 \

    1

    \end{bmatrix}

    $$

    • 结果:点(2,3)变换到点(-1,6)

Halcon 仿射变换基础的更多相关文章

  1. 《HALCON数字图像处理》第三章笔记

    目录 第三章 HALCON图像处理基础 HALCON控制语句 HALCON算子 HALCON图像处理入门 HALCON图像读取 HALCON图像显示 图形窗口 图像显示 显示文字 HALCON图像转换 ...

  2. Halcon二维仿射变换实例探究

    二维仿射变换,顾名思义就是在二维平面内,对对象进行平移.旋转.缩放等变换的行为(当然还有其他的变换,这里仅论述这三种最常见的). Halcon中进行仿射变换的常见步骤如下: ① 通过hom_mat2d ...

  3. halcon几何变换(仿射变换)

    旋转.平移.镜像.缩放.斜切,可参考https://blog.csdn.net/machaoyu86/article/details/51182473 仿射变换前,需要获得仿射变换矩阵. 关于shap ...

  4. halcon基础应用和方法经验分享

    halcon基础应用和方法经验分享 一.Halcon软件 的安装 安装一直点下一步就好了,这个过程很简单,就不讲了 二.Halcon软件license安装 Halcon是商业视觉软件,是需要收费的,但 ...

  5. halcon基础数据类型

    halcon基础数据类型 使用变量不需定义 等号       := 不等号    # 字符串赋值  str:='sdff' 等于比较符         if(q=0) 与       if(a< ...

  6. HALCON基础知识

    HALCON 1. 语法范式 Syntax Style 1.1. 基本格式 1.1.1. 算子格式 算子(输入图像参数:输出图像参数:输入控制参数:输出控制参数) 其中四个参数任意一个可以为空 e.g ...

  7. Halcon 学习笔记3 仿射变换

    像素的减少 开运算(较少) 腐蚀(去除更多) 对灰度图像的开运算或腐蚀 相当于将灰度图像变暗 像素增加 闭运算(较少) 膨胀(较多) 对灰度图像的闭运算或膨胀 相当于将灰度图像变亮 仿射变换 另外一种 ...

  8. halcon基础数据类型详解

    #if defined(__CHAR_UNSIGNED__) || defined(__sgi) #define INT1 signed char /* integer, signed 1 Byte ...

  9. halcon基础算子介绍(窗口创建,算子运行时长,是否启用更新函数)

    前言 halcon有有大约1500个算子,我总结一些简单大家用得到的算子,比如创建窗口的方式有3种,接下来结束这方式,及其异同点等! 1.窗口创建的三种方式 1.1使用dev_open_window算 ...

  10. halcon 基础总结(一)裁切图片并旋转图像

    ​ 第一步当然是读取图像了:read_image (Image, 'C:/Users/HJ/Desktop/test_image/b.jpg') ​ 第二步:二值化.二值化.因为我这里的物体是黑色的, ...

随机推荐

  1. C# datagridView 表格渲染变色 ( 动态改变表格值) 绘制时改变表格值

    private void DGV_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)        {           ...

  2. 4G DTU

    4G DTU是一种可以将RS232/485采集的数据通过3G/4G发送到云端服务器进行数据交互的传输设备.实现串口设备的无线长距离数据传输,进而实现远程数据通信管理,主要应用在远程数据采集和远程控制项 ...

  3. Spring 6

    一.基础 1.什么是反射 在Java中,反射是指在运行时检查和操作类.接口.字段和方法等程序结构的能力. 通过反射,你可以在运行时动态获取类的信息.实例化对象.访问和修改字段.调用方法, 以及构造新的 ...

  4. Java开发笔记(一百五十五)生成随机数的几种途径

    随机数生成是一个常见的业务场景,比如摇号.抽奖等等都需要随机数.Java代码主要有三种随机数的生成方式,包括Math.random.Random.ThreadLocalRandom等,分别说明如下: ...

  5. 前端自定义cli

    Windows PowerShell 版权所有 (C) Microsoft Corporation.保留所有权利. 尝试新的跨平台 PowerShell https://aka.ms/pscore6 ...

  6. Android计算两个日期相差天数

    概述 因为没有现成的函数方法可用,那就通过一个循环来取得相差的天数了 Calendar curcalendar= Calendar.getInstance(); int days = 0; //定义一 ...

  7. POLIR-Society-Organization-Politics-Self- Identity:Qualities + Habits:To-Be List + Behaviors:To-Do List + Prioritize: ProblemsResolving

    POLIR-Society-Organization-Political Habits:To-Be List Behaviors:To-Do List when it comes to habits, ...

  8. OpenList挂载「夸克网盘」

    存储->添加 选择夸克 填写挂载路径 打开并进入自己夸克网盘的网页端 [夸克网盘]夸克网盘PC网页版端入口 进入网盘后按F12进入开发者模式并找到网络模块 Edge.Google等浏览器操作基本 ...

  9. Linux查看端口的命令-九五小庞

    第一种:lsof命令 lsof(list open files)是一个列出当前系统打开文件的工具. lsof -i:端口号 lsof 可查看端口占用情况 示例:查看服务器 8000 端口的占用情况: ...

  10. Win11双击文件夹卡死转圈打不开的问题

    有一部分雨林木风官网的win11专业版用户,在使用电脑鼠标双击文件夹时,出现无法打开,而且箭头也是一直在转圈圈的问题,这是个什么情况呢?本文中,雨林木风小编将为大家分享详细的解决方法,希望可以帮助到有 ...