图像处理(2) : 几何变换

​    在许多应用中,不能保证获取到的物体图像是同一个位置和方向。大多数情况检测的物体会发生旋转,平移和缩放。如果检测物体于相机不成相互平行关系,则拍摄到的图像发生一些几何畸变,例如会把一个正方形拍摄成一个梯形等,就需要进行一定的畸变矫正。

一、图像平移,旋转和缩放

    为了校正图像在拍摄中的失真问题,可以对图像进行图像的几何变换,如平移,旋转和缩放,这是简单的位置变换和形状变换。

    一个点P0的位置可以用3坐标表示(Xp,Yp,Zp),这3个坐标也可以看成一个3D向量。

1.1 图像的平移

    如果将这个点移动(Xt,Yt)个向量,相当于在P坐标的左边乘以一个平移矩阵T。设平移后的点为Pt,则公式为:

    halcon测试实例:

read_image (Image, 'printer_chip/printer_chip_01')
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_display (Image)
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_translate (HomMat2DIdentity, 200, 200, HomMat2DTranslate)
affine_trans_image (Image, ImageAffineTrans, HomMat2DTranslate, 'constant', 'false')
dev_display (ImageAffineTrans)

    1.2图像的旋转

    如果将这个点在二维平面上绕坐标原点旋转角度y,相当于在P0坐标的左边乘以一个旋转矩阵R。设旋转后的点为Pr,公式为:

*方式1
rotate_image (Image, ImageRotate, 90, 'constant')
​
*方式2
*开辟一个旋转矩阵进行旋转
hom_mat2d_rotate (HomMat2DTranslate, 0.78, 0, 0, HomMat2DRotate)
affine_trans_image (ImageRotate, ImageAffineTrans1, HomMat2DRotate, 'constant', 'false')

    1.3图像的缩放

    假设这个点在二维平面上,沿x轴方向放大Ss倍,沿y轴方向放大Sy倍,那么变换后的该点的坐标记为Ps,则公式为:

*方法1
*根据缩放因子实现图像缩放
read_image(ImageMonkey,'monkey')
zoom_image_factor(ImageMonkey,ZooImage1, 0.5, 0.5, 'bilinear')
​
*方法2
根据尺寸进行图像的缩放
zoom_image_size (ImageMonkey, ZooImage2, 256, 256, 'bilinear')
​
*方法3
利用仿射变换矩阵实现图像的缩放
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_scale (HomMat2DIdentity, 0.5, 0.5, 0, 0, HomMat2DScale)
affine_trans_image (ImageMonkey, ZooImage3, HomMat2DScale, 'nearest_neighbor', 'true')

二、图像的仿射变换

    把平移、旋转和缩放结合起来,可以在halcon中使用仿射变换的相关算子,一个仿射变换矩阵包括平移向量和旋转向量。

    2.1仿射变换矩阵

    在仿射变换前,先确定仿射变换矩阵,步骤如下:

    (1)使用以下算子创建一个空的仿射变换矩阵。

hom_mat2d_identity (HomMat2DIdentity)

    (2)指定变换的参数,这里可以指定平移、缩放和旋转参数,举例如下:

  • 设置平移矩阵,向x轴正方形平移30个像素,向y轴正方向平移30个像素

hom_mat2d_translate (HomMat2DIdentity, 30, 30, HomMat2DTranslate)
  • 设置旋转矩阵,以点(Px,Py)为参考点,旋转角度phi

hom_mat2d_rotate (HomMat2DTranslate, rad(phi), Px, Py, HomMat2DRotate)

设置缩放矩阵,以点(Px,Py)为参考点,放大2倍

hom_mat2d_scale (HomMat2DIdentity, 2, 2, Px, Py, HomMat2DScale)

 

    2.2应用仿射变换矩阵

    仿射变换矩阵可以应用于像素点(Pixel)、二维点(Point)、图像(Image)、区域(Region)及XLD轮廓等对象,有以下几例:

    (1)应用于像素点:

affine_trans_pixel(HomMat2D, Row, Col, RowTrans, ColTrans)

    (2)应用于二维点:

affine_trans_point_2d(HomMat2D, Px, Py, Qx, Qy)

    (3)应用于图像:

affine_trans_image(Image,ImageAffineTrans,HomMat2D, Interpolation, AdaptImageSize)

    (4)应用于区域:

affine_trans_region(Region,RegionAffineTrans,HomMat2D, Interpolate)

    (5)应用于XLD轮廓:

affine_trans_contour_xld(Contours,ContoursAffineTrans,HomMat2D)

三、投影变换

    投影变换包括的情况很多,有可能变换前后图像的形状发生了很大的改变,如对边不再平行,或者发生了透视畸变,这时可以使用投影变换使其恢复原状。其步骤与仿射变换类似,首先计算投影变换矩阵,然后计算投影变换参数,最后将投影变换矩阵映射到对象上。

    图像校正实例:

    要计算投影变换矩阵,应找出投影区域的特征点的位置及其投影后的位置,通过hom_vector_to_proj_hom_mat2d算子进行换算,就可以根据已知的投影对应的点的值计算投影变换矩阵。然后使用projective_trans_image对图像进行投射变换,就能得到投影后的图像了。

 

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值