Halcon物体表面缺陷检测(detect_indent_fft)

Halcon物体表面缺陷检测(detect_indent_fft)

本例程来自于Halcon官方自带例程。最近正在学习物体缺陷检测这一块,运用的平台是Halcon。所以将该程序作为参考,进行了详细注释。本人作为菜鸟,有些地方理解可能不到位,如有不对,希望大家指出,一起交流讨论,共同进步。

dev_update_off ()
*关闭窗口更新
dev_close_window ()
*关闭活动图形窗口,打开几个就关闭几个相对应的打开活动窗口是dev_open_window ()
read_image (Image, 'plastics/plastics_01')  
*读取图片,read_image( : Image : FileName : )第一个参数是输出变量,表示所读取的图片命名为Image,第二个参数是输入变量,所读取图片所在的路径
get_image_size (Image, Width, Height)
*获取图片的大小,get_image_size(Image : : : Width, Height)第一个变量是图片变量,第二、第三个表示获取图片的宽和高。
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
*打开一个新的窗口。dev_open_window( : : Row, Column, Width, Height, Background : WindowHandle)第一第二个参数表示窗口左上角的行和列,默认值为0.
*第三第四个参数表示窗口的宽和高。Background:窗口背景颜色。WindowHandle:窗口句柄
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
*设置显示字体格式与大小。set_display_font( : : WindowHandle, Size, Font, Bold, Slant : )WindowHandle:窗口句柄。Size:字体大小。
*font:字体格式。 Bold:是否加粗,默认值为true。Slant:是否斜体,默认值为false
dev_set_draw ('margin')
*设置区域的填充模式。默认值为fill,表示填充区域,若填入参数为'margin'表示填充轮廓,即只显示轮廓
dev_set_line_width (3)
*设置输出显示线宽。dev_set_line_width( : : LineWidth : )参数默认值LineWidth为1,其数值大小应>=1.如果区域用边缘表达,则表示边缘大小为LineWidth的数值
dev_set_color ('red')
*设置输出显示颜色,默认值为white
* 
* Optimize the fft speed for the specific image size--针对特定图像尺寸优化fft速度
optimize_rft_speed (Width, Height, 'standard')
*实现Width*Height图片执行fft变换的最优时间.optimize_rft_speed( : : Width, Height, Mode : )可以使用Width和Height的不同值多次调用optimize_rft_speed,以实现应用程序中使用的所有图像大小的最佳运行时间
*Mode有三个参数可选择。'standard':快速搜索,运行时间快,但不是最佳。 'patient' :详细搜索,运行时间较慢。exhaustive':彻底详细搜素。运行速度更慢。
*在大多数应用中,Mode =“ standard”会导致实值FFT的运行时间与搜索最佳运行时间所需的时间之间达到最佳折衷。

*Construct a suitable filter by combining two gaussian---结合两个高斯构造一个合适的滤波
* filters
Sigma1 := 10.0
Sigma2 := 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)
*实现高斯滤波。gen_gauss_filter( : ImageGauss : Sigma1, Sigma2, Phi, Norm, Mode, Width, Height : )Sigma1和Sigma2确定 高斯在空间域中的标准偏差(即平滑量)。
*Sigma1:空域中高斯在主方向上的标准差[Sigma1 >= 0] Sigma2:空域中高斯在正交于主方向的方向上的标准差[Sigma2 >= 0]
*Phi:角度,滤波器在空间域的方向,默认值为0.Norm:滤波器归一化因子。
*Mode:滤波模式,可选参数为dc_center'(中心滤波), 'dc_edge'(边缘滤波), 'rft'(实值快速傅里叶变换)。默认值为dc_center.
sub_image (GaussFilter1, GaussFilter2, Filter, 1, 0)
*实现减操作.两图片相减(灰度)。公式计算:g' := (g1 - g2) * Mult + Add    图像灰度值(g1,g2) 
* 
* Process the images iteratively----迭代处理图像
NumImages := 11
for Index := 1 to NumImages by 1
    * 循环遍历图像
    * Read an image and convert it to gray values
    read_image (Image, 'plastics/plastics_' + Index$'02')
    rgb1_to_gray (Image, Image)
    *将图片变成灰度图.
    * Perform the convolution in the frequency domain————频域卷积
    rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
    *对图像进行实值快速傅里叶变换。rft_generic(Image : ImageFFT : Direction, Norm, ResultType, Width : )Image :输入图像。ImageFFT :快速傅里叶变换后输出图像
    * Direction:变换方向,'from_freq', 'to_freq'。 Norm:变换因子的规范。ResultType:输出图片类型。Width:优化运行时图片的宽。
    convol_fft (ImageFFT, Filter, ImageConvol)
    *实现频域卷积。convol_fft(ImageFFT, ImageFilter : ImageConvol : : )ImageFFT:输入图像。ImageFilter:滤波处理。ImageConvol:卷积后图像。
    rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
    *反变换
    * 
    * Process the filtered image
    gray_range_rect (ImageFiltered, ImageResult, 10, 10)
    *用一个矩形掩膜计算像素点的灰度范围。gray_range_rect(Image : ImageResult : MaskHeight, MaskWidth : )Image:输入图像。ImageResult:输出的灰度图值范围。MaskHeight, MaskWidth:矩形掩模大小。
    min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)
    *判断区域内灰度值的最大和最小值.min_max_gray(Regions, Image : : Percent : Min, Max, Range)Regions:分析计算的图片区域。Image :输入灰度值图片。Percent:被去除的直方图两边像素点所占总像素数的百分比(0)
    *Min, Max, Range:得到的最小值最大值及灰度值范围(Min,Max,Range)
    threshold (ImageResult, RegionDynThresh, max([5.55,Max * 0.8]), 255)
    *二值化,采用全局阈值。threshold(Image : Region : MinGray, MaxGray : )Image : 输入图像。Region :分割后得到的区域。 MinGray, MaxGray : 阈值门限的最大和最小灰度值。
    connection (RegionDynThresh, ConnectedRegions)
    *计算区域连通部分。
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 4, 99999)
    *根据特定的形态特征选择区域。select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : )Regions :待选区域。SelectedRegions :满足条件的区域。Min, Max :特征参数最大,最小限制。
    *Features:要计算的形态特征。常用的有 'area', 'column', 'column1', 'column2', 'row', 'row1', 'row2', 'struct_factor', 'width'. Operation:独立特征间的连接关系( 'and', 'or')。
    union1 (SelectedRegions, RegionUnion)
    *联合,将所有区域变成一个整体。
    closing_circle (RegionUnion, RegionClosing, 10)
    *进行闭运算(先膨胀后腐蚀),选择圆形作为结构元素。closing_circle(Region : RegionClosing : Radius : )Radius :结构元素的半径
    connection (RegionClosing, ConnectedRegions1)
    select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 10, 99999)
    area_center (SelectedRegions1, Area, Row, Column)
    * 计算区域面积和中心位置。area_center(Regions : : : Area, Row, Column)Area:区域面积。 Row, Column:区域中心的行和列
    
    * Display the results
    dev_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)
        *构造一个与设定的圆弧或闭合圆相一致的边界。gen_circle_contour_xld( : ContCircle : Row, Column, Radius, StartPhi, EndPhi, PointOrder, Resolution : )ContCircle :生成的边界轮廓
        *Row, Column:圆或圆弧的中心坐标。Radius:圆或圆弧的半径。StartPhi, EndPhi:圆弧或圆的起始和终止角度。PointOrder:沿圆弧或圆点的顺序('negative', 'positive')。Resolution :相邻两个轮廓点的距离
        *gen_tuple_const(a,b)函数:创建一个具有a个元素的,每个元素都为b的数据
        ResultMessage := ['Not OK',Number + ' defect(s) found']
        Color := ['red','black']
        dev_display (ContCircle)
        *显示边界轮廓信息
    else
        ResultMessage := 'OK'
        Color := 'forest green'
    endif
    disp_message (WindowHandle, ResultMessage, 'window', 12, 12, Color, 'true')
    if (Index != NumImages)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值