基础篇02-图像几何变换

本节将简要介绍Halcon中有关图像几何变换的基本算子及其应用,主要涉及五种常见的二维几何变换形式:平移、镜像、旋转、错切和放缩。这几种变换可归结为一类更高级更抽象的空间变换类型,即仿射变换(Affine transformation)。了解图像空间变换的基本知识,对理解后续的图像处理技术,特别是图像配准技术很有帮助。

目录

1. 图像几何变换初步

2. 简单的几何变换

2.1 图像旋转

2.2 图像尺度放缩

2.3 图像平移

2.5 图像镜像

2.6 图像转置

3. 一般的几何变换

3.1 一般步骤

3.2 常见算子

(1) 创建单位变换矩阵:hom_mat2d_identity

(1) 定义平移变换矩阵:hom_mat2d_translate

(2) 定义旋转变换矩阵:hom_mat2d_rotate

(3) 定义放缩变换矩阵:hom_mat2d_scale

(4) 定义斜切变换矩阵:hom_mat2d_slant

3.3 扩展

4. 本节小结


1. 图像几何变换初步

图像的空间几何变换类型多种多样,有许多很好的技术文章介绍相关内容,在此不再赘述。有兴趣的不妨看本人之前整理的两篇博文(用Skimage学习数字图像处理-图像的几何变换(上、下)),便于理解本节介绍的五种类型空间变换的原理和数学定义。

为了理解方便,还是将各种基本几何变换的名称,以及不同类型变换之间的从属关系列出(中文对应的英文名称不再给出,请自行核对)。

  • 透视变换是图中所示各类几何变换的最高层次,仿射变换是一类透视变换。
  • 仿射变换包括相似变换非相似变换
  • 非相似变换包括了尺度变换(各个维度比例系数不相同)、反射变换错切变换
  • 相似变换又细分为欧式变换一致性尺度变换
  • 欧式变换(又称为刚体变换,或等距变换)包括平移变换旋转变换

对于上述提到的各种典型的几何变换,Halcon提供了强大的支持。对于某些功能单一且常用的几何变换,如尺度放缩和旋转等,Halcon直接提供了相应的算子支持。对于更一般的变换,如同时包含多个简单变换的仿射变换,Halcon提供了统一接口的算子来实现。

本节将首先介绍几个常用的单一功能变换对应的算子,然后介绍统一接口几何变换算子。

2. 简单的几何变换

主要介绍三种典型的单一功能几何变换算子的实现,即放缩(Scale)和旋转(Rotate)。

  • 旋转: 使用rotate_image算子直接旋转图像。
  • 缩放: 使用zoom_image_factor算子直接缩放图像。

2.1 图像旋转

在Halcon中,可使用rotate_image算子直接完成图像旋转操作。

该算子的声明如下:

rotate_image(Image, ImageRotate, Angle, 'constant')

参数说明:

  • Image: 输入图像。
  • ImageRotate: 输出图像。
  • Angle: 旋转角度(顺时针为正)。
  • 'constant': 插值方法,默认值为‘constant=0’,即用0值进行填充

下面是一个实例:

read_image(Image, 'example.jpg')
* 将图像顺时针旋转45度
rotate_image(Image, ImageRotate, 45, 'constant')

2.2 图像尺度放缩

在Halcon中,可使用zoom_image_factor算子直接完成图像尺度放缩。

该算子的声明如下:

zoom_image_factor(Image, ImageZoom, ScaleWidth, ScaleHeight, 'constant')

参数说明:

  • Image: 输入图像。
  • ImageZoom: 输出图像。
  • ScaleWidth: 宽度缩放因子。
  • ScaleHeight: 高度缩放因子。
  • 'constant': 插值方法。

下面是一个实例:

read_image(Image, 'example.jpg')
* 将图像在水平和垂直方向上都缩小0.5倍
zoom_image_factor(Image, ImageZoom, 0.5, 0.5, 'constant')

2.3 图像平移

在Halcon中,可使用move_region算子对指定区域进行平移操作。通过该算子,可以将一个区域在图像平面上沿指定的方向和距离移动。以下是 move_region 算子的声明如下:

move_region(Region : RegionMoved : Row, Column : )

参数说明

  • Region:需要进行平移操作的输入区域。
  • RegionMoved:平移后得到的输出区域。
  • Row:沿垂直方向(行方向)的平移距离。正值表示向下平移,负值表示向上平移。
  • Column:沿水平方向(列方向)的平移距离。正值表示向右平移,负值表示向左平移。

使用步骤:

  1. 读取或创建区域:首先需要有一个输入区域(Region),可以通过图像分割、阈值处理等方式获得。
  2. 调用 move_region 算子:指定平移的距离(Row 和 Column)。
  3. 处理平移后的区域:对平移后的区域进行进一步处理或分析。

示例代码:
以下是一个简单的示例,展示如何使用 move_region 算子对区域进行平移:

* 读取图像
read_image(Image, 'example_image.png')

* 对图像进行阈值处理,生成一个区域
threshold(Image, Region, 128, 255)

* 将区域向下平移50个像素,向右平移100个像素
move_region(Region, RegionMoved, 50, 100)

* 显示原始区域和平移后的区域
dev_display(Image)
dev_set_color('red')
dev_display(Region)
dev_set_color('green')
dev_display(RegionMoved)

2.5 图像镜像

在 Halcon 中,mirror_region算子用于对区域进行镜像。镜像操作可以将区域沿指定的镜像轴进行对称翻转。

以下是 mirror_region 算子的声明如下:

mirror_region(Region : RegionMirror : Mode, WidthHeight : )

参数说明

  • Region:需要进行镜像操作的输入区域。
  • RegionMirror:镜像后得到的输出区域。
  • Mode:镜像模式,指定镜像的方向。可选值:'row':沿水平方向(行方向)镜像。'column':沿垂直方向(列方向)镜像。
  • WidthHeight:镜像轴的位置。对于 'row' 模式,表示镜像轴的行坐标;对于 'column' 模式,表示镜像轴的列坐标。

2.6 图像转置

在 Halcon 中,使用transpose_region算子对区域进行转置操作,即将区域的行坐标(Row)和列坐标(Column)互换。这种操作通常用于需要对区域进行坐标交换的场景,例如将区域旋转 90 度或进行坐标系转换。

以下是transpose_region算子的声明如下:

transpose_region(Region : RegionTranspose : : )

参数说明

  • Region:需要进行转置操作的输入区域。
  • RegionTranspose:转置后得到的输出区域。

功能描述:

  • transpose_region 算子将输入区域的行坐标(Row)和列坐标(Column)互换。例如,原始区域中的一个点 (Row, Column) 在转置后会变为 (Column, Row)。
  • 转置操作的效果类似于将区域绕图像原点(左上角)旋转 90 度,然后进行镜像翻转。

注:除了上述6种基本几何变换算子之外,Halcon还提供了极坐标系与笛卡尔坐标系的转换算子(polar_trans_region,polar_trans_region_inv)等等,在此不再介绍。感兴趣的读者可以直接查阅官方技术文献。

3. 一般的几何变换

除了前面介绍的两种简单的几何变换之外,其他类型的几何变换,如平移等吗,需要调用一个通用算子affine_trans_image来完成。

先给出affine_trans_image算子的声明:

affine_trans_image(Image, ImageTrans, HomMat2D, 'constant', 'false')

参数说明:

  • Image: 输入图像。
  • ImageTrans: 输出图像。
  • HomMat2D: 仿射变换矩阵。
  • 'constant': 插值方法,可选'constant'、'nearest_neighbor'等。
  • 'false': 是否保持图像大小,'true'或'false'。

3.1 一般步骤

使用affine_trans_image算子进行变换步骤通常分为三步:

  1. 创建仿射变换矩阵: 使用 hom_mat2d_identity算子初始化一个单位矩阵;
  2. 然后通过 hom_mat2d_translate(平移)、hom_mat2d_rotate(旋转)、hom_mat2d_scale (放缩)、hom_mat2d_slant(斜切)等算子对矩阵进行修改,定义具体的变换操作。
  3. 最后应用仿射变换: 使用 affine_trans_image 算子将变换矩阵应用到图像上。

其中,第二步是核心步骤,也可以显性的直接给变换矩阵进行赋值。

下面给出一个使用affine_trans_image算子进行变换的实例,

* 读取图像
read_image(Image, 'example_image.jpg')

* 初始化单位矩阵
hom_mat2d_identity(HomMat2D)

* 定义旋转角度(以弧度为单位)
Angle := rad(45)  * 旋转45度

* 定义缩放因子
Scale := 0.5  * 缩小到原来的一半

* 定义旋转中心
Row := height(Image) / 2
Column := width(Image) / 2

* 创建旋转和缩放的仿射变换矩阵
hom_mat2d_rotate(HomMat2D, Angle, Row, Column, HomMat2DRotate)
hom_mat2d_scale(HomMat2DRotate, Scale, Scale, Row, Column, HomMat2DScale)

* 应用仿射变换
affine_trans_image(Image, TransImage, HomMat2DScale, 'bilinear')

* 显示原始图像和变换后的图像
dev_display(Image)
dev_display(TransImage)

3.2 常见算子

平移、旋转、放缩和斜切是构成仿射变换的四种基本变换。他们对应的仿射变换矩阵构建算子在下面列出:

  • hom_mat2d_translate(平移)
  • hom_mat2d_rotate(旋转)
  • hom_mat2d_scale(缩放)
  • hom_mat2d_slant(斜切)

​下面列出各个算子的声明。

(1) 创建单位变换矩阵:hom_mat2d_identity

hom_mat2d_identity (HomMat2DIdentity)
解释:定义一个对角为 1 的 单位矩阵,它和任何矩阵相乘等于原矩阵本身。

(1) 定义平移变换矩阵:hom_mat2d_translate

hom_mat2d_translate (HomMat2DIdentity, Tx, Ty, HomMat2DTranslate)

参数说明:

  • HomMat2D(输入参数):仿射变换矩阵
  • Tx(输入参数):沿x轴方向平移的距离
  • Ty(输入参数):沿y轴方向平移的距离
  • HomMat2DTranslate(输出参数):输出变换矩阵
     

(2) 定义旋转变换矩阵:hom_mat2d_rotate

hom_mat2d_rotate( : : HomMat2D, Phi, Px, Py : HomMat2DRotate)

参数说明:

  • HomMat2D(输入参数):仿射变换矩阵
  • Phi(输入参数):旋转角度(单位弧度)
  • Px(输入参数):变换的固定点行坐标。固定点是指以该点为支撑进行仿射变换 (这里是指围绕这点进行旋转)
  • Py:(输入参数):变换的固定点列坐标
  • HomMat2DRotate(输出参数):输出变换矩阵

(3) 定义放缩变换矩阵:hom_mat2d_scale

hom_mat2d_scale( : : HomMat2D, Sx, Sy, Px, Py : HomMat2DScale)

参数说明:

  • HomMat2D(输入参数):仿射变换矩阵
  • Sx(输入参数):x轴方向的缩放因子
  • Sy(输入参数):y轴方向的缩放因子
  • Px(输入参数):变换的固定点行坐标
  • Py(输入参数):变换的固定点列坐标
  • HomMat2DScale(输出参数):输出变换矩阵

(4) 定义斜切变换矩阵:hom_mat2d_slant

hom_mat2d_slant(::HomMat2D,Theta,Axis,Px,Py:HomMat2DSlant)

参数说明:

  • HomMat2D(输入参数):仿射变换矩阵
  • Theta(输入参数):斜切角度(单位:弧度)
  • Axis(输入参数):斜切的坐标轴。取值列表:x,y
  • Px(输入参数):变换的固定点x坐标
  • Py(输入参数):变换的固定点y坐标
  • HomMat2DSlant(输出参数):输出仿射变换矩阵

3.3 扩展

​​​除了affine_trans_image算子之外,还Halcon还提供了其他一些算子用于特定类型几何变换,在此只列出算子的名称和功能简介,不再详细介绍各算子的实现,感兴趣的读者可以直接查阅官方资料。

  • vector_angle_to_rigid算子可用于刚性放射变换,该变换是由平移变换和旋转变换组合而成。
  • affine_trans_region算子用于对图像中特定区域进行仿射变换,可以认为是一种局部图像仿射变换算子,和affine_trans_image算子的使用步骤十分类似。
  • projective_trans_image算子完成图像的投影变换(又成透视变换),该变换是比仿射变换更高级别的变换。
  • 除此之外,Halcon还提供了一套3D仿射变换矩阵算子,其核心算子是hom_mat3d_project,其实3D仿射变换可以看作是一种特殊的透视变换。

至此,有关Halcon中实现的图像2D和3D几何变换的基本算子介绍完毕。

4. 本节小结

本篇简要介绍了Halcon提供的图像几何变换的常用算子。包括六种基本的几何变换,以及一种通用的仿射变换算子的实现步骤。下一节将介绍Halcon有关图像基本运算的内容,包括代数运算和逻辑运算。

(初稿完成,最新更新2025-02-01)

本专栏将介绍基于Halcon的各种传统经典的数字图像处理技术,所介绍内容基本与Gonzalez的教材保持一致。作为学习和实践DIP技术的入门教程。

感谢大家的支持和浏览,本专栏将持续更新,每篇的篇幅控制在5000字左右,这样大家阅读起来也比较轻松。估计2025年上半年完成全部内容,欢迎加收藏。但由于到了假期,更新的速度不会很快。

在专栏全部完成之前,所有内容将一直免费。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值