QQ登录

只需一步,快速开始

工业视觉halcon塑料表面缺陷检测

[ 复制链接 ]
表面缺陷检测在工业 视觉领域也很常见,包括物品表面划伤,缺损,污垢,变形等各种各样的缺陷,
这些对于 工业 产品来说都是不合格的。 采用传统人工方式检查非常耗费人力物力。
也容易让人视觉疲劳以及误判。
采用机器 视觉的方式 可以提高 检测 效率,长时间连续工作。
对于 表面缺陷我们常用 的检测 思路 有blob分析方法及blob与纹理配合检测法,
频域空间域配合检测法,
光度立体 法等。
第一思路 是基于blob分析方法进行缺陷检测,就是利用二值化,形状特征选择,形态学联合应用,
再加上图像区域加减运算,逐渐逼近缺陷区域 ,最终得到缺陷并显示出来。
Blob分析 是最常用最灵活的方法,可以采用不同顺序,加上其他算法的结合,达到比较好的缺陷效果
频域与空间域结合的方法主要就是在频域里进行滤波,选择不同的频域,然后再回到空间域处理,从而得到缺陷所在区域
当前例程实现在塑料产品上检测微小纹理缺陷,使用的方法是快速傅里叶变换。
实现思路首先是创建一个合适的高斯滤波器,然后对图像及滤波器进行快速傅立叶卷积运算。
最后在滤波后的图片上形态学算子检测缺陷。

实例,可运行查看效果。

工业视觉halcon塑料表面缺陷检测

工业视觉halcon塑料表面缺陷检测

dev_close_window ()
read_image (Image, 'plastics/plastics_01')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
stop()
* 对指定大小的图片进行FFT速度优化
optimize_rft_speed (Width, Height, 'standard')
* 生成两个高斯滤波器,GaussFilter1为生成的高斯滤波器,
*Sigma1, Sigma1为空间域中高斯滤波器在主方向 生成的标准差和正交于主方向上的标准差,
*0.0滤波器主方向上的角度, 'none'滤波器规范, 'rft'直流 频域 的位置, Width, Height图像宽高。
gen_gauss_filter (ImageGauss, 10, 10, 0, 'none', 'rft', Width, Height)
gen_gauss_filter (ImageGauss1, 3, 3, 0, 'none', 'rft', Width, Height)
*两图像相减。将GaussFilter1, GaussFilter2的灰度值相减后乘以1加0,结果保存到Filter。
sub_image (ImageGauss, ImageGauss1, filter, 1, 0)
num := 11
for i := 1 to num by 1
    read_image (Image1, 'plastics/plastics_'+i$'02')
    rgb1_to_gray (Image1, GrayImage)
      *计算图像的快速傅立叶变换 ,也就是频域变换,Image为输入图像,
    *ImageFFT为变换后的图像, 'to_freq'表示 从空间域到频域变换,为正向变换。
    *对应的是从频域到空间域的逆向变换, 'none'变换规范因数为无, 'complex'表示复数类型,
    *Width表示图像宽度。
    rft_generic (GrayImage, ImageFFT, 'to_freq', 'none', 'complex', Width)
    *采用滤波器在频域上做卷积。
    convol_fft (ImageFFT, filter, ImageConvol)
    *频域 回到空间域。
    rft_generic (ImageConvol, ImageFFT1, 'from_freq', 'n', 'real', Width)
    * 用矩形掩膜计算像素点灰度范围
    gray_range_rect (ImageFFT1, ImageResult, 10, 10)
    *判断 区内 灰度值 的最大最小值,第三个参数表示小于(大于)绝对最大(最小)值 的百分比值。
    *如为50表示Min,Max等于中间值,如为0将没有直方图被代入计算,可提高运算速度 。
    *后面三参数表示 最大最小值及它们的差。
    min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)
    threshold (ImageResult, Region, max([5,Max*0.8]), 255)
    connection (Region, ConnectedRegions)
*选取面积在4--99999范围内区域。
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 4, 99999)
    area_center (SelectedRegions, Area, Row, Column)
    *结果显示
    dev_display (Image1)
    num := |Area|
    if (num)
        gen_circle_contour_xld (ContCircle, Row, Column, gen_tuple_const(num,30), gen_tuple_const(num,0), gen_tuple_const(num,rad(360)), 'positive', 1)
        Message := ['not ok',num$'02'+'defects found']
        dev_display (ContCircle)
    else
        Message :='OK'
    endif
    dev_disp_text (Message, 'window', 10, 10, 'black', [], [])
    stop()
endfor
文章也下面HALCON视频教程的部分内容,
可以下载教程观看学习。
  

halcon从自学到接项目视频教程,另外再赠送全网最全资源  

  

欢迎围观我录制的一套halcon自学视频教程(进入)


  

上位机VC MFC程序开发精典实例大全源码与视频讲解配套下载408例

  

经历1年的编程与录制点击进入查看


  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  




回复

使用道具 举报

点击查看
快速回复 返回列表 客服中心 搜索