通过使用图像对象,HALCON 提供了一个抽象数据模型,其涵盖的范围远远超过简单的图像数组。
基本上,有两种不同类型的图像对象:
区域由图像平面上的一组坐标值组成。区域不需要连接,可以包括 "洞"。它们甚至可以比图像格式更大。在内部,区域以所谓的游程编码存储。
图像至少由一个图像数组和一个区域(即所谓的域)组成。域表示被 "定义" 的像素(即处理灰度值的 HALCON 算子只能访问该区域内的像素)。但 HALCON 也支持多通道图像: 图像可以由(几乎)任意数量的通道组成。因此,图像坐标并不一定用一个灰度值来表示,而是用最多 n 个灰度值的向量来表示(如果坐标位于图像区域内)。这可以形象地理解为图像数组的 "栈",而不是单一的数组。RGB 或体素图像(voxel-images)也可以这样表示。
HALCON 提供用于区域转换的算子(其中包括大量形态学算子)以及用于灰度值转换的算子。分割算子是从图像(灰度值)到区域的转换。
HALCON/C 为图像对象(包括图像和区域)提供了数据类型 Hobject。事实上,Hobject 是包含所有图像对象的 HALCON 数据库的代理。输入的图像对象像往常一样通过值传递给 HALCON 算子,输出的图像对象通过引用传递,使用 & 操作符。Hobject 类型的变量可以是单个图像对象,也可以是图像对象的元组。单个对象被视为长度为 1 的元组。
当然,用户也可以访问对象元组中的特定对象。为此,必须使用算子 obj_to_integer 或 copy_obj,首先提取特定对象的键值(转换为整数)。元组中对象的数量可以用 count_obj 查询。要将键(从 obj_to_integer 返回)再次转换为图像对象,必须使用算子 integer_to_obj。请注意,integer_to_obj 会复制图像对象。(这并不一定意味着相应的灰度值数组也会被复制。只要有读取权限,重复引用就足够了)。因此,必须使用 clear_obj 从 HALCON 数据库中明确删除所有提取的对象。图 17.1 节选了一个 C 程序来说明这种方法。
... Hobject objects; /* tuple of image objects */ Hobject obj; /* single image object */ Hlong surrogate; /* object key, converted to integer */ Htuple Tsurrogates; /* tuple of object keys */ Htuple Index,Num; /* temporary tuple for parameter passing */ Hlong i; /* loop variable */ Hlong num; /* number of objects */ ... count_obj(objects, &num); /* variant 1: object key -> control parameter */ create_tuple_i(&Index,1); create_tuple_i(&Num,num); T_obj_to_integer(objects,Index,Num,&Tsurrogates); for (i=0; i<num; i++) { surrogate = get_i(Tsurrogates,i); /* process single object */ } /* variant 2: copying objects individually */ for (i=1; i<=num; i++) { copy_obj(objects,&obj,i,1); /* process single object */ } ...
图 17.1: 访问图像对象元组中的第 i 个图像对象
某些 HALCON 算子(如 difference )允许使用以下特定图像对象作为输入参数:
HALCON 算子也可以返回这些对象。