Halcon编程-基于纹理的mara检测

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

软件这一块就不说了,国内的整体软件环境不好。据我所知,日本、德国和美国在机器视觉方面有很多相对成熟的软件。中国农业大学的陈兵旗教授在留日期间弄过很多机器视觉方面的农业机器人,同时他也写过一本书介绍视觉图像处理,后面还附录了他们自己主推的软件。德国的软件就是下面要介绍的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++代码,只有一句。我觉得还是单个取出来比较靠谱。

贴一个检测结果吧:

 
				
时间: 2024-10-03 22:25:02

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

基于纹理的车牌检测

一.常见的车牌检测       参见:http://www.docin.com/p-1450061197.html 参见:http://blog.csdn.net/evsqiezi/article/details/7895388 基于边缘检测的车牌定位方法 基于边缘检测的车牌定位流程 优点:该方法的定位准确率较高. 反应时间短. 能有效去掉噪声适合于包含多个车牌的图像, 在多车牌图像的情况下定位速度也很快: 缺点:车牌严重褪色的情况, 由于检测不到字符笔画的边缘会导致定位失败,在有外界干扰以及车

人脸识别系列之人脸检测--训练基于肤色特征的检测

前言: 基于特征的方法是利用人脸的先验知识导出的规则进行人脸检测. 一般来说,常用的特征包括人脸和人脸器官典型的边缘和形状特征(如人脸轮廓.虹膜轮廓.嘴唇轮廓等).纹理特征(纹理是在图上表现为灰度或颜色分布的某种规律性,这种规律性在不同类别的纹理中有其不同特点,人脸有其特定的纹理特征).颜色特征(人脸肤色特征,目前主要有RGB,HSV,YCbCr,YIQ,HIS等彩色空间模型被用来表示人脸的肤色,从而进行基于颜色信息的人脸检测方法的研究). 人脸检测的方法: 基于规则/知识方法 – 人脸模式的变

基于SSM的水质检测系统-java水质检测系统

基于SSM的水质检测系统-java水质检测系统 1.包含源程序,数据库脚本.代码和数据库脚本都有详细注释.2.课题设计仅供参考学习使用,可以在此基础上进行扩展完善开发环境:Eclipse ,MYSQL,JDK1.7,Tomcat 7涉及技术点:MVC模式.SpringMvc.Mybatis.Spring.HTML.JavaScript.CSS.JQUERY.DWR.Ajax等系统采用Mybatis框架实现ORM对象关系映射,前台JSP实现,后台springMvc映射,使用Spring框架进行整合

基于聚类的异常值检测方法( 2 )

韩家炜书中在介绍基于聚类的异常值检测中的第二种方法提到: 如果某对象与最近的簇的距离非常远,则该对象为Outlier.这句话其实有两个意思,第一个意思假定某对象在cluster A中,则它必定距离A簇比较近( 一般指的是球型的cluster ).第二个意思假定某对象是未知的点,距离A簇最近.其实在使用中,大部分情况我们可以把这两个场景合二为一.在本文中,我们假定对象已经在cluster A中. 本文基于聚类的异常值检测的算法思路是: 1 ) 用聚类算法做cluster 2 ) 计算cluster

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

在没有安装Halcon开发程序(HDevelop (SSE2))的电脑上面编程,使C#脱离Halcon编程开发环境使用方法,除了按照Halcon与编程环境必须要做的设置步骤外,还需要做如下两个工作: 1. 必须将halcon.dll  halcondotnet.dll   license 三个文件库复制到工程文件运行目录下,即(\bin\Debug目录下):(注:另外halcon.dll库文件也可以复制到C:\WINDOWS目录下) 2. 然后创建C:\Program Files\MVTec\h

基于聚类的异常值检测方法( 1 )

韩家炜的书中提到也可以用基于聚类的方法去做Outlier的识别.的确,outlier这个概念是和cluster这样的场景很相关的.对于工业上的数据来说,一般这个cluster的数量会是1或者2.在找出了cluster后,我们可以发现outlier要么不属于任何的cluster,要么说outlier在这个cluster里显得如此的奇怪. 今天我们用DBSCAN的方法去发现cluster和outleir.DBSCAN的介绍可以见这篇文章: http://www.cnblogs.com/chaosim

基于opencv的人脸检测的web应用

参考资料 https://github.com/bsdnoobz/web-based-face-detect http://opencv-code.com/projects/web-based-interface-for-face-detection-with-opencv/ http://www.cnblogs.com/findingsea/archive/2012/03/31/2427833.html 流程如下图 背景知识 php调用exe的返回 <html> <body> &

《如何用HALCON编程》

<HALCON 快速指引>繁体中文手册 文 件 名:文件<如何用HALCON编程>1.2.3来 源:网络下载,百度云盘分享资料格式:PDF相关网站:http://www.mvtec.com 目录Part IIntroducing HALCON如何用HALCON来开发程序各种行业的应用Part IIHDevelop的使用者界面Part III介绍HDevelop Part IIntroducing HALCON通过一个互动式的工具 HDevelop 快速完成软件开发的工作. 如何用H

Android下基于权限的恶意软件检测系统——APK Auditor

APK Auditor:Permission-based Android malware detection system, Digital Investigation(SCI,IF=0.986), 2015年6月 [1] http://www.sciencedirect.com/science/article/pii/S174228761500002X 1.1. 背景 土耳其Abant Izzet Baysal大学和Gazi大学的研究人员针对现有Android权限管理无法动态调整.用户难以理解