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是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(Region, Image : ImageResult : Grayval, Type : )
以灰度值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( : : Tuple, Leftindex, Rightindex : Selected)从Tuple元组中选择索引从Leftindex到Rightindex 的值,到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 : Row, Col : )
创建不带圆角的多边形轮廓,坐标同样可以使用数组的形式指定
Row:y坐标数组,Col :x坐标数组
26、orientation_points_xld(XLD : : : Phi) 计算点云的轮廓或者多边形轮廓XLD 的方向
orientation_region(Regions : : : Phi) 计算区域Regions 的方向
27、vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 :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(Objects1, Objects2 : : 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 : SortMode, Order, RowOrCol : )。对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)