HALCON 基础:1. 形态学算子与ROI提取总结+示例

本文详细介绍了Halcon中的形态学算子(如腐蚀、膨胀、开闭运算、顶帽和底帽运算)以及ROI(感兴趣区域)的提取方法,包括特征选择、区域绘制、保存读取、距离计算和几何变换等内容,并提供了C++实现示例。
摘要由CSDN通过智能技术生成

HALCON 基础:1. 形态学算子与ROI提取总结+示例

1. 形态学操作:

1. 腐蚀:用于消除边缘和杂点

//erosion_circle()
erosion_circle (ObjectSelected, RegionErosion, 1.5)
//圆形腐蚀
//参数1:需要腐蚀的区域
//参数2:输出区域
//参数3:结构元半径

image-20230726094452634

2. 膨胀:用于连接区域外的杂点

//dilation_circle()
dilation_circle (RegionClipped, RegionDilation, 2.5)
//圆形膨胀
//参数1:需要膨胀的区域
//参数2:输出区域
//参数3:结构元大小

image-20230726095359112

3. 开运算:先腐蚀后膨胀,用于消除小的非关键区域

//opening()
opening (Region, RegionErosion, RegionOpening)
//开运算
//参数1:Region为要进行开运算的区域;
//参数2:RegionErosion为结构内核区域;
//参数3:RegionOpening为开运算后的区域。

image-20230726095750971

4. 闭运算:先膨胀后腐蚀,用于填充空隙

//closing()
closing (RegionClosing2, Rectangle, RegionClosing3)
//闭运算:
//参数1:RegionClosing2输入区域
//参数2:Rectangle用户自定义结构元素 
//参数3:RegionClosing3闭运算的区域 

image-20230726100432795

5. 顶帽运算:原始的二值图像减去开运算的图像。

​ 顶帽运算对于增强阴影部分的细节很有用。开运算将消去图像中部分灰度值较高的部分,用原图减去开运算的结果,将得到被消去的部分。如果图像存在光照不均的情况,采用顶帽运算可以消除部分光照的影响,凸显背景下的前景目标对象。

//top_hat()
top_hat (Lines, Rect, RegionTopHat)
//顶帽运算
//参数1:Lines输入要处理的区域。
//参数2:Rect输入结构元素(区域独立)。
//参数3:RegionTopHat输出顶帽运算的结果。

image-20230726103126727

image-20230726101908284

image-20230726102332174

6. 底帽运算:用原始的二值图像减去闭运算的图像。

​ 用图像闭运算操作减去原始图像后的结果,从而获取图像内部的小孔或前景色中黑点,也常用于解决由于光照不均匀图像分割出错的问题。

//bottom_hat()
bottom_hat (Regions, Circle, RegionBottomHat)
//参数1:Regions:输入要处理的区域。
//参数2:Circle:输入结构元素(区域独立)。
//参数3:RegionBottomHat:输出底帽运算的结果。

image-20230726103053666

image-20230726102906374

2. ROI提取

1. 提取区域特征算子

1)area_center算子

**算子原型:**area_center(Regions : : : Area, Row, Column)

​ 计算所有不相连区域的面积和中心点坐标。Area为面积,Row和Column为中心点坐标,如果有多个,则分出多个,且位置一一对应。

area_center (Characters, Area, Row, Column)
//输入参数:Regions——被测区域。
//输出参数:Area——被测区域的面积。
//        Row——被测区域中心的行索引。
//        Column——被测区域中心的列索引。

image-20230726110221173

2)select_shape算子

**算子原型:**select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : )

​ 借助图像的特征选择特定的区域

select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : )
//参数
Regions (input_object)//要检查的区域
SelectedRegions (output_object)//满足条件的区域
Features (input_control)	//选择筛选的形状特征。
	/*Default value: 'area'
List of values: 'anisometry', 'area', 'area_holes', 'bulkiness', 'circularity', 
'column', 'column1', 'column2', 'compactness', 'connect_num', 'contlength', 
'convexity', 'dist_deviation', 'dist_mean', 'euler_number', 'height', 'holes_num', 
'inner_height', 'inner_radius', 'inner_width', 'max_diameter', 'moments_i1', 
'moments_i2', 'moments_i3', 'moments_i4', 'moments_ia', 'moments_ib', 'moments_m02', 
'moments_m02_invar', 'moments_m03', 'moments_m03_invar', 'moments_m11',
'moments_m11_invar', 'moments_m12', 'moments_m12_invar', 'moments_m20',
'moments_m20_invar', 'moments_m21', 'moments_m21_invar', 'moments_m30',
'moments_m30_invar', 'moments_phi1', 'moments_phi2', 'moments_psi1', 'moments_psi2', 
'moments_psi3', 'moments_psi4', 'num_sides', 'orientation', 'outer_radius', 'phi', 
'ra', 'rb', 'rect2_len1', 'rect2_len2', 'rect2_phi', 'rectangularity', 'roundness', 
'row', 'row1', 'row2', 'struct_factor', 'width'
*/
Operation (input_control)//单个特征的链接类型
//Default value: 'and'
//List of values: 'and', 'or'
Min (input_control)//Features特征的最小值
//Default value: 150.0
//Typical range of values: 0.0 ≤ Min ≤ 99999.0
//Minimum increment: 0.001
//Recommended increment: 1.0
Max (input_control)//Features特征的最大值
//Default value: 99999.0
//Typical range of values: 0.0 ≤ Max ≤ 99999.0
//Minimum increment: 0.001
//Recommended increment: 1.0
//Restriction: Max >= Min

常用的特征:

  • ‘area’ : 区域的面积

  • ‘row’ : 中心的行索引

  • ’column’: 中心列的索引

  • ’width’: 区域宽度

  • ’height’: 区域高度

  • ’row1’: 左上角的行索引

  • ’column1’: 左上角列

  • ’row2’: 右下角行

  • ’column2’: 右下角列

  • ‘circularity’:和圆的相似度

  • ‘compactness’:密度

  • ……

3)inner_circle算子

​ **算子原型:**inner_circle(Regions : : : Row, Column, Radius)

​ **作用:**提取一个区域最大内接圆

inner_circle (Regions, Row, Column, Radius)
//参数1: 输入区域
//参数2、3、4:输出内接圆的圆心坐标,半径

4)inner_rectangle1算子

算子原型:inner_rectangle1(Regions : : : Row1, Column1, Row2, Column2)

作用::提取一个区域的最大内接矩形

inner_rectangle1 (KnobFreeRegion, Row1, Column1, Row2, Column2)
//参数1: 输入区域
//剩余参数:输出内接矩形的左上角、右下角坐标。分别为:左上行-y、左上列-x,右下行、右下列

image-20230726130017508

5) smallest_circle 算子

​ **算子原型:**smallest_circle (Region, Row, Column, Radius)

作用:最小外接圆

smallest_circle(SelectedRegions,Row,Column,Radius)

//获取区域最小外接圆数据
//参数2、3、4:输出外接圆的圆心坐标,半径

image-20230726130653628

6) smallest_rectangle1 算子

算子原型:smallest_rectangle1(Regions : : : Row1, Column1, Row2, Column2)

作用:给定区域的最小外接矩形

smallest_rectangle1 (Regions, Row1, Column1, Row2, Column2)
//参数同inner_rectangle1()

image-20230726131018323

7) region_features 算子

​ **算子原型:**region_features(Regions : : Features : Value)

​ **作用:**计算区域形状特征

region_features(S2,'area',Value)
//计算区域的形状特征
//输入参数:
//S2————待检测区域
//area————要检测的特征(默认值:'area')
//输出参数:Value ————计算的特征

image-20230726131646102

2. ROI区域

绘制ROI区域
//draw_用户在窗口中以交互方式创建相关区域的参数
//gen_根据前述draw_创建的参数绘制相关的区域

//画圆
//draw_circle()
draw_circle( : : WindowHandle : Row, Column, Radius)
//WindowHandle(输入窗口句柄)
//Row (输出重心的行索引, circle.center.y)
//Column(输出重心的列索引,circle.center.x )
//Radius(输出圆的半径,circle.radius)
//gen_circle()
gen_circle( : Circle : Row, Column, Radius : )
//Circle(输出生成的圆对象)
//Row(输入中心的行索引,circle.center.y)
//Column(输入中心的列索引,circle.center.x)
//Radius(输入圆的半径, circle.radius)
    
//椭圆
draw_ellipse( : : WindowHandle : Row, Column, Phi, Radius1, Radius2)
//Row(输出重心的行索引, circle.center.y)
//Column(输出重心的列索引,circle.center.x )
//Phi(输出以弧度为单位的较长半径 (Radius1) 的方向)
//Radius1(输出前半轴)
//Radius2(输出后半轴)
gen_ellipse( : Ellipse : Row, Column, Phi, Radius1, Radius2 : )
//ELLipse 绘制生成的椭圆对象
//其余参数相同

//矩形 ——与坐标轴平行
draw_rectangle1( : : WindowHandle : Row1, Column1, Row2, Column2)
//Row1:左上行
//Column1:左上列
//Row2:右下行
//Column2:右下列
gen_rectangle1( : Rectangle : Row1, Column1, Row2, Column2 : )
//Rectangle:生成的矩形,其余参数同上
    
//带角度的矩形
draw_rectangle2( : : WindowHandle : Row, Column, Phi, Length1, Length2)
//WindowHandle(输入窗口句柄)
//Row(输出中心的行索引,rectangle2.center.y )
//Column(输出中心的列索引 ,rectangle2.center.x)
//Phi(输出以弧度表示的较大半轴的方向)
//Length1(输出更大的半轴)
//Length2(输出较小的半轴)
gen_rectangle2( : Rectangle : Row, Column, Phi, Length1, Length2 : )
//Rectangle 生成的矩形,其余参数同上

//画直线
draw_line( : : WindowHandle : Row1, Column1, Row2, Column2)
//Row1, Column1: 第一个点的行列坐标
//Row2, Column2: 第二个点的行列坐标
gen_region_line( : RegionLines : BeginRow, BeginCol, EndRow, EndCol : )

//画点
draw_point( : : WindowHandle : Row, Column)
gen_region_points( : Region : Rows, Columns : )


保存读取ROI区域
//保存区域
write_region(Region : : FileName : )
//Region:要保存的区域
//FileName:要保存到的文件路径及文件名
    
//读取区域
read_region( : Region : FileName : )
//Region:输出读取区域
//FileName:要读取的文件路径及名称实操

image-20230726144347999

3. 距离计算

点到点、点到直线、点到区域的最长最短、直线到区域的最长最短、区域与区域的最短、线到线最长最短

//点到点
distance_pp (Row1, Column1, Row2, Column2, Distance)
//前四个参数:两个点的坐标
//输出Distance:两点的距离
//点到直线
distance_pl (Row, Column, Row1, Column1, Row2, Column2, Distance1)
//Row, Column 点的坐标
// Row1, Column1, Row2, Column2 直线两端点坐标
// Distance1 输出距离
//点到区域的最长最短
distance_pr (Circle, Row, Column, DistanceMin, DistanceMax)
//Circle:输入region
//Row, Column 点的坐标
//DistanceMin, DistanceMax:输出最小最大距离
//区域到区域的最短
distance_rr_min(Circle, Circle1, MinDistance, Row11, Column11, Row21, Column21)
//Circle, Circle1 输入的两个region
//Row11, Column11 区域1距离2最近的坐标
//Row21, Column21 区域1距离1最近的坐标

image-20230726164200580

4. 区域几何变换

平移(平移相减,可得到某个区域的边缘)、转置(正中心为基点)、缩放、镜像、倒置、极坐标与笛卡尔坐标转换

//平移
move_region (Region, RegionMoved, Row - Row1, Column - Column1)
//Region:要平移的区域
//RegionMoved:平移后的区域
//Row - Row1, Column - Column1:要移动的行列距离

image-20230726164548398

//转置
transpose_region (Region, Transposed, 256, 256)
//Region
//Transposed 转置后
//256,256 以256,256这个坐标为基点进行转置

image-20230726164815133

//缩放
zoom_region (Region, RegionZoom, 2, 2)
//Region
//RegionZoom: 缩放后的区域
//2,2 行列均按照2倍缩放系数进行放缩
//为什么变位置了?
//因为按照2倍系数,相当于横纵坐标也放大了两倍

image-20230726165030896

//镜像
mirror_region (Region, RegionMirror1, 'row', 512)
//Region
//RegionMirror1: 镜像后的区域
//'row': 镜像模式(行)
//512: 要镜像的中点坐标的两倍

image-20230726165456611

//倒置
transpose_region (Region, Transposed, 256, 256)
//256,256 倒置基点坐标

image-20230726165734124

//坐标转换
polar_trans_image_inv(PolarImage : XYTransImage : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, Width, Height, Interpolation : )
//PolarImage输入图像。
//XYTransImage输出图像。
//Row圆弧中心的行坐标。
//Column(圆弧中心的列坐标。
    
//AngleStart将输入图像的第一列映射到的射线角度。
//AngleEnd将输入图像的最后一列映射到的射线角度。
    
//RadiusStart要将输入图像的第一行映射到的圆的半径。
//RadiusEnd要将输入图像的最后一行映射到的圆的半径。
//Width输出图像的宽度。
//Height输出图像的高度。
    
//Interpolation内插法进行变换。
//默认值:“ nearest_neighbor”
//值列表:‘bilinear’,‘nearest_neighbor’

image-20230726170059976

5. 区域仿射变换

任意变换、二维变换矩阵、平移、缩放、旋转、刚性仿射变换、扩展图像变换

  • 任意变换
affine_trans_region(Region : RegionAffineTrans : HomMat2D, Interpolate : )
//Region(输入要变换的区域)
//RegionAffineTrans(输出转换后的区域)
//HomMat2D(输入输入变换矩阵)
//Interpolate(输入是否使用插值进行转换)列表:‘constant’、‘nearest_neighbor’
  • 创建二维变换矩阵
hom_mat2d_identity( : : : HomMat2DIdentity)
//HomMat2DIdentity(输出变换矩阵)
  • 平移
hom_mat2d_translate( : : HomMat2D, Tx, Ty : HomMat2DTranslate)
//HomMat2D(输入变换矩阵)
//Tx(输入沿 x 轴平移多少)
//Ty(输入沿 y 轴平移多少)
//HomMat2DTranslate(输出变换后矩阵)
  • 缩放
hom_mat2d_scale( : : HomMat2D, Sx, Sy, Px, Py : HomMat2DScale)
//HomMat2D(输入变换矩阵)
//Sx(输入沿 x 轴的缩放比例)
//Sy(输入沿 y轴的缩放比例)
//Px(输入变换的固定点(x 坐标))
//Py(输入变换的固定点(y 坐标))
//HomMat2DScale(输出变换矩阵)
  • 旋转
hom_mat2d_rotate( : : HomMat2D, Phi, Px, Py : HomMat2DRotate)
//HomMat2D(输入变换矩阵)
//Phi(输入旋转角度)
//Px(输入变换的固定点(x 坐标))
//Py(输入变换的固定点(y 坐标))
//HomMat2DRotate(输出变换矩阵)

image-20230726171650539

  • 刚性仿射变换

vector_angle_to_rigid从点对应和两个对应角度计算刚性仿射变换,即由旋转和平移组成的变换,并将其作为齐次变换矩阵返回。

vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)

//Row1(输入原点的行坐标) point.y
//Column1(输入原点的列坐标) point.x
//Angle1(输入原点的角度)
//Row2(输入变换点的行坐标) point.y
//Column2(输入变换点的列坐标) point.x
//Angle2(输入变换点的角度)
//HomMat2D(输出输出变换矩阵)
  • 扩展图像变换

affine_trans_image对给出的图像应用任意仿射二维变换,即缩放、旋转、平移和倾斜(倾斜),并返回变换后的图像

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

//Image(输入要变换的图像)
//ImageAffineTrans(输出变换后图像)
//HomMat2D(输入变换矩阵)
//Interpolation(输入插值类型)
//值列表:‘bicubic’、‘bilinear’、‘constant’、‘nearest_neighbor’、‘weighted’

//AdaptImageSize(输入是否调整结果图像的大小)值列表:“false”、“true”

6. 联合C++实现

导出C++代码,实现对ROI区域的绘制,保存、读取;实现计算简单的距离(点到点、点到直线)

image-20230726174747969

image-20230726175033641

编写代码,通过手动绘制区域,获得区域的相关信息(圆度、轮廓长度、面积)。

image-20230726175406703

image-20230726175420721

  • 25
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值