5.凹凸偏位检测-Halcon实现

该博客详细介绍了使用Halcon图像处理库进行凹凸偏位检测的步骤,包括图像二值化、形态学操作、傅里叶变换、高斯滤波、线条提取、轮廓筛选等,通过内外部缺陷的检测来确定是否存在缺陷。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图像处理报告

1.基本信息

姓名:NCUTer

日期:2022.9.17 

处理图像名称:5.凹凸偏位检测 

编程语言及第三方图像处理库:Halcon图像处理库 

  1. 图像处理流程(含用到的算子及中间结果图)读取图像

1.read_image (Image, ImageFiles[I])

2.图像二值阈值化(otsu法) 

binary_threshold (Image, Region, 'max_separability', 'light', UsedThreshold)

 

3.形态学提取圆形工件区域并进行区域形状转换生成RegionTrans区域

closing_circle (Region, RegionClosing, 3.5)

fill_up_shape (RegionClosing, RegionFillUp, 'area', 1, 300)

opening_circle (RegionFillUp, RegionOpening, 43.5)

shape_trans (RegionOpening, RegionTrans, 'circle')

4.结合上述提取区域的中心坐标位置相对左侧字符区域位置构建矩形ROI[采取工件内部缺陷区域和外部缺陷区域分开提取的思路]

gen_rectangle1 (ROI_0, 10, Column1-180, 350, Column1-145.5)

5.将RegionTrans区域与矩形ROI区域合并生成RegionUnion

union2 (RegionTrans, ROI_0, RegionUnion)

6.获取RegionUnion合并区域的补集RegionComplement

complement (RegionUnion, RegionComplement)

7.利用补集RegionComplement在原图上抠图得到图像ImageReduced,以去除工件和字符对缺陷提取的干扰

reduce_domain (Image, RegionComplement, ImageReduced)

8.先进行圆形工件区域外部的缺陷检测

      8.1对ImageReduced傅里叶变换,由空间域-->频域,进行高斯滤波

get_image_size (Image, Width, Height)

fft_generic (ImageReduced, ImageFFT, 'to_freq', -1, 'none', 'dc_center', 'complex')

*构建一个高斯滤波

gen_gauss_filter (ImageGauss, 3, 3, 0, 'n', 'dc_center', Width, Height)  

*处理图像

convol_fft (ImageFFT, ImageGauss, ImageConvol)

 8.2 滤波之后从频域-->空间域,生成图像ImageFFT

*从频域变换到空间域

fft_generic (ImageConvol, ImageFFT1, 'from_freq', 1, 'none', 'dc_center', 'byte')

 

 8.3 由原图ImageReduced与变换后图像ImageFFT进行图像差分,生成图像ImageSub

*差分图像,得到新的图像

sub_image (ImageReduced, ImageFFT1, ImageSub, 1, 100)

 8.4 对ImageSub进行高斯线条提取

lines_gauss(ImageReduced,Lines,1.5,3,8,'dark','true', 'bar-shaped', 'true')

8.5 对提取的xld轮廓进行特征筛选与合并,即可完成圆形工件区域外部的缺陷检测。

select_shape_xld (Lines, SelectedXLD, 'ratio', 'and', 0.15, 10)

union_adjacent_contours_xld (SelectedXLD, UnionContours, 4, 1, 'attr_keep')

select_shape_xld (UnionContours, SelectedXLD1, ['column','contlength'], 'and', [60,30], [250,200])

9 再进行圆形工件区域内部的缺陷检测

     9.1转换后的圆形工件区域在原图上抠图(单独检测工件内部缺陷)

reduce_domain (Image, RegionTrans, ImageYGJ)

 

 9.2 图像灰度缩放增强预处理(增强缺陷处对比度)

scale_image (ImageYGJ, ImageScaled, 2.00787, 0)

 9.3 阈值分割并提取骨架Skeleton

threshold (ImageScaled, Regions, 0, 120)

skeleton (Regions, Skeleton)

9.4 由Skeleton生成xld轮廓并将其相近的彼此连接

gen_contours_skeleton_xld (Skeleton, Contours, 1, 'filter')

union_adjacent_contours_xld (Contours, UnionContours, 6, 1, 'attr_keep')

 9.5 对xld特征筛选分离出缺陷区域,并将圆形工件内外部缺陷区域一起放入QX数组

select_shape_xld (UnionContours, SelectedXLD, ['column','contlength','ratio','area'], 'and', [155,40,0.1,90], [180,150,0.35,350])

concat_obj (QX, SelectedXLD, QX)

union_adjacent_contours_xld (QX, QX, 15, 2, 'attr_keep')

9.6 计算缺陷区域面积并统计缺陷个数,最终显示检测结果

area_center_points_xld (QX, AreaRef, Row, Column)

tuple_sum (AreaRef, Sum)

count_obj (QX, Number)

*结果显示环节

    *若Number>0,则存在缺陷;否则为OK

    if (Number>0)  

        dev_display (Image)

        dev_display (QX)

        dev_disp_text ('NG\n'+'Defect_Area: '+Sum+' Pix', 'window', 6, 3, 'black', [], [])

    else

        dev_display (Image)

        dev_disp_text ('OK', 'window', 6, 3, 'black', [], [])

    endif

 


完整项目代码:

dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 587, 536, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_line_width (2)

*遍历文件夹开始检测
list_image_files ('union_img', 'default', [], ImageFiles)
for I := 0 to |ImageFiles|-1 by 1
    read_image (Image, ImageFiles[I])
    binary_threshold (Image, Region, 'max_separability', 'light', UsedThreshold)
    closing_circle (Region, RegionClosing, 3.5)
    fill_up_shape (RegionClosing, RegionFillUp, 'area', 1, 300)
    opening_circle (RegionFillUp, RegionOpening, 43.5)
    *圆工件外与圆工件内的缺陷区域分开提取
    shape_trans (RegionOpening, RegionTrans, 'circle')
    area_center (RegionTrans, Area, Row1, Column1)
    reduce_domain (Image, RegionTrans, ImageYGJ)
    gen_empty_obj (QX)
    *融合圆形工件与字符最小外接矩形区域求区域补集,以去除过多背景干扰
    gen_rectangle1 (ROI_0, 10, Column1-180, 350, Column1-145.5)
    union2 (RegionTrans, ROI_0, RegionUnion)
    complement (RegionUnion, RegionComplement)
    reduce_domain (Image, RegionComplement, ImageReduced)
    
    *---------------------------------圆形工件区域外部缺陷检测
    get_image_size (Image, Width, Height)
    fft_generic (ImageReduced, ImageFFT, 'to_freq', -1, 'none', 'dc_center', 'complex')
    *构建一个高斯滤波
*     gen_sin_bandpass (ImageBandpass, 0.2, 'none', 'dc_center', Width, Height)
    gen_gauss_filter (ImageGauss, 3, 3, 0, 'n', 'dc_center', Width, Height)
    
    *处理图像
    convol_fft (ImageFFT, ImageGauss, ImageConvol)
    *从频域变换到空间域
    fft_generic (ImageConvol, ImageFFT1, 'from_freq', 1, 'none', 'dc_center', 'byte')
    *差分图像,得到新的图像
    sub_image (ImageReduced, ImageFFT1, ImageSub, 1, 100)
    lines_gauss(ImageReduced,Lines,1.5,3,8,'dark','true', 'bar-shaped', 'true')
    select_shape_xld (Lines, SelectedXLD, 'ratio', 'and', 0.15, 10)
    union_adjacent_contours_xld (SelectedXLD, UnionContours, 4, 1, 'attr_keep')
    
    select_shape_xld (UnionContours, SelectedXLD1, ['column','contlength'], 'and', [60,30], [250,200])
    concat_obj (QX, SelectedXLD1, QX)
    
    
    *----------------------------------------圆形工件区域内部缺陷检测
    scale_image (ImageYGJ, ImageScaled, 2.00787, 0)
    
    threshold (ImageScaled, Regions, 0, 120)
    skeleton (Regions, Skeleton)
    gen_contours_skeleton_xld (Skeleton, Contours, 1, 'filter')
    union_adjacent_contours_xld (Contours, UnionContours, 6, 1, 'attr_keep')
    
    select_shape_xld (UnionContours, SelectedXLD, ['column','contlength','ratio','area'], 'and', [155,40,0.1,90], [180,150,0.35,350])
    concat_obj (QX, SelectedXLD, QX)
    union_adjacent_contours_xld (QX, QX, 15, 2, 'attr_keep')
    *计算缺陷的面积
    area_center_points_xld (QX, AreaRef, Row, Column)
    tuple_sum (AreaRef, Sum)
    count_obj (QX, Number)
    
    
    *结果显示环节
    *若Number>0,则存在缺陷;否则为OK
    if (Number>0)  
        dev_display (Image)
        dev_display (QX)
        dev_disp_text ('NG\n'+'Defect_Area: '+Sum+' Pix', 'window', 6, 3, 'black', [], [])
    else
        dev_display (Image)
        dev_disp_text ('OK', 'window', 6, 3, 'black', [], [])
    endif
    
*     dump_window_image (Image1, WindowHandle)
*     write_image (Image1, 'bmp', 0, ImageFiles[I])
    
    stop ()
endfor

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NCUTer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值