表面瑕疵检测是机器视觉领域非常重要的一个应用。机器视觉是集光学、机电和计算机三个领域的一门不算新的技术。但目前表面瑕疵检测在学界主要是计算机专业或者控制专业瞄准图像处理方向在做,而视觉光学系统这一块主要是光学工程专业在做。很少有研究者把这三块都结合的很好,而国内做这机器视觉(注意是机器视觉 不是计算机视觉)基本上都是小公司。

软件这一块就不说了,国内的整体软件环境不好。据我所知,日本、德国和美国在机器视觉方面有很多相对成熟的软件。中国农业大学的陈兵旗教授在留日期间弄过很多机器视觉方面的农业机器人,同时他也写过一本书介绍视觉图像处理,后面还附录了他们自己主推的软件。德国的软件就是下面要介绍的halcon。提到halcon就有必要和开源的opencv进行对比,opencv在图像处理方面也是小有名气,但是其成型的图像模块函数并不多,而且由于是开源,并没有专门对各种图像处理领域方面的检测需求进行扩展,还是那句话,毕竟是开源。

halcon是商业软件,国内主要是大恒公司在代理,其在图像处理方面,特别是检测测量方面有很多优势。下面我以一个例子在介绍halcon图像算法开发过程。

启动软件,ctrl+E弹出例程,选择表面检测中的detect_mura_defects_texture 。这个是液晶面板上的mura 损伤 。附录上张存在损伤的图像     

在杂乱的纹理上出现的黑色区域就是损伤。如何检测呢?

代码如下:

* this example shows how to detect mura defects

* in highly textured images
*
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, 'courier', '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)
* defects are characterized by dark patches. Hence, by substracting the
* estimated background illumination from the original image the
* defects become more apparent
estimate_background_illumination (B, ImageFFT1)
sub_image (B, ImageFFT1, ImageSub, 2, 100)
* median filter smooths out the fine texture, simplifying the following
* segmentation and final detection of defects
median_image (ImageSub, ImageMedian, 'circle', 9, 'mirrored')
watersheds_threshold (ImageMedian, Basins, 20)
* dark patches corresponding to defects have a very low energy
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)
disp_message (WindowHandle, NDefects+' \'mura\' defects detected', 'window', -1, -1, 'red', 'true')
if (f < 2)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
endif
endfor

1对彩色图像进行R G B分解,选取B作为后续图像。这个原因是通过实验处理的,在B图像下黑色斑和背景差异最大吧。

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

3 背景差分。采用以下函数,增强两幅图像的差异

sub_image ( ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : )

ImageSub=(ImageMinuend-ImageSubtrahend)*Mult+Add

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

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

6 根据能量信息对多个region进行筛选,筛选后的region就是检测结果。

Halcon::tuple_find ((Energy-0.05).Sgn(), -1, &Indices);
image_opencv_test=m_ip->HImageToIplImage(m_hoImage);
int number=Indices.Num();
for (int i=0;i<number;i++)
{
Halcon::HTuple new_Indices;
new_Indices[0]=Indices[i].I()+1;
Halcon::select_obj (Basins, &Defects, new_Indices);
Hlong x1,x2,y1,y2;
Halcon::smallest_rectangle1(Defects,&y1,&x1,&y2,&x2);
cvRectangle(image_opencv_test,cvPoint(x1,y1),cvPoint(x2,y2),cvScalar(0,0,255),2,8,0);
}

判断能量是否大于0.05,通过sgn函数将大于0.05的置1,小于的置-1。通过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; 也就是说数组中的值可以直接访问,然后转化为需要的类型。
这是我弄的比较笨的方法,直接通过halcon转化c++代码,只有一句。我觉得还是单个取出来比较靠谱。 贴一个检测结果吧:

 

Halcon编程-基于纹理的mara检测的更多相关文章

  1. Halcon编程-基于形状特征的模板匹配

    halcon软件最高效的一个方面在于模板匹配,号称可以快速进行柔性模板匹配,能够非常方便的用于缺陷检测.目标定位.下面以一个简单的例子说明基于形状特征的模板匹配.      为了在右图中,定位图中的三 ...

  2. 基于纹理边缘抑制的轮廓和边界检测(Contour and Boundary Detection)

    基于纹理边缘抑制的轮廓和边界检测(Contour and Boundary Detection) kezunhai@gmail.com http://blog.csdn.net/kezunhai 一幅 ...

  3. 10分钟内基于gpu的目标检测

    10分钟内基于gpu的目标检测 Object Detection on GPUs in 10 Minutes 目标检测仍然是自动驾驶和智能视频分析等应用的主要驱动力.目标检测应用程序需要使用大量数据集 ...

  4. 基于纹理的图片检索及demo(未启动)

    基于纹理的图片检索及demo(未启动)

  5. 【AdaBoost算法】基于OpenCV实现人脸检测Demo

    一.关于检测算法 分类器训练: 通过正样本与负样本训练可得到分类器,opencv有编译好的训练Demo,按要求训练即可生成,这里我们直接使用其已经训练好的分类器检测: 检测过程: 检测过程很简单,可以 ...

  6. C#脱离Halcon编程开发环境使用方法

    在没有安装Halcon开发程序(HDevelop (SSE2))的电脑上面编程,使C#脱离Halcon编程开发环境使用方法,除了按照Halcon与编程环境必须要做的设置步骤外,还需要做如下两个工作: ...

  7. Unity编辑器:基于NGUI的引用检测工具

    这里共享一个基于NGUI的引用检测工具.工具包括几个部分:Atlas/Sprite的引用查找:字库引用查找:UITexture引用查找:Component查找: 代码就不多介绍了,文章底部提供源码下载 ...

  8. 使用Dlib来运行基于CNN的人脸检测

    检测结果如下 这个示例程序需要使用较大的内存,请保证内存足够.本程序运行速度比较慢,远不及OpenCV中的人脸检测. 注释中提到的几个文件下载地址如下 http://dlib.net/face_det ...

  9. 转-------基于R-CNN的物体检测

    基于R-CNN的物体检测 原文地址:http://blog.csdn.net/hjimce/article/details/50187029 作者:hjimce 一.相关理论 本篇博文主要讲解2014 ...

随机推荐

  1. \(\S1 \) Gaussian Measure and Hermite Polynomials

    Define on \(\mathbb{R}^d\) the normalized Gaussian measure\[ d \gamma(x)=\frac{1}{(2\pi)^{\frac{d}{2 ...

  2. ie7,8常见bug,共计257个bug汇总?如何解决ie的历史bug

    ie7.8常见bug,共计257个bug汇总 针对web开发者来说,浏览器的bug,特备是ie的bug是很多人的噩梦,因为ie的更新换代没有ff,chrome,safari,opera那么快,而且ie ...

  3. PCWIFI--无线网络共享软件

    前段时间由于需要共享笔记本无线网络给手机使用,在网上找了几个软件试了一下,没找到比较好用的,要么是收费的,要么有广告,要么附带一大堆其他功能,所以决定自己写一个小软件来实现该功能.软件相关介绍如下:  ...

  4. Backbone源码解析(五):Route和History(路由)模块

    今天是四月十二号,距离上次写博已经将近二十天了.一直忙于工作,回家被看书的时间占用了.连续两个礼拜被频繁的足球篮球以及各种体育运动弄的精疲力竭,所以很少抽时间来写技术博客.今天抽出时间把backbon ...

  5. 关于MySQL的在线扩容

    原文地址:http://bucketli.iteye.com/blog/1294032 主要简单总结下,mysql在线扩容和缩容一般涉及到的内容,主要包括三个方面,1.在线也就意味着需要把增量的数据重 ...

  6. [.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)

    [.net 面向对象编程基础] (10) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态 ...

  7. C#性能优化之Lazy<T> 实现延迟初始化

    在.NET4.0中,可以使用Lazy<T> 来实现对象的延迟初始化,从而优化系统的性能.延迟初始化就是将对象的初始化延迟到第一次使用该对象时.延迟初始化是我们在写程序时经常会遇到的情形,例 ...

  8. MSDN Kinect for Windows SDK中文版论坛开放了

    昨天MSDN上K4W开发相关的中文版论坛正式开放了,地址 http://social.msdn.microsoft.com/Forums/zh-CN/home?forum=k4wdevelopment ...

  9. [硬件项目] 2、汽车倒车雷达设计——基于专用倒车雷达芯片GM3101的设计方案与采用CX20106A红外线检测芯片方案对比

    前言 尽管每辆汽车都有后视镜,但不可避免地都存在一个后视镜的盲区,倒车雷达则可一定程度帮助驾驶员扫除视野死角和视线模糊的缺陷,提高驾驶安全性.上一节已经分析清倒车雷达的语音模块(上一节),本节将深入分 ...

  10. Beauty Contest

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28417#problem/F 题目大意:给n个点,求相聚最远距离的平方(输出整形) 集体思 ...