Halcon一维函数的使用之select_shape

本文详细介绍了select_shape函数在图像处理中的应用,包括circularity、compactness、contlength、convexity、rectangularity和elliptic_axis等多个特征选择算子。这些算子通过计算区域的形状特性,如圆形度、紧凑度、轮廓长度等,帮助筛选和分析图像中的特定区域。示例代码展示了如何使用这些算子,并解释了它们的计算原理和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

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(&reg);
	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))。 如果传递了多个区域,则轮廓长度的数值存储在元组中,元组中值的位置对应于输入元组中区域的位置。

### 2.5.3 example

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)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值