affine_trans_image(Image : ImageAffineTrans : HomMat2D, Interpolation, AdaptImageSize : )
affine_trans_image应用任意仿射2D变换,即,缩放、旋转、平移和倾斜(skewing)到Image ,
并在ImageAffineTrans返回转换后的图像。
仿射变换由HomMat2D中给出的齐次变换矩阵来描述,
它可以由hom_mat2d_identity、
hom_mat2d_scale、
hom_mat2d_rotate、
hom_mat2d_translate等操作符来创建,
也可以由vector_angle_to_hard等操作符生成。
齐次变换矩阵的分量解释为:图像的行坐标对应于x,列坐标对应于定义变换矩阵的坐标系的y。
这对于获得图像的右手坐标系是必要的。
特别是,这确保了旋转是在正确的方向上进行的。
注意,矩阵的(x,y)顺序很自然地对应于图像中坐标的通常顺序(column,row)。
忽略输入图像的域,即,假设为图像的完整矩形。
输出图像的域是变换后的矩形与输出图像的矩形的交集。
通常,转换后的点位于像素坐标之间。
因此,必须采用合适的插补方案。
插值也可以用来避免缩放图像的混叠效果。
插补的质量和速度可以通过参数Interpolation来设定:
nearest_neighbor
最近邻插值:根据最近像素的灰度值确定灰度值(可能质量较低,但速度非常快)。
bilinear
双线性插值。灰度值通过双线性插值从最近的四个像素点确定。
如果仿射变换包含比例因子< 1的缩放,则不进行平滑,这可能会导致严重的混叠效果(中等质量和运行时间)。
bicubic
双立方插值。通过双三次插值,从最近的4*4像素点确定灰度值。
如果仿射变换包含尺度因子< 1的缩放,则不进行平滑处理,这可能会导致严重的混叠效果(质量高,速度慢)。
constant
双线性插值。灰度值通过双线性插值从最近的四个像素点确定。
如果仿射变换包含尺度因子< 1的缩放,则使用一种均值滤波器来防止混叠效果(中等质量和运行时间)。
weighted
双线性插值。灰度值通过双线性插值从最近的四个像素点确定。
如果仿射变换包含比例因子< 1的缩放,则使用一种高斯滤波器来防止混叠效果(高质量、慢速)。
此外,系统参数“int_zooming”(参见set_system)会影响转换的准确性。
如果'int_zooming'设置为'true',则byte、int2和uint2图像的转换将在内部使用定点算法进行,这将大大缩短执行时间。
然而,在这种情况下,转换后的灰度值的精度更小。
对于byte图像,与更精确的计算(使用'int_zooming' = 'false')之间的差异通常小于两个灰度级。
对应的,对于int2和uint2图像,灰度值的差异小于图像动态灰度值范围的1/128倍,
即,如果使用16位的整个动态范围,它们可以达到512个灰度级。
此外,如果应用大尺度因子,得到较大的输出图像,则可能会在图像的右下角产生未定义的灰度值。
未定义灰度值边缘的最大宽度Bmax,可以通过等式
估算。
其中S为一维尺度因子,I为对应维数下输出图像的尺寸。
对于real图像,参数“int_zoom”并不影响精度,因为内部计算总是使用浮点运算。
目标图像的大小可以通过参数AdaptImageSize来控制:
如果设置为“true”,则会调整大小,以便在右侧或下方边缘不会发生剪切。
如果设置为“false”,目标图像的大小与输入图像相同。
注意,独立于AdaptImageSize,图像总是在左边缘和上边缘裁剪,即,所有变换后坐标为负的图像部分被裁剪。
affine_trans_image不使用HALCON标准坐标系(原点位于第一个像素的中心),
而是使用与affine_trans_pixel相同的坐标系,即,原点位于第一个像素的左上角。
因此,应用affine_trans_image对应于一个转换链(参见affine_trans_pixel),
它应用于图像的每个点(输入和输出像素作为齐次向量)。
因此,在基于图像派生的坐标(例如area_center_gray等操作符)创建仿射转换时,可能会得到意想不到的结果。
例如,如果使用这个操作符计算旋转对称图像的重心,然后使用hom_mat2d_rotate将图像绕该点旋转,得到的图像将不会位于原始图像上。
在这种情况下,您可以通过在affine_trans_image中使用HomMat2D之前,
对HomMat2D应用以下的转换来补偿这种效果:
hom_mat2d_translate(HomMat2D, 0.5, 0.5, HomMat2DTmp)
hom_mat2d_translate_local(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)
affine_trans_image(Image, ImageAffineTrans, HomMat2DAdapted, 'constant', 'false')
1affine_trans_image_size(Image : ImageAffineTrans : HomMat2D, Interpolation, Width, Height : )
和上面函数相似,此函数也是对输入图像执行变换,具体介绍可参考上面。
此输出图像的大小由参数Width, Height指定。
请注意,图像总是在左侧和上部边缘进行裁剪,即,所有变换后坐标为负的图像部分被裁剪。
如果选择适当的仿射变换(特别是平移),可以在一次调用中转换和裁剪图像的一部分。
例如,在使用变形模式时(请参阅compare_variation_model)时,这是很有用的,
因为使用这种机制,只对图像中应该检查的部分进行转换。
例程:
read_image (Image, 'ic0')
get_image_size (Image, Width, Height)
hom_mat2d_identity(Matrix1)
*以Width/2, Height/2为参考点,X,Y方向分别缩放0.5, 0.5倍。
hom_mat2d_scale(Matrix1,0.5, 0.5,Width/2, Height/2, Matrix2)
affine_trans_image(Image,TransImage,Matrix2,'constant','true')
*以Width/2, Height/2为参考点,逆时针旋转45度
hom_mat2d_rotate(Matrix1,rad(45), Width/2, Height/2, Matrix3)
affine_trans_image(Image,TransImage,Matrix3,'constant','true')
*整体图像。向X,Y分别移动22,22
hom_mat2d_translate(Matrix1,22,22,Matrix4)
affine_trans_image(Image,TransImage,Matrix4,'constant','true')
*将图像平移变换输出,结果图像大小为Width/2, Height/2
affine_trans_image_size (Image, ImageAffineTrans, Matrix4, 'constant', Width/2, Height/2)
|