自学内容网 自学内容网

halcon中的放射变换

放射变换原理

怎样计算放射变换

仿射变换affine是透视变换的子集 - 仿射矩阵
在这里插入图片描述
仿射变换矩阵为2*3的矩阵,第三列的元素起着平移的作用,前面两列的数字对角线上是缩放,其余为旋转或者斜切的作用 - 计算仿射矩阵只需要3对不共线的点

定义

指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。

平移变换

在这里插入图片描述

缩放变换

在这里插入图片描述

翻转

在这里插入图片描述

斜切变换

在这里插入图片描述

刚体运动

在这里插入图片描述

放射变换流程

要进行仿射变换,必须先获取变换矩阵。要获取变换矩阵,必须先获取特征点坐标、角度等信息,几何匹配和bolb分析是获取特征点的高效方法。
1、通过hom_mat2d_identity(:::HomMat2DIdentity)算子创建一个初始化矩阵 即[1 0 0 0 1 0 0 0 1]。
2、在初始化矩阵的基础上,使用各种变换形式(平移、缩放、旋转)生成仿射变换矩阵。

// 把旋转角度添加到仿射变换矩阵
 hom_mat2d_rotate(HomMat2D, // 输入仿射变换矩阵(等于给了一个原始矩阵位置)
                  Phi, // 输入旋转角度(弧度制)
                  Px,Py, // 变换的参考点(围绕该点进行旋转)
                  HomMat2DRotate) // 输出旋转变换矩阵
 ​
 // 把缩放添加到仿射变换矩阵
 hom_mat2d_scale(HomMat2D,
                 Sx,Sy, // x,y轴缩放比例
                 Px,Py, // 变换的参考点(围绕该点进行缩放)
                 HomMat2DScale) // 输出缩放变换矩阵
     
 // 把平移添加到仿射变换矩阵
 hom_mat2d_translate(HomMat2D,
                     Tx,Ty, // 沿x轴、y轴方向平移的距离
                     HomMat2DTranslate) // 输出平移矩阵
 ​
 // 把斜切添加到仿射变换矩阵
 hom_mat2d_slant(HomMat2D,
                 Theta, // 输入斜切角度(弧度制)
                 Axis, // 输入斜切的坐标轴。取值列表:x,y
                 Px,Py,
                 HomMat2DSlant) // 输出斜切变换矩阵
计算已知点运动后的仿射矩阵

 // 根据两个以上点对计算刚性仿射变换矩阵,支持旋转和平移
 ​
 // 求平移或旋转矩阵
 vector_angle_to_rigid(Px,Py, // 区域变换之前中心点的坐标
                       Phi, // 夹角(极轴水平向右的夹角始边 逆时针为正 顺时针为负)
                       Qx,Qy, // 区域变换之后的坐标
                       Phi1, // 变换之后的角度
                       HomMat2D) // 输出仿射变换矩阵
 ​
 vector_to_rigid(Px,Py, // 输入原始点组的x、y坐标
                 Qx,Qy, // 输入变换后点组的x、y坐标
                 HomMat2D) // 输出仿射变换矩阵
 ​
 // 根据两个以上点对计算相似仿射变换矩阵,支持旋转、平移和缩放
 vector_to_similarity(::Px,Py,Qx,Qy:HomMat2D)
    
 // 根据三个以上点对计算仿射变换矩阵,支持旋转、平移、缩放、斜切
 vector_to_hom_mat2d(::Px,Py,Qx,Qy:HomMat2D)

3、根据生成的变换矩阵执行仿射变换,对图像、区域、轮廓进行仿射变换。

 // 对XLD轮廓进行二维仿射变换,支持缩放,旋转,平移,斜切
 affine_trans_contour_xld(Contours, // 输入XLD轮廓
                          ContoursAffinTrans, // 输出变换的XLD轮廓
                          HomMat2D) // 输入仿射变换矩阵
 ​
 // 对图像轮廓进行二维仿射变换,支持缩放、旋转、平移,斜切
 affine_trans_image(Image, // 输入图像
                    ImageAffinTrans, // 输出变换后的图像
                    HomMat2D,
                    Interpolation, // 插值算法。参数值列表: nearest_neighbor,bilinear,constant,weighted
                    AdaptImageSize) // 结果图像尺寸是否自适应。默认值:false
 ​
 // 对区域进行任意二维仿射变换
 affine_trans_region(Region, // 输入区域
                     RegionAffineTrans, // 输出变换后的区域
                     HomMat2D, // 得到的矩阵变量
                     Interpolate) // 插值算法。默认值:nearest_neighbor。参数值列表:constant,nearest_neighbor
 ​
 // 对XLD多边形进行任意二维仿射变换
 affine_trans_polygon_xld(Polygon, // 输入XLD多边形
                          PolygonsAffinTrans, // 输出变换后的XLD多边形
                          HomMat2D)
 ​
 // 对点进行任意二维仿射变换,支持缩放、旋转、平移、斜切
 affine_trans_point_2d(HomMat2D,
                       Px,Py, // 原始点x或行坐标
                       Qx,Qy) // 变换点x或行坐标
 ​
 // 对像素进行任意二维仿射变换
 affine_trans_pixel(HomMat2D,
                    Row,Col, // 输入像素坐标
                    RowTrans,ColTrans) // 输出的变换像素坐标

应用案例
程序所用图片如下
在这里插入图片描述
完整代码

*获得窗口句柄
dev_get_window (WindowHandle)
*读取图片
read_image (Image, './affine.jpg')
*阈值处理
threshold (Image, Region, 0, 200)
*圆形开运算
opening_circle (Region, Region, 1.5) // 去毛刺
*连通区域处理
connection (Region, ConnectedRegions)
*选择给定形状的区域
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
*得到变换的中心点
area_center (SelectedRegions, _, Row, Column) // 提取当前区域中心及面积
*定义区域填充模式 fill为填充,margin为边缘绘制
dev_set_draw ('margin')

*hom_mat2d_translate中的两个参数的意思是:Tx和Ty分别代表Row方向和Column方向的平移量
dev_display (Image)
** 在选择区域中心绘制十字叉
*创建一个初始化矩阵(即[1.0, 0.0, 0.0, 0.0, 1.0, 0.0])
hom_mat2d_identity (HomMat2DIdentity) 
*生成放射变换矩阵:平移
hom_mat2d_translate (HomMat2DIdentity,30, 150, HomMat2DTranslate)
*进行放射变换
affine_trans_region (Region, RegionAffineTrans, HomMat2DTranslate, 'nearest_neighbor')

*hom_mat2d_rotate中的三个参数的意思是:旋转角度(逆时针为正,弧度制),旋转中心的row和column值
dev_display (Image)
** 创建一个沿着区域中心选择的矩阵
** Halcon中逆时针选择为正,正时针为负
hom_mat2d_rotate (HomMat2DIdentity, rad(90), Row, Column, HomMat2DRotate)
affine_trans_region (Region, RegionAffineTrans1, HomMat2DRotate, 'nearest_neighbor')

*hom_mat2d_scale中的四个参数的意思是:Sx和Sy分别代表Row方向和Column方向的缩放系数,缩放中心的row和column值
dev_display (Image)
disp_cross (WindowHandle, Row, Column, 10, 40)
hom_mat2d_scale (HomMat2DIdentity, 4.0, 4.0, Row, Column, HomMat2DScale)
affine_trans_region (Region, RegionAffineTrans3, HomMat2DScale, 'nearest_neighbor')

平移运行结果
在这里插入图片描述
旋转运行结果
在这里插入图片描述
缩放运行结果
在这里插入图片描述
有时候,并不需要创建初始化矩阵也可以执行仿射变换,可以使用vector_angle_to_rigid算子生成放射变换矩阵。

vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)
程序所用图片如下
在这里插入图片描述
扣出图片中的车牌对进行旋转纠正,运行代码如下

* 1、把图像加载到Halcon中
read_image (Image, '3.jpg')
* 2、把图像灰度化处理
rgb1_to_gray (Image, GrayImage)
decompose3 (Image, RImage, GImage, BImage)
trans_from_rgb (RImage, GImage, BImage, HImage, SImage, VImage, 'hsv')
* 3、二值化【作用是什么?】[粗略筛选目标区域]【0~255】
threshold (GrayImage, Region, 0, 80)
* 4、区域砍断【作用什么?】【把需求的区域独立为一个单独区域方便后提取】
connection (Region, ConnectedRegions)
* 5、区域特征筛选区域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 350000, 355000)
* 填充区域孔洞
fill_up (SelectedRegions, RegionFillUp)
** 把找到车牌区域转换为矩形2
shape_trans (RegionFillUp, RegionTrans, 'rectangle2')
** 增加精度图,做图像腐蚀处理
* erosion_circle (RegionTrans, RegionErosion, 17)
erosion_rectangle1 (RegionTrans, RegionErosion, 35, 35)
* 6、把该区域图像进行锁定
reduce_domain (GrayImage, RegionErosion, ImageReduced)
* 7、抠出锁定图像
crop_domain (ImageReduced, ImagePart)
********************** 图像扶正操作**************************
** 仿射变换
get_domain (ImagePart, ImagePartRegion)
** 提取区域中心
area_center (ImagePartRegion, _, Row, Column)
** 提取区域角度(phi)【弧度值】
orientation_region (ImagePartRegion, Phi)
** 根据中心坐标及区域弧度值创建仿射变换矩阵
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
** 仿射变换图像
affine_trans_image (ImagePart, ImageAffineTrans, HomMat2D, 'constant', 'false')

运行结果
在这里插入图片描述


原文地址:https://blog.csdn.net/m0_61796189/article/details/142337966

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!