Halcon网状产品表面破损缺陷检测

123 阅读3分钟
  • 摘要: 本文描述如何使用Halcon实现传统算法的缺陷检测实现

  • 前言

    • Halcon 广泛应用于工业自动化、医学成像、科研等领域。它提供了强大的图像处理和分析工具,帮助用户实现高精度的视觉检测、测量、识别和定位任务。

    • 本文描述学习Halcon的过程,Halcon包含了很多算子单独学习某个算子是比较枯燥的,结合案例实操可以增加对此学习的兴趣。下面是halcon案例中的网状产品表面破损缺陷检测的案例。

    • (一)实现步骤

      • 1、使用算子read_image读取图像。
      • 2、使用算子mean_image预处理图像
      • 3、使用算子dyn_threshold分割缺陷。
      • 4、使用算子connection 分解区域。
      • 5、使用算子select_shape 筛选区域。
      • 6、显示结果。
    • (二)算子描述

      • read_image( : Image ,FileName)

        • Image:输出图像。
        • FileName :文件名|路径。
      • mean_image(Image, ImageMean ,MaskWidth, MaskHeight)

        • Image:原始输入图像。
        • ImageMean:输出图像(滤波后)。
        • MaskWidth:滤波器掩模的宽度。
        • MaskHeight:滤波器掩模的高度。
      • dyn_threshold(OrigImage, ThresholdImage , RegionDynThresh,Offset, LightDark)

        • OrigImage:原始输入图像。
        • ThresholdImage:经过平滑处理的阈值图像(通常由mean_image或gauss_image生成)。
        • RegionDynThresh:输出的分割区域。
        • Offset:阈值偏移量(灰度值差异的容限)。
        • LightDark:指定要提取的是比背景暗的区域。
      • connection(Region , ConnectedRegions)

        • Region: 输入的复合区域(可能包含多个不连通的区域)。
        • ConnectedRegions: 输出一组独立连通区域。
      • select_shape(Regions=, SelectedRegions,Features, Operation, Min, Max )

        • Regions:输入 待筛选的输入区域(通常来自 connection 的输出)。
        • SelectedRegions:输出 符合筛选条件的输出区域。
        • Features:输入用于筛选的形状特征(单个或多个特征组合)。
        • Operation:输入逻辑操作符:'and'、'or' 等。
        • Min 输入特征值下限。
        • Max 输入特征值上限。

  • 运行环境

    • 操作系统:Windows 11
    • Halcon:HALCON 20.11

  • 一、预览

image.png


  • 二、代码

    dev_update_window ('off')
    FileName:='plastic_mesh/plastic_mesh_01'
    *读取图像
    read_image (Image, 'plastic_mesh/plastic_mesh_01')
    *关闭窗口
    dev_close_window ()
    *获取图像大小
    get_image_size (Image, Width, Height)
    *打开窗口
    dev_open_window_fit_image (Image, 0, 0, Width, Height, WindowHandle)
    *设置字体信息:字体大小为16,字体为mono,粗体,斜体
    set_display_font (WindowHandle, 18, 'mono', 'true', 'false')
    *设置区域的填充方式
    dev_set_draw ('margin')
    *设置线宽度
    dev_set_line_width (3)
    *循环检测缺陷
    for Index := 1 to 14 by 1
        **$'02':将Index 格式化为 2位数字,不足补零。
        FileName :='plastic_mesh/plastic_mesh_' + Index$'02'
        *读取图像
        read_image (Image, FileName)
        *对输入图像进行均值滤波(平滑处理),输出平滑图像
        mean_image (Image, ImageMean, 49, 49)
        *局部阈值分割图像
        dyn_threshold (Image, ImageMean, RegionDynThresh, 5, 'dark')
        *对分割后的区域进行连通处理:将连通区域分解为独立区域。
        connection (RegionDynThresh, ConnectedRegions)
        *过滤缺陷:筛选面积过大的区域为错误区域
        select_shape (ConnectedRegions, ErrorRegions, 'area', 'and', 500, 99999)
        *统计出缺陷的数目
        count_obj (ErrorRegions, NumErrors)
        *显示图像
        dev_display (Image)
        *设置缺陷对象的显示颜色
        dev_set_color ('red')
        *显示缺陷网孔
        dev_display (ErrorRegions)
        if (NumErrors > 0)
            *显示产品NG
            disp_message (WindowHandle, 'Mesh NG:Defect Number: = '+NumErrors , 'window', 24, 12, 'red', 'true')
        else
            *显示产品OK
            disp_message (WindowHandle, 'Mesh OK', 'window', 24, 12, 'green', 'true')
        endif
        stop()
    endfor 
    

image.png

  • 最后

    • 如果你觉得这篇文章对你有帮助,不妨点个赞再走呗!
    • 如有疑问,欢迎评论区留言讨论!
    • 也可以关注微信公众号 [编程笔记in] ,一起交流学习!