1.domain是什么
在halcon中,ROI(Region Of Interest)被称为图像的域(domain)(参考《solution_guide_i.pdf》)。这个术语来自数学中的定义域,而图像就是函数,本函数负责将坐标映射到像素值,即f(x) = gray这样子(=。=),那么这个domain就是x的范围,即定义了图像中感兴趣的部分区域(这样理解了吧)。
将region和图像结合的操作符是reduce_domain
,即将原始图中定义域包含的部分保留下来。
2.domain操作
原图像为:printer_chip/printer_chip_01
2.1 get_domain
对原始图像进行操作,返回的domain(即定义域)是整幅图像:
read_image (Image, 'printer_chip/printer_chip_01')
get_domain (Image, Domain)
可以看到,此时的domain的类型为region:
2.2 reduce_domain
即将图像缩减到给定的定义域中,这里创建一个ROI感兴趣区,然后将图像定义域缩减到感兴趣区内:
gen_rectangle1 (ROI_0, 372.795, 866.854, 763.002, 1020.81)
reduce_domain (Image, ROI_0, ImageReduced)
可以看到ImageReduced还是图像类型,大小和原始图像也一样,且能看到这个图像中包含了Region:
2.3 complement
求ROI即Region的补集,这个在某些情况下还是挺有用的:
complement (ROI_0, RegionComplement)
2.4 crop_domain
裁切图像,注意此处的图像大小变为了domain定义的最小外接矩形:
crop_domain (ImageReduced, ImagePart)
2.5 change_domain
修改图像的定义域,注意不要超出图像范围。
下面代码中ImageReduced已经是之前定义域的图像,可直接在此基础上直接修改定义域而不需要访问原图像。
gen_circle (ROI_0, 620.11, 459.981, 189.338)
change_domain (ImageReduced, ROI_0, ImageNew)
2.6 full_domain
扩展当前定义域到最大范围,不需要多解释。
full_domain (ImageNew,ImageFull)
get_domain (ExpandedImage, Domain1)
2.7 expand_domain_gray
扩展定义域的范围,且将边界像素的灰度值复制到域的外部。HALCON中的所有滤波器根据滤波器宽度使用域外像素的灰度值。这可能会在域的边界区域产生不良的副作用。例如,如果图像的前景(域)和背景在亮度上有很大差异,滤波器操作的结果可能会导致域的边界出现不希望的变暗或变亮。
expand_domain_gray (ImageReduced, ExpandedImage, 200)
2.8 difference
计算两个Region的不同,只保留交集
3.Region
实际上,Domain定义的区域就是Region,halcon中没有类型Domain,只有Region,Domain只在接口上和数学定义上出现。比如上面的ROI定义,通过get_domain后拿到的就是region。
- halcon使用“行程编码”方式描述所有的区域,即第几行从哪一列到哪一列这样描述region。
- region都是像素级的!
- region的产生一般是通过阈值分割或形态学操作等产生的。
3.1 threshold
分割图像即可得到Region,只有一个region,包含各个独立的闭合区域,可以用connection连接为不同的多个region。
下面的操作中,ImageReduced2是只保留分割后Region的图像。
threshold (Image, Region, 128, 255)
reduce_domain (Image, Region, ImageReduced2)
3.2 get_region_points
这个接口很有用,可以拿到region中定义的坐标序列,在某些对像素进行批量操作时很好用。
get_region_points (Region, Rows, Columns)
3.3 get_region_contour
获取region边界的行列数组,忽略区域的孔。只能传递一个区域,并且此区域必须正好有一个连接组件。
3.4 gen_xx
gen_checker_region:创建棋盘region。
gen_circle( : Circle : Row, Column, Radius : ):创建圆形region,经过reduce_domain之后如图:
gen_circle_sector:创建扇形圆
gen_ellipse:创建椭圆region
gen_empty_region:创建一个空的region,可以初始化一个空region来用于后面的循环region操作。
gen_rectangle1:创建一个和坐标轴平行的矩形
gen_rectangle2:创建一个指定朝向的矩形
gen_region_contour_xld:根据xld亚像素轮廓来创建region,注意会将边界的小数转变为整数。
gen_region_points:通过一些点来创建region
gen_region_histo:创建灰度统计直方图:
3.5 Regions/Features
- rea_center(Regions : : : Area, Row, Column):计算区域regions的面积及中心
- area_holes(Regions : : : Area),运算符area_holes计算输入区域中孔的面积。区域定义为孔中包含的像素数。如果一个区域有多个孔,则返回该区域中所有孔的面积之和。
- select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : ):根据特征筛选region,和特征直方图搭配使用。
- circularity(Regions : : : Circularity):区域的圆度,越接近圆,圆度接近1。
其他直接参考帮助文档。
(紧凑度compactness、边缘长度contlength、凸性convexity、矩形行rectangularity、椭圆主矩ra、椭圆次矩rb、椭圆朝向phi、各向异性测量::(椭圆的长轴和短轴之比)、蓬松度bulkiness、结构系数struct_factor、最小外接圆半径outer_radius、最大内接圆半径inner_radius、最大内接轴平行矩形的宽度inner_width/inner_height、区域边界到中心的平均距离dist_mean、区域边界到中心的距离偏差dist_deviation、圆度Roundness、多边形边数num_sides、连接组件数量connect_num、洞数量holes_num、洞面积area_holes、区域的最大直径max_diameter、区域朝向orientation、欧拉编号euler_number、最小外接矩形朝向rect2_phi、矩moments_m11/moments_m20…)
3.6 Transformations:
clip_region/clip_region_rel:用一个矩形框大小来裁剪region。
connection:连接输入的region,形成一个一个的子region。例如threshold 之后的图片如图所示,此时分割之后的region只有一个(鼠标点击后整体region被选中):
调用connection后,这种孤立的region会被单独分割出来:
fill_up:填充region中的孔洞。
fill_up_shape:填充输入区域中具有给定形状特征的孔,注意是孔的形状。
partition_dynamic:将输入Region水平分割为宽度约为Distance的区域,如图:
partition_rectangle:将输入Region水平分割为大小约为给定矩形的区域,可以看到下面的0被强行截断:
remove_noise_region:清除region中的噪声点。
shape_trans:将region转换为内接圆、外接矩形等形状。
3.7 Geometric Transformations
affine_trans_region:仿射变换
mirror_region:镜像
move_region:移动
polar_trans_region
polar_trans_region_inv
transpose_region
zoom_region:缩放
3.8 Sets
complement:计算region的互补部分。
difference:计算两个region不同的部分。
intersection:计算两个区域相交的部分
symm_difference:计算两个区域的对称差
union1:合并输入的所有region,输出一个region
union2:只合并输入的两个region