1. 二维图像的平移、旋转、缩放

在这里插入图片描述
平移矩阵:
平移矩阵
旋转矩阵:逆时针为正
旋转矩阵
缩放矩阵:
缩放矩阵

2. 图像的仿射变换:不发生形变

在Halcon中,定义仿射变换矩阵,方法如下:

hom_mat2d_identity(HomMat2DIdentity) *创建一个空的仿射变换矩阵
hom_mat2d_translate(HomMat2DIDentity,Xt,Yt,HomMat2DTranslate) *平移矩阵:Xt,Yt表示平移距离
hom_mat2d_rotate(HomMat2DIDentity,rad(phi),Px,Py,HomMat2DRotate) *旋转矩阵:Px,Py表示旋转中心
hom_mat2D_scale(HomMat2DIDentity,Sx,Sy,Px,Py,HomMat2DScale) *缩放矩阵:Sx表示缩放倍数,Px表示缩放基准点

应用仿射变换矩阵:

affine_trans_pixel 	  *应用于像素点
affine_trans_point_2d     *应用于二维点
affine_trans_image        *应用于图像
affine_trans_region       *应用于区域
affine_trans_contour_xld  *应用于XLD轮廓

3. 投影变换:形变

主要用到的算子:

*该算子利用两个点坐标,计算变换矩阵(点1_X,1_Y,1_W,2_X,2_Y,2_W,HomMat2D表示一个结果矩阵)
hom_vector_to_proj_hom_mat2d ([Px],[Py],[Pw],[Qx],[Qy],[Qw], 'normalized_dlt', HomMat2D)

*投影变换,应用于图像
projective_trans_image (ImageReduced, TransImage, HomMat2D, 'bilinear', 'false', 'false')

关系
简单理解,就是将点1和点2之间的位置关系用矩阵表示出来,得到HomMat2D这个矩阵。

4. 实例:

目的:将一个透视形变的标定板,进行图像校正
在这里插入图片描述
校正后:
在这里插入图片描述
上代码:

dev_close_window ()
read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-17.12-Progress/examples/images/caliper/caliper_calib_12.png')
rgb1_to_gray (Image, GrayImage)
get_image_size (GrayImage, Width, Height)
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)
dev_display (GrayImage)
XCoordCorners:=[]
YCoordCorners:=[]
*阈值处理,提取灰度在15-90之间的区域(灰度直方图)
threshold (GrayImage, Regions, 15, 90)
*将提取的区域,不相连的部分分割成若干个
connection (Regions, ConnectedRegions)
*面积筛选,选择面积在613-2871之间的区域(特征直方图)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 613.86, 2871.29)
*裁剪区域
reduce_domain (GrayImage, SelectedRegions, ImageReduced)
*创建边缘轮廓
gen_contour_region_xld (SelectedRegions, Contours, 'border')
*将边缘轮廓分割为边(ps: 正方形4条,6边形6条)
segment_contours_xld (Contours, ContoursSplit, 'lines_circles', 5, 4, 2)
count_obj (ContoursSplit, Number)
for Index := 1 to Number by 1   
    select_obj (ContoursSplit, ObjectSelected, Index)
    *拟合每条边
    fit_line_contour_xld (ObjectSelected, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
    *存储当前的边顶点的X,Y坐标
    tuple_concat (XCoordCorners, RowBegin, XCoordCorners)
    tuple_concat (YCoordCorners, ColBegin, YCoordCorners)
endfor
Xoff:=100
Yoff:=100*Height/Width
*该算子利用两个点坐标,计算变换矩阵(Point1_X,Point1_Y,Point1_W, Point2_X,Point2_Y,Point2_W)
hom_vector_to_proj_hom_mat2d (XCoordCorners, YCoordCorners,[1,1,1,1], [Yoff,Yoff,Height-Yoff,Height-Yoff], [Xoff,Width-Xoff,Width-Xoff,Xoff], [1,1,1,1], 'normalized_dlt', HomMat2D)
*投影变换
projective_trans_image (ImageReduced, TransImage, HomMat2D, 'bilinear', 'false', 'false')
dev_display (TransImage)

原理:

  1. 首先对标定板边缘的黑线部分进行了阈值+面积筛选,得到:
    在这里插入图片描述
  2. 然后将此区域分割成了4条边,并遍历得到每条边起始点的XY坐标值:
    在这里插入图片描述
  3. 计算变换矩阵:已知的4个蓝色点(线段起始点),和4个红色点(通过图像长宽比例,绘制的点),为他们建立线性关联。

在这里插入图片描述

得到矩阵HomMat2D:
在这里插入图片描述

  1. 应用于图像。
    在这里插入图片描述

以上,如有错误,欢迎批评指正,谢谢。。。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐