3. 图像基础操作
在 HALCON 中,图像不是普通数组,而是一个带有域(Domain)和多种通道类型的对象。域决定了哪些像素参与运算,通道类型决定了像素值的解释方式。理解这一点,是掌握后续所有图像处理算子的前提。本节围绕五个基础操作展开:读取与显示、像素访问、类型转换、颜色空间转换、ROI 定义与裁剪。
图像读取与显示
HALCON 读取图像的核心算子有两个:read_image 用于从文件加载,read_sequence 用于批量读取序列。读取后得到的图像对象包含三部分信息:像素矩阵、域区域、通道数。显示则通过 dev_display 完成,但在此之前通常需要 dev_open_window 创建窗口,并用 dev_set_part 设定显示区域。
read_image (Image, 'particle.png')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
这里有一个容易被忽略的细节:dev_display 显示的是图像当前域内的像素。如果图像经过阈值分割后域被缩小,再次显示时只会看到域内部分。若想恢复完整显示,需要先用 get_domain 获取域,再用 reduce_domain 或 full_domain 还原。显示窗口的坐标原点在左上角,x 轴向右,y 轴向下,这与数学坐标系不同,后续所有坐标参数都遵循这一约定。
像素访问
HALCON 不鼓励逐像素循环,因为那样会丧失并行优化能力。但在需要精确控制时,仍可通过 get_grayval 和 set_grayval 访问单个像素。更高效的方式是使用 get_image_pointer1 获取指针后直接操作内存,但这属于进阶用法。
get_grayval (Image, 100, 200, Grayval)
set_grayval (Image, 100, 200, 255)
对于区域内的批量像素统计,应使用 min_max_gray、intensity、gray_histo 等算子。例如 intensity (Region, Image, Mean, Deviation) 可一次性得到区域内均值和偏差。像素值的范围取决于图像类型:byte 类型为 0~255,uint2 为 0~65535,real 为浮点数。访问前必须确认类型,否则会得到截断或溢出的错误结果。
图像类型转换
HALCON 支持 byte、uint2、int4、real、complex 等类型。类型转换算子以 convert_image_type 为核心,配合 scale_image 可完成线性映射。例如将 uint2 转为 byte 时,若直接转换,大于 255 的值会被截断为 255,丢失高灰度信息。正确做法是先缩放:
convert_image_type (ImageUint2, ImageReal, 'real')
scale_image (ImageReal, ImageScaled, 255.0/65535.0, 0)
convert_image_type (ImageScaled, ImageByte, 'byte')
反向转换(byte 到 uint2)通常不需要缩放,直接转换即可。real 类型转 byte 时,HALCON 默认执行截断,若希望四舍五入,需先用 round 或 floor 处理。类型转换的另一个常见场景是 convert_image_type 配合 scale_image 做对比度拉伸,把窄灰度范围映射到 0~255,便于显示和后续分割。
颜色空间转换
彩色图像默认以 RGB 三通道存储。但 RGB 通道间相关性高,直接做阈值分割往往不稳定。HALCON 提供 trans_from_rgb 将 RGB 转换为 HSV、HLS、YUV、CIELab 等颜色空间。其中 HSV 的 H 通道表示色调,对光照变化不敏感,适合颜色分割。
decompose3 (ImageRGB, R, G, B)
trans_from_rgb (R, G, B, H, S, V, 'hsv')
threshold (H, Region, 0.1, 0.2)
注意 trans_from_rgb 的输出范围:H 为 0~2π 或 0~255(取决于参数),S 和 V 为 0~1 或 0~255。使用前应查阅算子文档确认量纲。若只需单通道,可用 access_channel 直接提取,避免不必要的转换开销。
ROI 定义与裁剪
ROI(感兴趣区域)是 HALCON 高效处理的关键。定义 ROI 的方式有三类:几何形状(gen_rectangle1、gen_circle)、交互绘制(draw_rectangle1)、从图像生成(threshold 后取区域)。定义后通过 reduce_domain 将图像域限制在 ROI 内,后续算子只处理域内像素。
gen_rectangle1 (ROI, 100, 100, 300, 400)
reduce_domain (Image, ROI, ImageReduced)
crop_domain (ImageReduced, ImageCropped)
reduce_domain 与 crop_domain 的区别在于:前者保留原图尺寸,仅缩小域;后者将域外部分裁掉,输出图像尺寸等于 ROI 的外接矩形。若后续需要保持坐标一致性,用 reduce_domain;若只需 ROI 内容且希望减小内存,用 crop_domain。裁剪后图像的坐标原点会平移到 ROI 左上角,这一点在测量应用中必须注意。
reduce_domain 限定原图。这样既利用了颜色空间的稳定性,又保留了原图的完整坐标信息。crop_domain 后,图像坐标原点发生变化。若后续测量结果需要映射回原图坐标,必须加上 ROI 左上角的偏移量。这是初学者最容易出错的地方之一。掌握这五类操作后,就可以进入更复杂的图像处理流程。建议在练习时用同一张图像依次执行读取、显示、类型转换、颜色空间转换和 ROI 裁剪,观察每一步输出图像的类型、尺寸和域的变化,建立对 HALCON 图像对象的直观认识。