select_shape
前言
select_shape函数的功能分析,此函数经常会用到,可以借助其图像形状的特征来选择区域,得到想要的图像区域。
1、select_shape (Operator)
select_shape — 借助形状特征选择区域 ## 1.1 函数原型select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : )
//参数
Regions (input_object) region-array → objec
//要检查的区域
SelectedRegions (output_object) region-array → object
//满足条件的区域
Features (input_control) string(-array) → (string)
//选择筛选的形状特征。
/*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) string → (string)
//单个特征的链接类型
//Default value: 'and'
//List of values: 'and', 'or'
Min (input_control) real(-array) → (real / integer / string)
//Lower limits of the features or 'min'.
//Default value: 150.0
//Typical range of values: 0.0 ≤ Min ≤ 99999.0
//Minimum increment: 0.001
//Recommended increment: 1.0
Max (input_control) real(-array) → (real / integer / string)
//Upper limits of the features or 'max'.
//Default value: 99999.0
//Typical range of values: 0.0 ≤ Max ≤ 99999.0
//Minimum increment: 0.001
//Recommended increment: 1.0
//Restriction: Max >= Min
2、Possible values for Features
运算符 select_shape 根据形状选择区域。 对于来自 Regions 的每个输入区域,计算指示的特征(Features)。 如果每个 (Operation = 'and') 或至少一个 (Operation = 'or') 计算出的特征在默认限制 (Min,Max) 内,则该区域将适应输出(duplicated)。条件:
2.1 常用的特征选择一
‘area’ : Area of the object
‘row’ : 中心的行索引
’column’: 中心列的索引
’width’: 区域宽度
’height’: 区域高度
’row1’: 左上角的行索引
’column1’: Column index of upper left corner
’row2’: Row index of lower right corner
’column2’: Column index of lower right corner
2.2 常用的特征选择——circularity (Operator)
circularity — 区域圆形度(类似于圆形)的形状因子。
2.2.1 函数原型
circularity(Regions : : : Circularity)
//参数
Regions (input_object) region(-array) → object
//Region(s) to be examined.
Circularity (output_control) real(-array) → (real)
//Circularity of the input region(s).
//Assertion: (0 <= Circularity) && (Circularity <= 1.0)
2.2.2 解析
operator circularity计算输入区域与圆形的相似度。
计算:
如果 F 是区域的面积,max 是中心到所有轮廓像素的最大距离,则形状因子 C 定义为:
C = min(1,C’)
圆的形状因子 C 为 1。如果区域很长或有孔,则 C 小于 1。算子圆度对大的凸起、孔和未连接的区域特别敏感。 C 的值被剪裁为 1.0,因为一个区域的像素面积只能是一个真实圆的面积的近似值。 小区域的近似误差大于大区域的近似误差。
在空区域的情况下,运算符循环返回值 0(如果没有设置其他行为(请参阅 set_system))。 如果传递了多个区域,则形状因子的数值存储在一个元组中,元组中值的位置对应于该区域在输入元组中的位置。
2.2.3 Example
* Comparison between shape factors of rectangle, circle and ellipse:
gen_rectangle1(R1,10,10,20,20)
gen_rectangle2(R2,100,100,0.0,100,20)
gen_ellipse(E100,200,200,0.0,200,20)
gen_circle(C,300,300,20)
circularity(R1,M_R1)
circularity(R2,M_R2)
circularity(E100,M_E)
circularity(C,M_C)
2.3 常用的特征选择——compactness (Operator)
compactness — Shape factor for the compactness of a region.
2.3.1 函数原型
compactness(Regions : : : Compactness)
//参数
Regions (input_object) region(-array) → object
//Region(s) to be examined.
Compactness (output_control) real(-array) → (real)
//输入区域的紧凑性
//Assertion: (Compactness >= 1.0) || (Compactness == 0)
2.3.2 解析
operator compactness计算输入区域的紧密度。
计算:
如果 L 是轮廓的长度(参见 contlength),F 是区域的面积,则形状因子 C 定义为:
C = max(1,C’)
圆的形状因子 C 为 1。如果区域很长或有孔,则 C 大于 1。算子的紧致度与轮廓(粗糙度)和孔的路线有关。 C 的值被剪裁为 1.0,因为一个区域的像素面积只能是一个真实圆的面积的近似值。 小区域的近似误差大于大区域的近似误差。
在空区域的情况下,如果没有设置其他行为,则运算符紧凑性返回值 0(请参阅 set_system)。 如果传递了多个区域,则形状因子的数值存储在一个元组中,元组中值的位置对应于该区域在输入元组中的位置。
2.4 常用的特征选择——contlength (Operator)
contlength — 区域的轮廓长度。
2.4.1 函数原型
contlength(Regions : : : ContLength)
//参数
Regions (input_object) //Region(s) to be examined.
ContLength (output_control) //Contour length of the input region(s).
//Assertion: ContLength >= 0
2.4.2 解析
运算符 contlength 计算 Regions 的每个区域的轮廓总长度(该区域的所有连接分量的总和)。 平行于坐标轴的两个相邻轮廓点之间的距离为 1,对角线上的距离为 √2。 如果传递了多个区域,则轮廓长度的数值存储在元组中,元组中值的位置对应于输入元组中区域的位置。 在空区域的情况下,运算符 contlength 返回值 0。
2.4.3 example(C++)
#include "HalconCpp.h"
#include <iostream>
using namespace HalconCpp;
int main(int argc, char *argv[])
{
HWindow w(10, 10, 512, 512);
HRegion reg;
int NumOfElements = 3;
std::cout << "Draw " << NumOfElements << " regions " << std::endl;
GenEmptyObj(®);
for (int i = 0; i < NumOfElements; i++)
{
reg = reg.ConcatObj(w.DrawRegion());
}
HTuple circ = reg.Circularity();
HTuple cont = reg.Contlength();
for (int i = 0; i < NumOfElements; i++)
{
std::cout << "region " << i + 1 << ": \tcircularity = " << circ[i].D() <<
"\tcontour length =" << cont[i].D() << std::endl;
}
std::cout << "Click into the graphics window to end." << std::endl;
w.Click();
return(0);
}
2.5 常用的特征选择——convexity (Operator)
convexity — 区域凸度的形状因子
2.5.1 函数原型
convexity(Regions : : : Convexity)
Regions (input_object) //Region(s) to be examined.
Convexity (output_control) //Convexity of the input region(s).
//Assertion: Convexity <= 1
2.5.2 解析
The operator convexity计算 Regions 的每个输入区域的凸度。
计算:
如果 Fc 是凸包的面积,Fo 是区域的原始面积,则形状因子 C 定义为:
如果区域是凸的(例如,矩形、圆形等),则形状因子 C 为 1。 如果有压痕或孔 C 小于 1。
在空区域的情况下,算子凸性返回值 0(如果没有设置其他行为(请参阅 set_system))。 如果传递了多个区域,则轮廓长度的数值存储在元组中,元组中值的位置对应于输入元组中区域的位置。
read_image (Image, 'fabrik')
dev_set_colored (6)
dev_set_draw ('fill')
regiongrowing (Image, Regions, 1, 1, 3, 100)
convexity (Regions, Convexity)
* Simulate the shape feature
dev_set_color ('black')
dev_set_draw ('margin')
shape_trans (Regions, ConvexRegions, 'convex')
area_center (ConvexRegions, AreaConvex, Row, Column)
area_center (Regions, Area, Row1, Column1)
Convexity2 := real(Area) / AreaConvex
2.6 常用的特征选择——rectangularity (Operator)
rectangularity - 区域矩形的形状因子
2.6.1 函数原型
rectangularity(Regions : : : Rectangularity)
//参数
Regions (input_object) //Region(s) to be examined.
Rectangularity (output_control)
//Rectangularity of the input region(s).
//Assertion: (0 <= Rectangularity) && (Rectangularity <= 1.0)
2.6.2 解析
The operator rectangularity计算输入区域的矩形度。
为了确定矩形度,首先计算一个与输入区域具有相同一阶和二阶矩的矩形。 矩形度量的计算最终基于计算出的矩形与输入区域之间的差值的面积,相对于矩形的面积进行归一化。
对于矩形,rectangularity 返回值 1。输入区域与完美矩形的偏差越大,Rectangularity 的返回值就越小。
在空区域的情况下,操作符矩形返回值 0(如果没有设置其他行为(请参阅 set_system))。 如果传递了多个区域,则矩形的数值存储在一个元组中,该值在元组中的位置对应于该区域在输入元组中的位置。
2.6.3 example
*
* Example 1
*
dev_close_window ()
dev_open_window (0, 0, 728, 512, 'black', WindowHandle)
read_image (Image, 'die/die_07')
auto_threshold (Image, Regions, 3)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegionsArea, 'area', 'and', 500, 1000)
dev_display (Image)
dev_display (SelectedRegionsArea)
stop ()
select_shape (SelectedRegionsArea, SelectedRegionsRect, 'rectangularity', 'and', 0.75, 1)
dev_display (Image)
dev_display (SelectedRegionsRect)
stop ()
*
* Example 2
*
dev_close_window ()
dev_open_window (0, 0, 1109 / 2, 871 / 2, 'black', WindowHandle)
read_image (Image, 'pcb')
threshold (Image, Region, 0, 100)
erosion_circle (Region, RegionErosion, 11.5)
connection (RegionErosion, ConnectedRegions)
dilation_circle (ConnectedRegions, RegionDilation, 11.5)
dev_display (Image)
dev_display (RegionDilation)
stop ()
select_shape (RegionDilation, SelectedRegionsRect, 'rectangularity', 'and', 0.83, 1)
dev_display (Image)
dev_display (SelectedRegionsRect)
stop ()
这个例子展示了如何计算和使用区域特征矩形。 前两个示例展示了如何使用 select_shape 从区域数组中选择矩形区域。 在第三个示例中,矩形度量用于根据矩形度对随机创建的区域进行排序。 矩形度最高的区域显示在图像的左上角。 图像底部显示的区域显示最低的矩形度。
*
* Example 3
*
Dist := 60
dev_close_window ()
dev_open_window (0, 0, Dist * 27 / 3, Dist * 27 / 3, 'black', WindowHandle)
create_rand_regions (RegionsRand)
rectangularity (RegionsRand, Rectangularity)
Indices := sort_index(Rectangularity)
IndicesDesc := inverse(Indices)
gen_image_const (ImageRegions, 'byte', Dist * 27, Dist * 27)
dev_update_window ('off')
dev_update_pc ('off')
for I := 0 to |IndicesDesc| - 1 by 1
select_obj (RegionsRand, RegionSorted, IndicesDesc[I] + 1)
move_region (RegionSorted, RegionSortedMoved, (I / 26) * Dist + Dist, (I % 26) * Dist + Dist)
overpaint_region (ImageRegions, RegionSortedMoved, 255, 'fill')
Rect := Rectangularity[IndicesDesc[I]]
endfor
dev_display (ImageRegions)
MaxRectangularity := max(Rectangularity)
MinRectangularity := min(Rectangularity)
set_system ('clip_region', 'true')
2.7 常用的特征选择——elliptic_axis (Operator)
elliptic_axis — 计算等效椭圆的参数
2.7.1 函数原型
elliptic_axis(Regions : : : Ra, Rb, Phi)
//参数
Regions (input_object) //Input regions
Ra (output_control) //Main radius (normalized to the area).
//Assertion: Ra >= 0.0
Rb (output_control) //Secondary radius (normalized to the area).
//Assertion: (Rb >= 0.0) && (Rb <= Ra)
Phi (output_control) //Angle between main radius and x-axis in radians.
//Assertion: ((- pi / 2) < Phi) && (Phi <= (pi / 2))
2.7.2 解析
算子 elliptic_axis 计算与 Regions 中的输入区域具有相同方向和相同纵横比的椭圆的半径 Ra 和 Rb 以及方向 Phi。 多个输入区域可以作为元组传递。 Ra 表示椭圆的主半径,而半径 Rb 表示椭圆的次半径。 主轴相对于 x 轴的方向以 Phi 返回,以弧度表示。 椭圆的主轴相当于输入区域的惯性矩的主轴。
计算:
如果将矩 M20 、 M02 和 M11 归一化并传递到该区域(请参阅 moment_region_2nd),则半径 Ra 和 Rb 计算如下:
方向 Phi 定义为:
如果传递了多个区域,则结果存储在元组中。 结果元组元素的索引对应于相应输入区域的索引。
如果传递了一个空区域,并且没有设置其他行为(请参阅 set_system(‘no_object_result’,)),则所有参数的值都为 0.0。
2.7.3 example
read_image (Image, 'fabrik')
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowID)
dev_set_color ('white')
dev_set_draw ('fill')
regiongrowing (Image, Regions, 1, 1, 3, 400)
elliptic_axis (Regions, Ra, Rb, Phi)
area_center (Regions, Area, Row, Column)
dev_set_draw ('margin')
dev_set_colored (6)
disp_ellipse (WindowID, Row, Column, Phi, Ra, Rb)