
1相关算子详解。1.1cooc_feature_imageHALCON 中用于计算灰度共生矩阵GLCM并导出局部纹理特征的算子适用于基于纹理的图像分析与检测。以下为详细解析算子功能核心作用基于输入区域和图像的灰度分布计算指定方向和距离的灰度共生矩阵并从中提取局部纹理特征如能量、对比度等生成与输入图像尺寸一致的特征图像。内部机制该算子等价于先调用gen_cooc_matrix生成灰度共生矩阵再通过cooc_feature_matrix提取特征。若需多方向分析直接调用这两个算子效率更高。参数详解输入参数Regions待分析的区域ROI仅处理该区域内的像素。注算子忽略输入图像Image的域Domain仅依赖Regions定义的范围。Image输入的灰度图像需为单通道图像。LdGray灰度层级数1~8默认 6。层级数减少可加速计算但会降低精度。层级数指的是2的次方数例如默认值为6即2的6次方64意思是将256级0-255灰度值简化为64级进行计算减少计算量。Direction计算方向可选0°、45°、90°、135°或mean四个方向的均值。输出参数Energy能量反映灰度分布的均匀性值高表示纹理变化平缓。Correlation相关性表征像素间的线性依赖程度。Homogeneity同质性描述局部灰度的一致性值高表示纹理平滑。Contrast对比度衡量灰度差异值高表示纹理边缘清晰或突变明显。应用场景表面缺陷检测在 LCD 屏幕、金属表面等纹理复杂场景中通过对比正常与缺陷区域的Contrast或Energy差异定位缺陷。材质分类结合多纹理特征如Energy、Homogeneity构建特征向量用于木材种类识别或工业产品分类。医学图像分析分析组织或细胞的纹理特征辅助病理诊断。使用示例* 读取图像并定义 ROI read_image (Image, texture_sample.png) threshold (Image, Region, 128, 255) * 提取纹理特征图像能量和对比度 cooc_feature_image (Region, Image, 6, mean, EnergyImage, CorrelationImage, HomogeneityImage, ContrastImage) * 分析特征图像中的异常区域 threshold (ContrastImage, Defects, 50, 255)注意事项性能优化减少LdGray层级可提升速度但需权衡精度损失。多方向分析时优先使用gen_cooc_matrix和cooc_feature_matrix组合。区域选择Regions需精准覆盖目标纹理区域避免背景干扰特征计算。并行支持支持多线程全局调用适合实时处理或大尺寸图像分析。相关算子gen_cooc_matrix生成灰度共生矩阵。cooc_feature_matrix直接输出特征值而非特征图像。texture_laws基于滤波器的纹理分析适用于不同尺度特征提取。1.2gray_histo_absHALCON 中用于计算图像区域绝对灰度直方图的算子适用于分析特定区域内像素的灰度分布。以下为详细解析功能描述核心作用计算指定区域内图像的绝对灰度直方图输出各灰度级的像素频数。直方图元组索引对应灰度值元素值为该灰度值的出现次数。与gray_histo的区别gray_histo同时输出绝对和相对百分比直方图而gray_histo_abs仅生成绝对频数直方图适用于需要快速统计的场景。参数详解输入参数Regions待分析的区域ROI仅统计该区域内的像素灰度分布。Image输入的灰度图像支持多种数据类型如byte、int1、int2等。Quantization量化参数定义相邻灰度值的频率累加方式。例如Quantization2表示将每两个相邻灰度值的频数合并统计。输出参数AbsoluteHisto绝对灰度直方图元组长度为 256对应 0~255 级灰度。例如索引 100 的值为 500表示灰度值 100 的像素出现 500 次。注意事项灰度范围处理对于有符号图像如int1、int2灰度值会映射到索引 128 或 32768 起始的位置需注意索引与灰度值的转换关系。性能优化增大Quantization可减少直方图长度提升计算效率但会降低灰度分辨率。区域选择确保Regions精确覆盖目标区域避免无关像素干扰统计结果。AbsoluteHisto数组长度只要输入图像的灰度范围(例如byte格式的0-255 和 Quantization 参数均相同则对应的AbsoluteHisto数组长度相同。如下所示dev_close_window () dev_open_window (0, 0, 512, 512, black, WindowHandle) datas:[] for Index : 1 to 15 by 1 read_image (Image, clamp_sloped/clamp_sloped_Index$02) *计算绝对灰度直方图的数组长度是否相同 *Quantization8:表示将8个相邻的灰度值合并计算如此在深度为8位的图像中 *AbsoluteHisto的长度256级灰度值/Quantization(这里为8)32 gray_histo_abs (Image, Image, 8, AbsoluteHisto) datas:[datas,|AbsoluteHisto|] stop () endfor素材截图运行效果 AbsoluteHisto的长度256级灰度值/Quantization(这里为8)32典型应用图像质量评估通过直方图分析灰度分布均匀性检测过曝或欠曝区域。阈值分割结合histo_to_thresh算子根据直方图自动确定最佳分割阈值。特征提取统计特定灰度级占比用于图像分类或缺陷检测。1.3create_class_mlpHALCON 中用于创建多层感知机MLP分类器的核心算子支持分类与回归任务。以下为详细解析与使用指南1. 算子功能核心作用创建一个基于 MLP 的监督学习模型支持图像分类、OCR 等任务。其结构包含输入层、单隐层和输出层通过反向传播算法调整权重参数23。特点支持特征向量输入兼容多种数据预处理方法如归一化28。输出层激活函数可配置分类任务通常使用softmax回归任务可选linear23。2. 参数详解输入参数参数名描述示例值NumInput输入层维度特征向量长度3RGB 三通道特征8NumHidden隐层神经元数量10需根据数据复杂度调整23NumOutput输出层维度类别数或回归值个数55 分类任务8OutputFunction输出层激活函数softmax分类、linear回归23Preprocessing输入数据预处理类型normalization归一化8NumComponents预处理后特征维度10需≤NumInput2RandSeed随机种子控制权重初始化42保证结果可复现8输出参数MLPHandleMLP 分类器的句柄用于后续训练和推理。3. 应用场景OCR 文字识别与create_ocr_class_mlp配合识别字符图像13。工业缺陷分类输入表面纹理特征分类正常/异常区域8。材质分类基于颜色或纹理特征区分不同材质类型38。4. 使用示例* 创建 MLP 分类器输入 3 维特征隐层 10 节点输出 5 类 create_class_mlp (3, 10, 5, softmax, normalization, 3, 42, MLPHandle) * 添加训练样本假设 Image 为特征图ClassRegions 为标签区域 add_samples_image_class_mlp (Image, ClassRegions, MLPHandle) * 训练模型迭代 200 次学习率 0.01 train_class_mlp (MLPHandle, 200, 0.01, 0.01, Error, ErrorLog) * 分类预测 classify_image_class_mlp (Image, ResultRegions, MLPHandle, 0.5)5. 注意事项隐层设计隐层节点数需权衡模型复杂度与过拟合风险通常通过交叉验证选择。数据预处理归一化normalization可加速训练收敛避免数值溢出。训练参数调优学习率过高可能导致震荡过低则收敛缓慢建议结合ErrorLog监控训练过程。2应用。* 原始案例工业领域-木材-classify_wood.hdev * Image Acquisition 01: Code generated by Image Acquisition 01 list_files (木板图片, [files,follow_links], ImageFiles) tuple_regexp_select (ImageFiles, [\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$,ignore_case], ImageFiles) *木板材质 Classes : [苹果树,梨树,柏树,枫树,松树] FeaturesExtended:[] FeaturesExtended1:[] *--------------1计算特征点数用于后续模型创建使用-------------- read_image (Image, ImageFiles[0]) * Image Acquisition 01: Do something dev_close_window() get_image_size(Image, Width, Height) dev_open_window(0, 0, Width, Height, black, WindowHandle) dev_display(Image) rgb1_to_gray(Image, GrayImage) threshold (GrayImage, Regions, 31, 254) clip_region_rel (Regions, RegionClipped, 10, 10, 10, 30) connection(RegionClipped, ConnectedRegions) select_shape_std (ConnectedRegions, SelectedRegions, max_area, 0) *LdGray:灰度层级数1~8默认 6,这里也为6。层级数减少可加速计算但会降低精度。 *层级数指的 *层级数指的是2的次方数例如默认值为6即2的6次方64意思是将256级0-255 *灰度值简化为64级进行计算减少计算量。 *Energy能量)反映灰度分布的均匀性值高表示纹理变化平缓。 *Correlation相关性表征像素间的线性依赖程度。 *Homogeneity同质性描述局部灰度的一致性值高表示纹理平滑。 *Contrast对比度衡量灰度差异值高表示纹理边缘清晰或突变明显。 cooc_feature_image (Image, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast) sobel_amp (Image, EdgeAmplitude, sum_abs,3) *AbsoluteHistoEdgeAmplitude灰度图直方图绝对值 *注意只要输入图像的灰度范围(例如byte格式的0-255 和 Quantization 参数均相同时*gr *gr *gray_histo_abs 输出的AbsoluteHisto 数据长度便相同 *如果只是推导特征数量可以省略图像预处理 gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHistoEdgeAmplitude) FeaturesExtended : [Energy,Correlation,Homogeneity,Contrast] FeaturesExtended : [FeaturesExtended,AbsoluteHistoEdgeAmplitude] *计算灰度共生矩阵获取局部纹理特征 cooc_feature_image (SelectedRegions, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast) sobel_amp (Image, EdgeAmplitude, sum_abs, 3) *输入图像的 灰度范围 和 Quantization 参数 均相同时gray_histo_abs 输出的AbsoluteHisto 数据长度相同gray_ gray_ gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHistoEdgeAmplitude) FeaturesExtended1 : [FeaturesExtended,Energy,Correlation,Homogeneity,Contrast] FeaturesExtended1 : [FeaturesExtended1,AbsoluteHistoEdgeAmplitude] *NumFeatures数组长度4(指的是Energy,Correlation,Homogeneity,Contrast)AbsoluteHistoEdgeAmplitude数组长度*2 NumFeatures : |FeaturesExtended1| NumClasses : |Classes| NumHidden : 15 *-----------------2创建分类器------------------------------ *NumOutput输出的数量数量需与后续添加的样例数量一致 create_class_mlp (NumFeatures, 15, 5, softmax, normalization, 10, 42, MLPHandle) *-----------------3添加样例--------------------------------- for i : 0 to |ImageFiles| - 1 by 1 read_image (Image, ImageFiles[i]) rgb1_to_gray(Image, GrayImage) threshold (GrayImage, Regions, 31, 254) clip_region_rel (Regions, RegionClipped, 10, 10, 10, 30) connection(RegionClipped, ConnectedRegions) select_shape_std (ConnectedRegions, SelectedRegions, max_area, 0) cooc_feature_image (SelectedRegions, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast) sobel_amp (Image, EdgeAmplitude, sum_abs, 3) gray_histo (EdgeAmplitude, EdgeAmplitude, AbsoluteHisto, RelativeHisto) gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHistoEdgeAmplitude) FeaturesExtended : [Energy,Correlation,Homogeneity,Contrast] FeaturesExtended : [FeaturesExtended,AbsoluteHistoEdgeAmplitude] cooc_feature_image (Image, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast) sobel_amp (Image, EdgeAmplitude, sum_abs, 3) *输入图像的 灰度范围 和 Quantization 参数 均相同时gray_histo_abs 输出的 *AbsoluteHisto 数据长度相同 gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHistoEdgeAmplitude) FeaturesExtended1 : [FeaturesExtended,Energy,Correlation,Homogeneity,Contrast] FeaturesExtended1 : [FeaturesExtended1,AbsoluteHistoEdgeAmplitude] FeatureVector : real(FeaturesExtended1) *3添加样本 * Image Acquisition 01: Code generated by Image Acquisition 01 add_sample_class_mlp (MLPHandle, FeatureVector, i) endfor *------------------4训练分类器--------------------------- train_class_mlp (MLPHandle, 200, 1, 0.0001, Error, ErrorLog) stop() write_class_mlp(MLPHandle, 1.gmc) *-----------------5应用分类器进行识别------------------------ for i : |ImageFiles| - 1 to 0 by -1 read_image (Image, ImageFiles[i]) rgb1_to_gray(Image, GrayImage) threshold (GrayImage, Regions, 31, 254) *这里和前面添加样例一样如此其实可以封装成一个方法 clip_region_rel (Regions, RegionClipped, 10, 10, 10, 30) connection(RegionClipped, ConnectedRegions) select_shape_std (ConnectedRegions, SelectedRegions, max_area, 0) cooc_feature_image (SelectedRegions, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast) sobel_amp (Image, EdgeAmplitude, sum_abs, 3) gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHistoEdgeAmplitude) FeaturesExtended : [Energy,Correlation,Homogeneity,Contrast] FeaturesExtended : [FeaturesExtended,AbsoluteHistoEdgeAmplitude] cooc_feature_image (Image, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast) sobel_amp (Image, EdgeAmplitude, sum_abs, 3) gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHistoEdgeAmplitude) FeaturesExtended1 : [FeaturesExtended,Energy,Correlation,Homogeneity,Contrast] FeaturesExtended1 : [FeaturesExtended1,AbsoluteHistoEdgeAmplitude] *计算出当前图像的特征点 FeatureVector : real(FeaturesExtended1) *识别 * FoundClassIDs:查找到的targetConfidence查找的target评分其数量由num设置这里为2 classify_class_mlp (MLPHandle, FeatureVector, 2, FoundClassIDs, k) dev_display(Image) result: found class: Classes[FoundClassIDs[0]] disp_message(WindowHandle, result, image, 12, 12, black, true) stop() endfor clear_class_mlp (MLPHandle)Halcon官方相应案例* 案例工业领域-木材-classify_wood.hdev * The object of this example is to classify different * kinds of wood according to their surface texture. * 特征量是由原图与1/4原图的灰度共生矩阵的四个值、灰度直方图绝对值构成 file_exists (classify_wood.gmc, FileExists) if (FileExists) USE_STORED_CLASSIFIER : 1 else USE_STORED_CLASSIFIER : 0 endif * First, the path to the images is set, the initial image * is read and the settings are specified. get_system (image_dir, HalconImages) get_system (operating_system, OS) if (OS{0:2} Win) tuple_split (HalconImages, ;, HalconImages) else tuple_split (HalconImages, :, HalconImages) endif ImagePath : /wood/ ReadOK : false dev_get_preferences (suppress_handled_exceptions_dlg, SaveMode) dev_set_preferences (suppress_handled_exceptions_dlg, true) for k : 0 to |HalconImages| - 1 by 1 try read_image (Image, HalconImages[k] ImagePath apple/apple_01) ReadPath : HalconImages[k] ImagePath ReadOK : true break catch (Exception) endtry endfor if (not ReadOK) disp_message (WindowID, Could not find the images in $HALCONIMAGES, window, -1, -1, black, true) stop () endif dev_set_preferences (suppress_handled_exceptions_dlg, SaveMode) read_image (Image, ImagePath apple/apple_01) get_image_pointer1 (Image, Pointer, Type, Width, Height) dev_close_window () dev_open_window_fit_image (Image, 0, 0, Width, Height, WindowID) set_display_font (WindowID, 22, mono, true, false) dev_display (Image) dev_update_off () * Now the different wood classes are specified. Classes : [apple,beech,cherry,maple,oak,walnut] * The program uses by default a stored classifier. If you, however, * want to perform the training, set USE_STORED_CLASSIFIER to 0. * If the classifier can not be found, USE_STORED_CLASSIFIER * is set to 0 automatically. if (USE_STORED_CLASSIFIER 1) read_class_mlp (classify_wood.gmc, MLPHandle) NumClasses : |Classes| else * 本地函数生成特征量这里共生成72个特征量 gen_features (Image, FeatureVector) NumFeatures : |FeatureVector| NumClasses : |Classes| NumHidden : 15 create_class_mlp (NumFeatures, NumHidden, NumClasses, softmax, normalization, 10, 42, MLPHandle) for CorrectClassID : 0 to NumClasses - 1 by 1 list_files (ReadPath Classes[CorrectClassID], files, Files) for k : 0 to |Files| - 1 by 2 read_image (Image, Files[k]) dev_display (Image) gen_features (Image, FeatureVector) add_sample_class_mlp (MLPHandle, FeatureVector, CorrectClassID) endfor endfor train_class_mlp (MLPHandle, 200, 1, 0.0001, Error, ErrorLog) write_class_mlp (MLPHandle, classify_wood.gmc) disp_message (WindowID, Training of wood textures completed\nPress \Run\ to continue, window, -1, -1, black, true) stop () endif Errors : 0 Count : 0 for CorrectClassID : 0 to NumClasses - 1 by 1 list_files (ReadPath Classes[CorrectClassID], files, Files) for k : 0 to |Files| - 1 by 1 Count : Count 1 read_image (Image, Files[k]) gen_features (Image, FeatureVector) * FoundClassIDs:查找到的targetConfidence查找的target评分其数量由num设置这里为2 classify_class_mlp (MLPHandle, FeatureVector, 2, FoundClassIDs, Confidence) dev_display (Image) dev_set_color (blue) disp_message (WindowID, correct class: Classes[CorrectClassID], window, 24, 12, black, true) if (CorrectClassID ! FoundClassIDs[0]) dev_set_color (red) set_tposition (WindowID, 55, 12) write_string (WindowID, found class: Classes[FoundClassIDs[0]]) Errors : Errors 1 disp_continue_message (WindowID, black, true) stop () endif wait_seconds (0.1) endfor endfor ErrorRate : real(Errors) / Count * 100.0 clear_class_mlp (MLPHandle)本地函数gen_features(Image:::FeatureVector)* 本地函数gen_features(Image:::FeatureVector) FeatureVector : [] * Compute features. gen_sobel_features (Image, FeatureVector, FeatureVector) * Downscale the image (image pyramid) and compute features. zoom_image_factor (Image, Zoomed1, 0.5, 0.5, constant) gen_sobel_features (Zoomed1, FeatureVector, FeatureVector) * Uncomment lines to use further pyramid levels: zoom_image_factor (Zoomed1, Zoomed2, 0.5, 0.5, constant) * gen_sobel_features (Zoomed2, FeatureVector, FeatureVector) * zoom_image_factor (Zoomed2, Zoomed3, 0.5, 0.5, constant) * gen_sobel_features (Zoomed3, FeatureVector, FeatureVector) * zoom_image_factor (Zoomed3, Zoomed4, 0.5, 0.5, constant) * gen_sobel_features (Zoomed4, FeatureVector, FeatureVector) FeatureVector : real(FeatureVector) return ()* 本地函数gen_sobel_features(Image::Features:FeaturesExtended)* 本地函数gen_sobel_features(Image::Features:FeaturesExtended) * Coocurrence matrix for 0 deg and 90 deg: * 计算灰度共生矩阵 cooc_feature_image (Image, Image, 6, 0, Energy, Correlation, Homogeneity, Contrast) cooc_feature_image (Image, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast) * Absolute histogram of edge amplitudes: sobel_amp (Image, EdgeAmplitude, sum_abs, 3) * 计算灰度直方图绝对值 * 8:表示连续的8个灰度值级合并计算为一个故这里计算得到的 * AbsoluteHistoEdgeAmplitude32256/8 gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHistoEdgeAmplitude) * Entropy and anisotropy: * entropy_gray (Image, Image, Entropy, Anisotropy) * Absolute histogram of gray values: * gray_histo_abs (Image, Image, 8, AbsoluteHistoImage) * Add features to feature vector: FeaturesExtended : [Features,Energy,Correlation,Homogeneity,Contrast] FeaturesExtended : [FeaturesExtended,AbsoluteHistoEdgeAmplitude] * FeaturesExtended : [FeaturesExtended,Entropy,Anisotropy] * FeaturesExtended : [FeaturesExtended,AbsoluteHistoImage] return ()效果3Demo链接。https://download.csdn.net/download/lingxiao16888/90498453