halcon纹理分析例子detect_mura_defects_texture.hdev 高纹理图像中的mura缺陷检测


image.png

image.png

目标:实现高纹理图像中缺陷的检测(黑色)。


思路为:

1.对彩色图像进行R G B分解,选取B作为后续图像。

2. 生成背景模板,将图像傅里叶变换到频域中,通过高斯滤波,然后傅里叶反变换回来,得到的图像就是背景模板。

3 .背景差分。采用sub_image函数进行图像差分,增强两幅图像的差异

4 .分水岭算法分割,在分割之前采用中值滤波来抑制小斑点或细线。分水岭后,图像分割为多个轮廓(region)。

5 .计算多个轮廓region的灰度信息,包括能量。相关度、同一度、对比度,通过灰度共生矩阵。 前面的两个参数是灰度级和方向,灰度级是2^,方向即灰度共生矩阵方向。

6 .根据能量信息对多个region进行筛选,筛选后的region就是检测结果。黑色区域的能量较低


判断能量是否大于0.05,通过sgn函数将大于0.05的置1,小于的置-1。

通过tuple_find在(Energy-0.05).Sgn()中寻找-1出现的位置,注意这个位置是从0开始的。

貌似这个是经过人为排序的,所以indices 中就是前三个 0 1 2

select_obj (Basins, &Defects, new_Indices);是从Basins提取序号为new_Indices的region 。

为什么重新定义一个HTuple 因为HTuple实际上是个数组。find后得到的就是一个indices 数组,里面存在三个数。

select_obj 的参数必须是HTuple,也就是数组,所以只能重新定义,而且序号从1开始,因此要加1,只能获取数组中的值加1,获取的代码为new_Indices[0]=Indices[i].I()+1; 也就是说数组中的值可以直接访问,然后转化为需要的类型。


用到的几个算子:

estimate_background_illumination -本地函数 用来估计生成背景图像

将图像傅里叶变换到频域中,通过高斯滤波,然后傅里叶反变换回来,得到的图像就是背景模板

cooc_feature_image - 计算共生矩阵并导出其灰度值特征。

* 多纹理图像中找缺陷
dev_close_window ()dev_update_off ()Path := 'lcd/mura_defects_texture_'read_image (Image, Path + '01')get_image_size (Image, Width, Height)dev_open_window (0, 0, 640, 480, 'black', WindowHandle)set_display_font (WindowHandle, 14, 'mono', 'true', 'false')dev_set_draw ('margin')dev_set_line_width (3)dev_set_color ('red')for f := 1 to 2 by 1
    read_image (Image, Path + f$'.2i')
    decompose3 (Image, R, G, B)
    *图像中的缺陷是黑色的,为了突出缺陷,通过生成背景照明图像进行增强
    estimate_background_illumination (B, ImageFFT1)
    sub_image (B, ImageFFT1, ImageSub, 2, 100)
    *中值滤波进行降噪
    median_image (ImageSub, ImageMedian, 'circle', 9, 'mirrored')
    watersheds_threshold (ImageMedian, Basins, 20)//分水岭算法分割
    *黑色缺陷的能量较低    *计算共生矩阵并导出其灰度值特征    
    cooc_feature_image (Basins, ImageMedian, 6, 0, Energy, Correlation, Homogeneity, Contrast)
    tuple_find (sgn(Energy - 0.05), -1, Indices)
    select_obj (Basins, Defects, Indices + 1)
    * 
    dev_display (Image)
    dev_display (Defects)
    count_obj (Defects, NDefects)//计算obj的数量
    disp_message (WindowHandle, NDefects + ' \'mura\' defects detected', 'window', -1, -1, 'red', 'true')
    if (f < 2)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor


2020/11/4勇哥附:

摘抄了网上对代码中的一些术语和算子的解释:

低能量:灰度图里指的是灰度值低
            彩色图里指的是光强度低
能量低的地方图像暗,能量高的地方图像亮。

在《数字图像处理》这本书里,P126 , 说“在傅里叶变换中,低频主要决定图像在平滑区域中总体灰度值的显示,
而高频主要决定图像细节部分,如边缘和噪声。

这里面说的是信号的变化速率,如果信号变化快,说明频率高,也就是高频,反之则是低频。

图像的平滑区域,它的灰度值(也就是信号)变化平缓,也就是低频的表现了 。
而图像的边缘,它的灰度值是突变的,也就是灰度值信号的变化速度快,形成了轮廓,那是高频的表现。
噪声是随机分布的,与噪声的背景有大的变化,也就是有高频信号。
傅立叶变换本身是对图像信号的空间域和时间域的相互变换。在时间域内用频率表示信号,也是为了计算方便。

Sgn(number), number 参数是任何有效的数值表达式。
返回值如果 number 大于0,则Sgn 返回1,等于0,返回0,小于0,则返回-1,number 参数的符号决定了Sgn 函数的返回值。


--------------------- 

作者:hackpig
来源:
www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864