Halcon算子总结

0、region 和 image的区别

Halcon中的区域region:只有区域坐标信息,region的宽度、高度、中心点坐标、倾斜角度等,这个区域内没有图像灰度值。

图像image:既有每个像素位置的坐标信息(y,x),又有图像区域内的像素灰度值。

1、不能将union1/union2和concat_obj混淆。

union1/2是针区域融合(merged),因此对象的个数被改变。假设一块画布上有2个区域A\B,使用union将这2个区域融合到一起之后,虽然表面上仍然是分开的,不在一起,但实际上画布上只有1个区域了(这个区域包含之前的A\B两个区域)。

也可以实验一下:使用2个不同颜色标记的A、B,在使用union将这2个区域融合到一起之后,A、B的颜色会统一变为1种颜色。

 

而concat_obj是将两个区域组合到一起。

2、scale_image 功能:为一个图像的灰度值分级

scale_image(Image : ImageScaled : Mult, Add : )缩放图像的灰度值。

图像之前的任何一个灰度值 * Mult + Add = 拉伸后的灰度值

3、提取目标的轮廓常用函数有:boundary 和 gen_contour_region_xld

boundary (RegionAffine, RegionBorder, 'inner') //获取区域的边界

gen_contour_region_xld (RegionBorder, Contours, 'border')//从区域Regions生成XLD轮廓

gen_region_contour_xld (SmoothedContours, Region2, 'filled')//使用xld创建一个region区域

4、select_obj从一个目标元组中选择一个目标

    for Index1 := 1 to Number3 by 1 //Tuple数组索引是从0开始。但是,select_obj是从1开始的。 
      select_obj (ConnectedRegions7, ObjectSelected5, Index1)//从一个目标元组中选择目标

5、

reduce_domain (ImageAffine, RegionDifference, ImageEdge123) //获取新的标记区域,新的区域是由旧的区域与第2个参数相交所得

6、

tuple_max2 (Length11, Length21, Max21)  //比较两个数组的对应元素,取每个大值放于结果中

7、

texture_laws

纹理分析是图像处理中的一种典型任务,texture_laws是Halcon中纹理分析的重要算子,其本质原理是利用不同的kernel与图像进行卷积运算,提取出图像的高频部分或低频部分。

纹理(texture)由纹理单元(texel)组成,纹理单元是纹理图像中最小的重复单元,texel是纹理的基本单元。

 

纹理分析的第一种典型应用是利用纹理滤波器对图像进行滤波处理,以增强(enhance)或抑制(suppress)特定的纹理。滤波后的图像通过blob analysis或者分类算法,将具有相同纹理的部分分割为同一区域(region)。

第二种典型应用是计算图像的纹理特征用于图像的分类,纹理滤波器作为预处理滤波器来增强(enhance)或抑制(suppress)特定的纹理。Halcon中标准的纹理特征(feature)算子是gen_cooc_matrix(生成共生矩阵),另一个常用的算子是entropy_gray(灰度熵,用于计算图像的平均信息量(entropy)和各向异性(anisotropy))。

 

texture_laws算子的语法如下:

texture_laws(Image : ImageTexture : FilterTypes, Shift, FilterSize : )

Image:原始图像

ImageTexture:经过纹理滤波器滤波后的图像

FilterTypes:滤波器的类型

Shaft:滤波后图像的灰度缩放系数,具体实现公式未知,实际使用过程中降低了滤波后图像的灰度,使得使用不同滤波器类型的滤波后图像具有可比性

FilterSize:滤波器尺寸,可选3,5,7

滤波器类型由滤波向量(vector)的两个字母组成,第一个字母表示在列方向的滤波器向量,第二个字母表示在行方向的滤波器向量。处理过程中,先对图像的一个方向进行滤波(具体从列方向还是行方向开始未知),再对图像的另一个方向进行滤波。

 

以3x3的滤波器矩阵为例:

l = [  1 2  1 ],

e = [ -1 0  1 ],

s = [ -1 2 -1 ]

滤波向量l增强滤波方向的图像的亮度。滤波向量e检测了滤波方向上的突变(即边缘,高频区域)。滤波向量s同样检测了滤波方向上的突变(与滤波向量e检测方法不一样)。滤波后图像很容易溢出(这不是个准确说法,实际意义是对于byte类型的图像,灰度值超过了255),因此需设置合适的shaft值缩放灰度值。

 

一般来说,可以选择滤波向量中的 "l", "e", "s", "r", "w", "o"与滤波向量"l"组合来增强图像的低频部分,或者与滤波向量"o"组合来增强图像的高频部分。

滤波器类型的第二个字母"l", "e", "s", "r", "w", "o"依次检测图像低频部分到高频部分。例如,滤波器"le"检测图像 中相对低频的部分,而滤波器"ls"检测图像中相对高频的部分。

8、

segment_contours_xld( Contours: ContoursSplit : Mode, SmoothCont, MaxLineDist1, MaxLineDist2 : )

 

 

函数作用:

分割XLD轮廓成线段、圆弧或椭圆弧形

 

参数列表:

Contours(in):被分割的轮廓

ContoursSplit(in):分割后的轮廓

Mode(in):分割轮廓的类型

SmoothCont(in):用于平滑轮廓的点个数

MaxLineDist1(in):一次迭代中轮廓与其最逼近线之间的最大距离

MaxLineDist2(in):二次迭代中轮廓与其最逼近线之间的最大距离

9、

get_contour_xld (SelectedXLD2, Row4, Col1)//返回XLD轮廓(contour)的坐标

 

********获取轮廓SelectedXLD2的上下两端点Y********
get_contour_xld (SelectedXLD2, Row4, Col1)//返回XLD轮廓(contour)的坐标
tuple_min (Row4, MinY) //找Row4的最小值赋给Min1,左边缘顶点y坐标
tuple_max (Row4, MaxY) //找Row4的最大值赋给MaxY,左边缘底部y坐标

*************************************************************

10、

 gen_region_points( : Region : Rows, Columns : ) gen_region_points创建一个由多个像素描述的区域。

11、

    intersection(RegionDilation1, edge_regionLeft1, RegionIntersection1)//取出两个区域中重叠的部分

*************************

如果RegionDilation1和edge_regionLeft1中的一个为实体的矩形区域,另一个为黑色矩形边界,那么交集就是矩形区域内的2条水平线。

* 切边缘区域 
    intersection(RegionDilation1, edge_regionLeft1, RegionIntersection1)//取出两个区域中重叠的部分
    reduce_domain(image, RegionIntersection1, ImageReduced) //取出实际图像的边缘区域ImageReduced

********************************

12、

 *根据局域平均标准偏差分析将图像二值化
   var_threshold(ImageReduced, Region1, 15, 15, AutoThresholdValue, LRpara[11], 'dark')
13、

sub_image和difference的区别(都是相减操作35)

 

 

difference是计算两个区域的区别,参数必须是region,如果注意到一个区域都是一个灰度值的,那么这里的所谓difference其实就是在检查它们在形状上有什么差别,而sub_image是灰度值的相减,所以和形状没有多大关系,主要是看看两幅图像的区别在哪里。



difference的使用很简单,直接两个区域相减就是了。但是sub_image还多了两个参数

sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : )

给一个Mult的原因主要是可能两幅图像的灰度值比较接近,相减之后的结果灰度值都很小,图像看起来很暗,乘上同一个系数之后灰度值整体就提高了,且越大的灰度值提高的越明显,所以会增加图像的对比度。

Add的作用其实也是差不多,只不过这个不能增加对比度,只能把图像灰度值整体同样的幅度,也就是让图像整体变亮一些。

14、

*计算区域到区域的最小距离及相应的坐标
distance_rr_min(RegionLines,RegionLine3,MinDistance, Row11, Column11, Row2, Column2)
15、

GapParaL := []
for i:=0 to 3 by 1 //用para[0-3]给GapParaL[0-3]赋值
    tuple_concat( GapParaL,para[i], GapParaL)//将参数1、2连接为新的数组
endfor

16、

膨胀运算在数字形态中的作用是把图像周围的背景点合并到物体中。如果两个物体之间距离比较近,那么膨胀运算可能会使这两个物体连接在一起。膨胀对填补图像分割后物体中的空洞很有用。  

 dilation1(Region, StructElement:RegionDilation:Iterations:)    

功能:    使用用户自定义的结构元素对区域进行膨胀。结果元素是一个区域region,可由这些算子区域产生:gen_circle, gen_rectangle1, gen_rectangle2, gen_ellipse, draw_region, draw_region_polygon, gen_region_points等。    

参数:    

Region(输入参数):输入区域             

StructElement(输入参数):结构元素(区域)            

RegionDilation(输出参数):膨胀后的区域            

Iterations(输入参数):迭代次数
 

17、

paint_region(RegionImage : ImageResult : GrayvalType : )

以灰度值Grayval,填充Image 图像的Region区域,填充后的输出图像为ImageResult

参数列表:
Region(in):绘入图像内的区域

Image(in):包含绘入区域的图像
ImageResult(out):结果图像

Grayval(in):期望的区域灰度值

Type(in):所绘区域类型,如填充"fill"或边界"margin"

注意:"fill":是指在区域边界的内部填充;"margin":是指对区域的边界进行填充,就是给边界填充一种颜色。

18、

*SelectedRegions3:图像image的SelectedRegions2区域中,灰度平均值在125-255的区域
select_gray (SelectedRegions2, image, SelectedRegions3, 'mean', 'and', 125, 255) //根据灰度值的特点来选择区域

19、

tuple_select_range( : : TupleLeftindexRightindex : Selected)从Tuple元组中选择索引从LeftindexRightindex 的值,到Selected中。

20、union_adjacent_contours_xld将端点距离很近的轮廓连接起

 

22、area_center_xld(XLD:::Area,row,column,pointOrder)计算xld的面积以及中心位置

23、拟合操作(fit_***_contour_xld)  把不完整的形状拟合完整

fit_line_contour_xld:拟合直线

24、 intersection_lines两条直线的交集

25、gen_contour_polygon_xld( : Contour : RowCol : )

创建不带圆角的多边形轮廓,坐标同样可以使用数组的形式指定

Row:y坐标数组,Col :x坐标数组

26、orientation_points_xld(XLD : : : Phi)  计算点云的轮廓或者多边形轮廓XLD 的方向

       orientation_region(Regions : : : Phi)  计算区域Regions 的方向

27、vector_angle_to_rigid( : : Row1Column1Angle1Row2Column2Angle2 :HomMat2D)根据矩阵计算点与点之间的变换关系,计算点和角度到另一个点和角度的仿射矩阵。

先将图像旋转,旋转角度为(Angle2 - Angle1) (逆时针为正),旋转中心坐标是(Row1, Column1)。再将原图的点(Row1, Column1)一一对应移到点 (Row2, Column2)上,移动的row和column方向的位移分别是( Row2 - Row1)、( Column2 - Column1)

28、affine_trans_contour_xld(Contours : ContoursAffinTrans : HomMat2D : )使用仿射矩阵HomMat2D 对轮廓Contours 进行放射变换,输出轮廓为ContoursAffinTrans 

29、compare_obj(Objects1Objects2 : : Epsilon : IsEqual)

Epsilon (input_control)  number → (real / integer)

Maximum allowed difference between two gray values or coordinates etc.

Default value: 0.0

List of values: 0.0, 1.e-5

30、intersection_contours_xld计算2个轮廓的交点

31、sort_region(Regions : SortedRegions : SortModeOrderRowOrCol : )。对Regions 区域进行排序。

SortMode:排序方式。'upper_left' 外接矩形的左上角点

Order:升序(true)/降序(false)。

RowOrCol :按照行/列排序。

32、shape_trans(Region : RegionTrans : Type : ) 不规则区域的转换

Type值如下:

33、region_features(Regions : : Features : Value) 计算区域的特征Features 的值Value

34、fill_up(Region : RegionFillUp : : )  填充区域Region 中的孔洞

35、

36、

gen_region_points (Region, Row, Column) 有坐标( Row, Column)生成一个点区域Region

gen_cross_contour_xld (Cross, Row, Column, 60, 0.785398) 在点( Row, Column)处画一个叉

 

 

gen_region_line(RegionLine1, row1_start, col1_start, row1_end, col1_end) 生成一条线
gen_region_line (RegionLines2, row2_start, col2_start, row2_end, col2_end)
dev_display (RegionLine1) 显示这条线
dev_display (RegionLines2)
intersection_lines (row1_start, col1_start, row1_end, col1_end, row2_start, col2_start, row2_end, col2_end, Row, Column, IsOverlapping) 由坐标生成的2条线的交叉点( Row, Column)

 

 

 

 

 

 

 


 

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Halcon中,算子的创建和调用可以通过以下步骤进行: 1. 首先,需要读入摄像机的内参和外参,可以使用`read_cam_par`和`read_pose`函数来实现。\[1\] 2. 接下来,可以使用`create_planar_calib_deformable_model()`或`create_planar_uncalib_deformable_model()`函数来创建模板。\[1\] 3. 然后,可以使用`find_planar_calib_deformable_model()`或`find_planar_uncalib_deformable_model()`函数来寻找模板。\[1\] 4. 最后,可以使用`clear_deformable_model()`函数来释放模板。\[1\] 此外,还可以使用其他函数来进行算子的创建和调用,例如`p_determine_ellipse_contours`函数用于确定椭圆轮廓。\[2\] 在程序的开头和结尾,可以使用`dev_update_window('off')`、`dev_update_pc('off')`和`dev_update_var('off')`函数来控制图像对象、程序计数器和变量窗口的更新。这些函数可以用于减少程序的运行时间。\[3\] 总结起来,Halcon中的算子创建和调用可以通过读入摄像机内参和外参,创建模板,寻找模板,释放模板等步骤来完成。同时,可以使用`dev_update_window`、`dev_update_pc`和`dev_update_var`函数来控制图像对象、程序计数器和变量窗口的更新。 #### 引用[.reference_title] - *1* *2* *3* [Halcon算子解释](https://blog.csdn.net/qq_60609496/article/details/126180976)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值