当前位置:文档之家› Halcon学习笔记之缺陷检测(二)教学教材

Halcon学习笔记之缺陷检测(二)教学教材

Halcon学习笔记之缺陷检测(二)例程:detect_indent_fft.hdev说明:这个程序展示了如何利用快速傅里叶变换(FFT)对塑料制品的表面进行目标(缺陷)的检测,大致分为三步:首先,我们用高斯滤波器构造一个合适的滤波器(将原图通过高斯滤波器滤波);然后,将原图和构造的滤波器进行快速傅里叶变换;最后,利用形态学算子将缺陷表示在滤波后的图片上(在缺陷上画圈)。

注:代码中绿色部分为个人理解和注释,其余为例程中原有代码*Initialization(初始化)dev_updata_off() //这一句包含如下三个算子://dev_updata_pc(‘off’) 关闭更新程序计数器//dev_updata_var(‘off’) 关闭更新变量窗口//dev_updata_window(‘off’) 关闭更新图像窗口(即通过命令来显示想要在图像窗口显示的图片)dev_close_window() //关闭活动的图像窗口read_image(Image,’plastics/plastics_01’) //载入图片//参数说明:为读入图片命名(Image)// 文件名(’plastics/plastics_01’)get_image_size(Image,Width,height) //获取图片的长宽;//参数说明:之前读入或生成的图片(Image)// 图片的宽(Width)// 图片的高(Height)dev_open_window(0,0,Width,Height,’Black’,WindowHandle) //打开一个新的图像窗口//参数说明:起始坐标(0,0)// 大小(Width,Height)// 背景颜色(’Black’)// 窗口句柄(WindowHandle)set_display_font (WindowHandle,14,’mono’,’ture’,’false’)//设置不依赖操作系统的字体//参数说明:窗口句柄(WindowHandle)// 字体大小(14)// 字体类型(’mono’)// 是否黑体(’ture’)// 是否倾斜(’false’)dev_set_draw(‘Margin’) //定义区域填充模式//参数说明:填充模式(’Margin’或者’Fill’)dev_set_line_width(3) //设置输出区域轮廓线的线宽//可以修改参数来看最后缺陷区域标示的区别dev_set_color(’red’) //设置一种或者多种输出颜色**Optimize the fft speed for the specific image size(根据指定图像大小进行fft速度最优化)optimize_rft_speed(Width,Height,’standard’) //对指定大小的图片的fft速度进行优化//参数说明:图片大小(Width,Height)// 优化模式(’standard’)**Construct a suitable filter by combining two Gaussian filters(结合两个高斯滤波器构造一*个合适的滤波器)Sigma1 := 10.0Sigma2 := 3.0 //定义两个常量gen_gauss_filter(GaussFilter1,Sigma1,Sigma1,0.0,’none’,’rft’,Width,Height)gen_gauss_filter(GaussFilter2,Sigma2,Sigma2,0.0,’none’,’rft’,Width,Height) //在频域生成两个高斯滤波器//参数说明:生成的高斯滤波器(GaussFilter)// 空域中高斯在主方向上的标准差(Sigma)// 空域中高斯在正交于主方向的方向上的标准差(Sigma)// 滤波器主方向的角度(0.0)// 滤波器的规范(’none’)// 直流项在频域的位置(’rft’)// 图片的大小(Width,Height)sub_image(GaussFilter1,GaussFilter2,Filter,1,0) //两图片相减(灰度)//sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : )//g' := (g1- g2) * Mult + Add//以上为函数原型以及运算公式**Process the images iteratively(对图像进行迭代运算)NumImages := 11For Index := 1 to NumImages by 1 //for循环从1到NumImages,步长为1**Read an image and convert it to gray valuesread_image(Image,’plastics/plastics_’+Index$’02’)rgb1_to_gray(Image,Image) //将原图转化为灰度图,第一个参数为原图*Perform the convolution in the frequency domainrft_generic(Image,ImageFFT,’to_freq’,’none’,’complex’,Width)//对计算一幅图片实部进行快速傅里叶变换 //参数说明:输入的图片(Image) // 傅里叶变换后输出的图片(ImageFFT) // 变换方向(’to_freq’或’from_freq’) //变换因子的规范(’none’) // 输出图片的数据类型(’complex’) //图片的宽(Width)convol_fft(ImageFFT,Filter,ImageConvol) //对图片用一个滤波器在频域进行卷积运算 //参数说明:输入的图片(ImageFFT) // 频域滤波器(Filter) //运算后输出的结果 rft_generic(ImageConcol,ImageFiltered,’from_freq’,’n’,’real’,Width) //对滤波后的图片进行傅里叶反变换**Process the filtered imagegray_range_rect(ImageFiltered,ImageResult,10,10)//用一个矩形掩膜计算像素点的灰度范围 //参数说明:输入的图片(ImageFiltered) // 输出的灰度范围图(ImageResult) // 矩形掩膜大小(10,10)min_max_rect(ImageResult,ImageResult,0,Min,Max,Range)//判断区域内灰度值的最大和最小值 //参数说明:待分析图片区域(ImageResult) // 图片(ImageResult)// 被去除的直方图两边像素点所// 占总像素数的百分比(0)// 得到的最小值最大值及灰度值范围(Min,Max,Range)threshold(ImageResult,RegionDynThresh,max([5.55,Max*0.8]),255)//利用全局阈值对图像进行分割 //参数说明:输入的图片(ImageResult) // 分割后得到的区域(RegionDynThresh) // 阈值(max([5.55,Max*0.8]),255)// 公式:MinGray <= g <= MaxGrayconnection(RegionDynThresh,ConnectedRegions) //计算区域内的连通部分 //参数说明:输入的图片(RegionDynThresh) // 得到的连通区域(ConnectedRegions)select_shape (ConnectedRegions,SelectedRegions,’area’,’and’,4,99999)//根据指定的形态特征选择区域//参数说明:输入的图片(ConnectedRegions)// 满足条件的区域(SelectedRegions)// 将要计算的形态特征(’area’)// 独立特征间的连接关系(’and’)// 特征的最小限制(4)// 特征的最大限制(99999)union1(SelectedRegions,RegionUnion) //返回包含所有区域的集合 //参数说明:包含所有区域的待计算区域的图片(tedRegions) // 所有输入区域合(RegionUnion)closeing_circle(RegionUnion,RegionClosing,10)//用一个圆圈来封闭一个区域 //参数说明:将要被封闭的区域(RegionUnion) // 被封闭的区域(RegionClosing)// 圆圈的半径(10) connection(RegionClosing,ConnectedRegions1)select_shape(ConnectedRegions1,SelectedRegions1,’area’,’and’,10,99999)area_center(SelectedRegions1,Area,Row,Column) //计算区域的面积以及中心位置//参数说明:待计算的区域(SelectedRegions1) // 区域的面积(Area) // 区域中心的行(Row) // 区域中心的列(Column)**Display the resultsdev_display(Image) //显示原图 Number := |Area| //将区域面积赋给Number用于后面检查是否存在缺陷 if(Number)gen_circle_contour_xld(ContCircle,Row,Column,gen_tuple_const(Number,30),gen_tuple_const(Number,0), gen_tuple_const(Number,rad(360)),’positive’,1)//构造一个与设定的圆弧或圆相一致的边界//参数说明:生成的边界(ContCircle)// 圆弧或圆的中心坐标(Row,Cloumn)// 圆弧或圆的半径(gen_tuple_const(Number,30))// 圆弧或圆的起始角度(gen_tuple_const(Number,0))// 圆弧或圆的结束角度(gen_tuple_const(Number,rad(360)))// 不明白是什么意思// 相邻两点间的距离(1)ResultMessage := [‘Not OK’,Number + ‘defect(s) found’]Color := [‘red’,’black’]dev_display(ContCircle) elseResultMessage := ‘OK’Color := ‘forest green’endifdisp_message(WindowHandle,ResultMessage,’window’,12,12,Color,’ture’)if(Index#NumImages)disp_continue_message(WindowHandle,’black’,’ture’)stop()endifendfor算法讲解:在实际的表面缺陷检测系统中,针对的检测表面很多是具有一定纹理的比如:布匹、皮革、塑料等,针对这一类表面的检测就不能单纯依靠帧差或者背景差来完成,因为背景的纹理不可能和当前图像的纹理完全相同。

相关主题