仿射变换、根据特征点进行仿射变换
目录
对区域进行仿射变换
1.读取图片并进行开运算(目的是为了去除一些小毛刺)
2.获取区域中心
3.放射变换
旋转变换
缩放变换
根据两个或两个以上特征点进行仿射变换
1.绘制椭圆轮廓
2.获取轮廓
3. 根据多个点生成一个仿射矩阵
halcon中进行仿射变换的时候插值算法有affine_trans_image(默认的插值算法 'constant')和affine_trans_region(默认的插值算法 'nearest_neighbor')。
- 'constant' 当图像经过旋转、平移、缩放等变换之后 会产生一些原图当中没有对应的像素的区域 对这些区域进行定值进行填充
- 'nearest_neighbor' 最近邻插值法 最简单的一种插值算法 其核心原理:对于变换后图像每个新的像素点,都是取原始图像中距离最近像素的值为新值,不进行任何其他运算
- 'bilinear' 双线插值法,图像处理当中中等质量的插值算法,主要考虑最近的4个相邻域(2*2)求加权平均值作为新值
- 'weighted' 加权插值或者三线插值法 图像处理当中最高等质量的插值算法,计算成本最高 主要考虑最近的16个相邻域(4*4)求加权平均值作为新值
对区域进行仿射变换
1.读取图片并进行开运算(目的是为了去除一些小毛刺)
read_image (Image, 'affine')
dev_get_window (WindowHandle)
threshold (Image, Region, 0, 200)*开运算 先对区域进行腐蚀运算 ,在进行膨胀运算(目的是为了去除一些小毛刺,)
*参数3 1.5消除毛刺的圆的半径
opening_circle (Region, Region, 1.5)
* 最终结果如下图1:connection (Region, ConnectedRegions)
* 最终结果如下图2:*参数3 max_area筛选的是最大面积
*参数4 max_area 后面70 没有实际作用
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
* 最终结果如下图3:




2.获取区域中心
*获取区域的中心
area_center (SelectedRegions, Area, Row, Column)
*获取选择角度
orientation_region (SelectedRegions, Phi)*以边框的方式进行绘制
dev_set_draw ('margin')
dev_display (Image)*展示十字标记
*参数2 参数3 展示十字标记的位置
*参数4 十字标记的长度
*参数5 十字标记的旋转角度, 0 不旋转,
disp_cross (WindowHandle, Row, Column, 10, 40)
3.放射变换
*创建初始矩阵 齐次矩阵
hom_mat2d_identity (HomMat2DIdentity)
*生成平移的仿射矩阵
hom_mat2d_translate (HomMat2DIdentity, 30, 150, HomMat2DTranslate)
*对区域进行仿射变换
affine_trans_region ( Region , RegionAffineTrans, HomMat2DTranslate, 'nearest_neighbor')
* 最终结果如下图4:

旋转变换
dev_display (Image)
disp_cross (WindowHandle, Row, Column, 10, 40)
* 旋转变换
hom_mat2d_rotate (HomMat2DIdentity,rad(60), Row, Column, HomMat2DRotate)
affine_trans_region (Region, RegionAffineTrans1, HomMat2DRotate, 'nearest_neighbor')
* 最终结果如下图:

缩放变换
dev_display (Image)
disp_cross (WindowHandle, Row, Column, 10, 40)
* 缩放变换
hom_mat2d_scale (HomMat2DIdentity, 2, 2, Row, Column, HomMat2DScale)
affine_trans_region (Region, RegionAffineTrans2, HomMat2DScale, 'nearest_neighbor')
* 最终结果如下图:

根据两个或两个以上特征点进行仿射变换
1.绘制椭圆轮廓
gen_ellipse_contour_xld (ContEllipse, 70, 100, 0, 70, 90, 0, rad(360), 'positive', 1.5)
*参数1 输出图片
*参数2 参数3 圆心坐标
*参数4 椭圆的主轴旋转度 0 主轴为水平轴,rad(90)主轴为竖直轴
*参数5 。参数6 主轴的半径大小 另外一个轴方向半径大小
*参数'positive' 顺时针方向产生点 ,negative 逆时针产生点
*最后一个1.5参数 每隔1.5产生一个点* 输出结果如下图:
2.获取轮廓
get_contour_xld (ContEllipse, Row, Col)
*Row 行坐标的元组
*Col 列坐标的元组* 输出结果如下图:
3. 根据多个点生成一个仿射矩阵
vector_to_rigid (Col, Row, Col, Row, HomMat2D)
* Px 源点的列的坐标元组
* Py 源点的行的坐标元组
* Qx 目标点的列的坐标元组
* Qy 目标点的行的坐标元组、
*HomMat2D 生成的矩阵hom_mat2d_identity (HomMat2DIdentity)
*对HomMat2D矩阵再进行其他变换
hom_mat2d_rotate (HomMat2D,rad(90), 70, 100, HomMat2DRotate)
*把仿射矩阵应用到轮廓上
affine_trans_contour_xld (ContEllipse, ContoursAffineTrans, HomMat2DRotate)*输出结果如下图: