17.1 图像对象

通过使用图像对象,HALCON 提供了一个抽象数据模型,其涵盖的范围远远超过简单的图像数组。

基本上,有两种不同类型的图像对象:

区域由图像平面上的一组坐标值组成。区域不需要连接,可以包括 "洞"。它们甚至可以比图像格式更大。在内部,区域以所谓的游程编码存储。

图像至少由一个图像数组和一个区域(即所谓的域)组成。域表示被 "定义" 的像素(即处理灰度值的 HALCON 算子只能访问该区域内的像素)。但 HALCON 也支持多通道图像: 图像可以由(几乎)任意数量的通道组成。因此,图像坐标并不一定用一个灰度值来表示,而是用最多 n 个灰度值的向量来表示(如果坐标位于图像区域内)。这可以形象地理解为图像数组的 "栈",而不是单一的数组。RGB 或体素图像(voxel-images)也可以这样表示。

HALCON 提供用于区域转换的算子(其中包括大量形态学算子)以及用于灰度值转换的算子。分割算子是从图像(灰度值)到区域的转换。

HALCON/C 为图像对象(包括图像和区域)提供了数据类型 Hobject。事实上,Hobject 是包含所有图像对象的 HALCON 数据库的代理。输入的图像对象像往常一样通过值传递给 HALCON 算子,输出的图像对象通过引用传递,使用 & 操作符。Hobject 类型的变量可以是单个图像对象,也可以是图像对象的元组。单个对象被视为长度为 1 的元组。

当然,用户也可以访问对象元组中的特定对象。为此,必须使用算子 obj_to_integercopy_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 )允许使用以下特定图像对象作为输入参数:

NO_OBJECTS:  
图像对象的空元组。
EMPTY_REGION:  
图像对象的空白区域(area = 0)。
FULL_REGION:  
具有最大区域的图像对象。

HALCON 算子也可以返回这些对象。