【Halcon】 affine_trans_image 算子详解

发布于:2025-06-03 ⋅ 阅读:(26) ⋅ 点赞:(0)

📌 算子签名

affine_trans_image(Image : ImageAffineTrans : HomMat2D, Interpolation, AdaptImageSize)
  • Image:输入图像。
  • ImageAffineTrans:输出变换后的图像。
  • HomMat2D:描述仿射变换的 2D 齐次变换矩阵。
  • Interpolation:插值方法,决定变换时的像素值计算方式。
  • AdaptImageSize:布尔值,指示是否调整输出图像尺寸以适应变换后的图像。

🧠 算法原理

affine_trans_image 通过应用仿射变换矩阵 HomMat2D,对输入图像进行几何变换。该矩阵可以通过以下算子生成:([博客园][2])

  • hom_mat2d_identity:创建单位矩阵。
  • hom_mat2d_translate:添加平移。
  • hom_mat2d_rotate:添加旋转。
  • hom_mat2d_scale:添加缩放。

这些变换可以组合使用,以实现复杂的图像变换。


⚙️ 参数详解

1. HomMat2D(仿射变换矩阵)

该矩阵定义了图像的几何变换,包括:

  • 缩放:调整图像尺寸。
  • 旋转:围绕指定点旋转图像。
  • 平移:移动图像位置。
  • 倾斜(斜切):改变图像形状。

可以通过组合上述算子生成所需的变换矩阵。

2. Interpolation(插值方法)

决定变换后像素值的计算方式,常用方法包括:

  • ‘nearest_neighbor’:最近邻插值,速度快,但可能导致图像锯齿。
  • ‘bilinear’:双线性插值,平衡速度和质量。
  • ‘constant’:在图像边界外使用常数值填充。
  • ‘weighted’:加权插值,适用于高质量需求。

3. AdaptImageSize(是否调整图像尺寸)

  • ‘true’:输出图像尺寸会根据变换自动调整,避免裁剪。
  • ‘false’:输出图像尺寸与输入图像相同,可能导致部分区域被裁剪。

📐 坐标系注意事项

在 HALCON 中,affine_trans_image 使用的坐标系原点位于图像的左上角(像素的左上角),而非像素中心。这与某些算子(如 affine_trans_pixel)一致,但与 HALCON 的标准坐标系(原点在像素中心)不同。因此,在创建变换矩阵时,需注意坐标系的一致性,以避免意外的变换结果。


💻 示例代码

以下是一个使用 affine_trans_image 进行图像旋转和缩放的示例:

read_image(Image, 'example_image')
hom_mat2d_identity(HomMat2DIdentity)
hom_mat2d_rotate(HomMat2DIdentity, rad(45), 256, 256, HomMat2DRotate)
hom_mat2d_scale(HomMat2DRotate, 1.5, 1.5, 256, 256, HomMat2DScale)
affine_trans_image(Image, ImageAffineTrans, HomMat2DScale, 'bilinear', 'true')

该示例中,图像首先绕点 (256, 256) 旋转 45 度,然后以同一点为中心进行 1.5 倍的缩放,最后应用双线性插值,并调整输出图像尺寸以适应变换后的图像。


🧰 应用场景

  • 图像校正:纠正图像中的旋转、倾斜等畸变。
  • 模板匹配:将模板图像与目标图像对齐,以进行匹配和识别。
  • 图像增强:对图像进行缩放、旋转等操作,以增强图像特征。
  • 图像拼接:将多个图像通过仿射变换拼接成一个完整图像。

思考

我利用 affine_trans_image 对图片进行的旋转,发现图片发生了一定的变化。
这个是 affine_trans_image 会用到一些插值算法导致的。 我们下一篇继续分析。


网站公告

今日签到

点亮在社区的每一天
去签到