4. 图像采集与预处理

图像采集与预处理 学习卡片

在Halcon缺陷分类模型训练与评估的完整链路中,图像采集与预处理是决定模型性能上限的基石环节。实际项目中,我们经常遇到算法工程师花费大量时间调优分类网络结构,却忽略了输入图像质量本身的问题——光照不均、噪声干扰、背景冗余、灰度分布偏移等,这些因素往往比模型结构差异更能左右最终的分类准确率。本章将系统讲解从图像读取到预处理完成的完整流程,并给出Halcon环境下的可执行方案。

4.1 核心原理:为什么预处理是缺陷分类的“第一道闸门”

缺陷分类模型(无论是传统机器学习分类器还是深度学习分类网络)本质上是在学习“缺陷特征”与“类别标签”之间的映射关系。如果输入图像中混入了与缺陷无关的变量(如光照变化、传感器噪声、背景纹理),模型就会被迫去拟合这些无关变量,导致泛化能力下降。预处理的根本目的,是将原始采集图像转换为一个标准化、去冗余、特征突出的输入空间,使后续特征提取和分类器训练更加聚焦于缺陷本身。

从信号处理角度看,预处理包含三个层次:

  • 几何与区域层:通过ROI选择去除背景干扰,减少计算量,同时避免背景中的伪缺陷特征误导模型。
  • 像素值映射层:灰度化将多通道信息压缩为单通道亮度信息,降低数据维度;增强则通过直方图均衡、对比度拉伸等手段扩大缺陷与正常区域的灰度差异。
  • 频域与空间滤波层:滤波用于抑制高频噪声(如传感器热噪声)或低频背景起伏(如光照不均),使缺陷的边缘和纹理特征更加清晰。

需要特别强调的是,预处理并非“越复杂越好”。过度滤波可能抹平细微缺陷(如划痕、针孔),过度增强则可能引入伪影。预处理的尺度必须与缺陷的物理尺寸、灰度对比度以及后续分类器的鲁棒性相匹配。

4.2 方法流程:从图像读取到可训练张量的标准管线

在Halcon中,图像采集与预处理通常遵循以下标准流程。我们以一个典型的PCB板表面缺陷检测场景为例,逐步展开。

4.2.1 图像读取与采集接口

Halcon支持从文件、相机接口(GigE Vision、USB3 Vision、GenICam)以及图像采集卡读取图像。对于离线训练,最常用的是文件读取;对于在线推理,则使用相机接口实时抓取。

* 从文件读取图像(支持png、bmp、jpg、tiff等格式)
read_image (Image, 'pcb_sample_01.png')

* 从相机实时采集(以GigE Vision为例)
* open_framegrabber ('GigEVision2', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'Camera1', 'default', -1, -1, AcqHandle)
* grab_image (Image, AcqHandle)

* 获取图像尺寸
get_image_size (Image, Width, Height)

工程建议:在训练阶段,建议将图像统一转换为灰度图或固定通道数的RGB图,并记录原始图像的位深(8位、12位或16位)。Halcon的read_image会自动保留位深信息,但后续处理函数(如阈值分割)默认按8位处理,需注意类型转换。

4.2.2 ROI选择:聚焦缺陷可能出现的区域

ROI选择的核心原则是“只保留包含缺陷信息的像素区域,剔除无关背景”。在PCB检测中,我们通常只关心焊盘、走线、元件引脚等区域,而基板空白区域属于背景。

* 方法一:手动绘制ROI(适用于离线标注阶段)
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
reduce_domain (Image, RectangleROI, ImageReduced)

* 方法二:基于灰度阈值自动分割ROI(适用于背景与前景灰度差异明显的场景)
threshold (Image, Regions, 0, 100)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5000, 999999)
reduce_domain (Image, SelectedRegions, ImageReduced)

* 方法三:基于形状模板匹配定位ROI(适用于产品位置有轻微偏移的场景)
* create_shape_model (ModelImage, 5, -30, 60, 'auto', 'pregeneration', 'use_polarity', 30, 10, ModelID)
* find_shape_model (Image, ModelID, -30, 60, 0.7, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
* vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, HomMat2D)
* affine_trans_region (ROIBase, ROIMoved, HomMat2D, 'nearest_neighbor')
* reduce_domain (Image, ROIMoved, ImageReduced)

ROI选择后,后续所有预处理操作都应在ImageReduced上执行,而不是原始全幅图像。这不仅能大幅降低计算量,还能避免背景区域中的纹理、污渍等干扰特征进入分类器。

4.2.3 灰度化:多通道压缩与信息保留

Halcon中,灰度化通常使用rgb1_to_gray或decompose3后取单通道。但工业场景中,很多相机直接输出单通道灰度图,此时无需转换。若使用彩色相机,灰度化公式为:Gray = 0.299*R + 0.587*G + 0.114*B。

* RGB图像转灰度
rgb1_to_gray (Image, GrayImage)

* 或者提取单个通道(例如B通道,有时对蓝色背景下的缺陷更敏感)
decompose3 (Image, RImage, GImage, BImage)

常见误区:不要盲目丢弃彩色信息。某些缺陷(如化学残留、氧化变色)在特定颜色通道下对比度更高。建议在预处理阶段保留R/G/B三个通道的灰度图,分别评估其缺陷对比度,再决定使用单通道还是多通道融合输入。

4.2.4 滤波:噪声抑制与边缘保持的平衡

滤波是预处理中最需要“拿捏分寸”的环节。Halcon提供了丰富的滤波算子,按功能可分为三类:

滤波类型 典型算子 适用场景 注意事项
平滑去噪 mean_image, gauss_filter, median_image 抑制随机噪声、传感器热噪声 均值和高斯滤波会模糊边缘,中值滤波对椒盐噪声效果好但可能破坏细线缺陷
边缘增强 sobel_amp, laplace, highpass_image 突出划痕、裂纹等边缘型缺陷 增强后噪声也被放大,需配合阈值或形态学处理
背景校正 illuminate, background_seg 消除光照不均、阴影、曲面反光 校正过度会引入灰度反转,需控制校正强度
* 高斯滤波(σ=1.5,平衡去噪与边缘保留)
gauss_filter (ImageReduced, ImageGauss, 1.5)

* 中值滤波(3x3窗口,适合去除孤立噪点)
median_image (ImageReduced, ImageMedian, 'circle', 3, 'mirrored')

* 光照不均校正:使用大尺度高斯背景估计,原图减去背景
gauss_filter (ImageReduced, ImageBackground, 51)
sub_image (ImageReduced, ImageBackground, ImageCorrected, 1, 128)

4.2.5 增强:灰度拉伸与直方图均衡

增强的目标是扩大缺陷与正常区域的灰度差异。Halcon中常用scale_image进行线性灰度拉伸,或equ_histo_image进行直方图均衡化。

* 线性灰度拉伸:将灰度范围从[Min, Max]映射到[0, 255]
min_max_gray (ImageReduced, ImageReduced, 0, MinGray, MaxGray, Range)
scale_image (ImageReduced, ImageScaled, 255.0/(MaxGray-MinGray), -MinGray*255.0/(MaxGray-MinGray))

* 直方图均衡化:自动增强对比度,适用于灰度分布集中的图像
equ_histo_image (ImageReduced, ImageEquHisto)

* 局部对比度增强(CLAHE效果,Halcon中可用tile-based方式实现)
* 将图像分块,每块独立做直方图均衡,再拼接
tile_images_offset (ImageReduced, ImageTiled, 0, 0, -1, -1, -1, -1, Width, Height)
equ_histo_image (ImageTiled, ImageTiledEqu)
crop_part (ImageTiledEqu, ImageCLAHE, 0, 0, Height, Width)

参数选择策略:增强强度并非越大越好。对于深度学习分类模型,建议先做轻度增强(灰度拉伸至[0,255]即可),让网络自行学习特征;对于传统特征+分类器(如SVM),则需更强的对比度拉伸以手工设计特征。可通过gray_histo观察灰度直方图,若缺陷峰与背景峰重叠严重,再考虑增强。

4.3 案例实战:PCB焊点缺陷分类的预处理全流程

我们以“PCB焊点虚焊/正常/桥连”三分类任务为例,完整演示预处理管线。原始图像为500万像素彩色图,焊点区域约占总面积的15%。

* 步骤1:读取图像
read_image (Image, 'pcb_weld_01.png')

* 步骤2:ROI提取——基于焊盘位置模板匹配
create_shape_model (ModelImage, 5, -30, 60, 'auto', 'pregeneration', 'use_polarity', 30, 10, ModelID)
find_shape_model (Image, ModelID, -30, 60, 0.7, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, HomMat2D)
affine_trans_region (ROIBase, ROIMoved, HomMat2D, 'nearest_neighbor')
reduce_domain (Image, ROIMoved, ImageReduced)

* 步骤3:灰度化——提取G通道(绿色光下焊点对比度最高)
decompose3 (ImageReduced, RImage, GImage, BImage)

* 步骤4:滤波——先中值去噪,再高斯平滑
median_image (GImage, ImageMedian, 'circle', 3, 'mirrored')
gauss_filter (ImageMedian, ImageGauss, 1.2)

* 步骤5:增强——线性拉伸至全灰度范围
min_max_gray (ImageGauss, ImageGauss, 0, MinGray, MaxGray, Range)
scale_image (ImageGauss, ImageFinal, 255.0/(MaxGray-MinGray), -MinGray*255.0/(MaxGray-MinGray))

* 步骤6:保存预处理结果,用于后续特征提取或深度学习训练
write_image (ImageFinal, 'png', 0, 'pcb_weld_preprocessed.png')

在该案例中,我们通过模板匹配精准定位ROI,避免了基板背景的干扰;选择G通道是因为焊锡在绿光下与铜基板的灰度差异最大;中值滤波去除了焊点表面的微小颗粒噪声,高斯滤波则平滑了焊点轮廓的毛刺。最终预处理后的图像,虚焊(灰度偏暗)、正常(灰度均匀)、桥连(存在高亮桥接区域)三类样本的灰度直方图重叠度显著降低,分类器准确率从预处理前的82%提升至94%。

4.4 误区与复盘:预处理环节的五个典型陷阱

在实际项目交付中,以下五个误区反复出现,导致模型性能迟迟无法达标。我们逐一复盘并给出规避方案。

  • 误区一:ROI选择过紧或过松。过紧会截断缺陷边缘(如划痕延伸至ROI外),过松则引入背景干扰。复盘建议:ROI外扩5-10个像素作为安全边界,并在标注阶段验证缺陷是否完整落在ROI内。
  • 误区二:对所有样本使用同一滤波参数。不同批次的来料可能光照条件不同,固定σ值的高斯滤波可能对某些样本过度平滑。复盘建议:在预处理前先做光照归一化(如illuminate),或采用自适应滤波参数(基于图像灰度方差动态调整σ)。
  • 误区三:灰度化后丢弃了原始彩色信息。某些缺陷(如氧化变色)在灰度图中对比度极低,但在色度空间中差异明显。复盘建议:保留RGB三通道灰度图,分别训练或作为多通道输入,让模型自行选择有效通道。
  • 误区四:增强过度导致灰度饱和。线性拉伸时若Min/Max选取不当,会将大量像素压缩至0或255,丢失灰度梯度信息。复盘建议:使用min_max_gray时设置Percent参数(如1%),忽略极端异常像素后再计算拉伸范围。
  • 误区五:预处理与推理阶段不一致。训练时做了中值滤波+高斯滤波+拉伸,但部署时只做了灰度化,导致推理效果大幅下降。复盘建议:将预处理流程封装为独立的Halcon过程(Procedure),训练和推理共用同一过程,确保数据分布一致。

关键提醒:预处理流程一旦确定,在模型训练和评估阶段必须保持完全一致。任何预处理参数的改动,都应视为模型输入的变更,需要重新评估模型性能。建议在项目启动时,将预处理管线版本化(如preprocess_v1.2),并记录每次参数调整的原因和效果。

综上所述,图像采集与预处理不是简单的“图像清洗”,而是缺陷分类系统中承上启下的关键环节。通过合理的ROI选择、灰度化策略、滤波参数和增强强度,我们能够显著提升缺陷特征的信噪比,为后续特征提取和分类器训练奠定坚实基础。在实际操作中,务必结合具体缺陷的物理特性,通过可视化对比(如disp_image叠加灰度直方图)反复迭代预处理参数,直至达到“缺陷清晰可见、背景干净无扰”的理想状态。