【Halcon】 affine_trans_image 算子详解
📌 算子签名
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 会用到一些插值算法导致的。 我们下一篇继续分析。