当前位置: 首页 > news >正文

仿射变换、根据特征点进行仿射变换

目录

 对区域进行仿射变换

1.读取图片并进行开运算(目的是为了去除一些小毛刺) 

2.获取区域中心

3.放射变换

 旋转变换

缩放变换 

 根据两个或两个以上特征点进行仿射变换

1.绘制椭圆轮廓

2.获取轮廓

3. 根据多个点生成一个仿射矩阵


halcon中进行仿射变换的时候插值算法有affine_trans_image(默认的插值算法 'constant')affine_trans_region(默认的插值算法 'nearest_neighbor')

  1. 'constant' 当图像经过旋转、平移、缩放等变换之后 会产生一些原图当中没有对应的像素的区域 对这些区域进行定值进行填充
  2. 'nearest_neighbor' 最近邻插值法 最简单的一种插值算法 其核心原理:对于变换后图像每个新的像素点,都是取原始图像中距离最近像素的值为新值,不进行任何其他运算
  3. 'bilinear' 双线插值法,图像处理当中中等质量的插值算法,主要考虑最近的4个相邻域(2*2)求加权平均值作为新值
  4. '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:
原图
图1
图2
图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:
图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)

*输出结果如下图:

相关文章:

  • MultipartFile
  • 【Linux】ls 命令详解及使用示例:列出目录中的内容
  • 向量压缩方法全解析:从线性插值到小波压缩
  • spring重试机制
  • [IMX][UBoot] 01.UBoot 常用命令
  • MPO接口型光模块的失效检测
  • 进一步探究synchronized
  • 智能生成完整 Java 后端架构,告别手动编写 ControllerServiceDao
  • Langgraph实战--在Agent中加入人工反馈
  • 区分viewmodel和model职责的方法
  • C++-std::async与std::future基本使用
  • 使用 CMake 管理库版本号(VERSION 和 SOVERSION)
  • Canal详解
  • 使用 XState 状态机打造英语单词学习界面(demo)
  • 对象存储Ozone EC应用和优化
  • 多电流传感器电流检测方法多电流传感器电流检测方法
  • 图片转Latex软件
  • HarmonyOS运动语音开发:如何让运动开始时的语音播报更温暖
  • 中断相关知识
  • C语言的全称:(25/6/6)
  • 做网站收费 知乎/大数据培训
  • 地产公司网站建设计划书/推广哪个网站好
  • 用dedecms 做门户网站/经典软文案例100例
  • 电子商务网站功能需求/世界十大网站排名
  • 阜宁做网站哪家公司好/软文推广多少钱一篇
  • 有没有做租赁的网站/厦门网络关键词排名