halcon缺陷检测学习5孔洞缺陷inspect_blister_photometric_stereo

*光度立体技术检查药物背面的水泡是否破损。
*
*思路为:

  • 1.读入多张从不同角度拍摄的药片包装的背面图像
    
  • 2.应用光度立体法得到反照率图像和表面梯度图像
    
  • 3.使用之前得到的表面梯度,计算表面的高斯曲率,得到高斯曲率图像
    
  • 4. 对高斯曲率图像进行预处理和Blob分析,从而得到缺陷区域
    
  • 5. 在图像中标记缺陷区域
    
  • 初始化
    dev_close_window ()
    dev_update_off ()
    dev_open_window (0, 0, 512, 512, ‘black’, WindowHandle)
    *打开图形窗口。左上角坐标(0,0)宽与高(512)黑色窗体
    set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)
    *设置窗体字体
    Message := ‘Inspect the backside of a blister’
    Message[1] := ‘using photometric stereo. In this case four’
    Message[2] := ‘different light orientations were used.’
    *1.一个框里多行信息方法2.在语句外输入显示内容方法
    *提示’‘在4个不同的灯光方向图片上,使用光度立体视觉法,检查一个水泡的背面是否有缺陷’
    disp_message (WindowHandle, Message, ‘window’, 12, 12, ‘black’, ‘true’)
    *信息框,显示内容为变量,代表上面输入的内容
    disp_continue_message (WindowHandle, ‘black’, ‘true’)
    *定义提示继续运行的文本框,内容为默认
    stop ()

  • 以不同的光照显示输入图像
    read_image (Images, ‘photometric_stereo/blister_back_0’ + [1:4])

  • 下面的for循环,依次显示4张从不同角度拍摄的药片包装的背面图像
    for I := 1 to 4 by 1
    select_obj (Images, ObjectSelected, I)
    *将带有索引(从1开始)的图标对象从图标输入对象元组对象复制到输出对象。
    *输入的元组(Images)复制后的对象(ObjectSelected)要选择的对象的索引(I)
    dev_display (ObjectSelected)
    *显示复制后的对象
    disp_message (WindowHandle, ‘Acquire image ’ + I + ’ of 4’, ‘window’, 12, 12, ‘black’, ‘true’)
    *显示。获取图像是4个中第I个
    wait_seconds (0.5)
    *延迟程序的执行(0.5s)。
    endfor

  • 应用光度立体法确定反照率和表面梯度。多副有多个方向光源的图片。
    Slants := [41.4,42.6,41.7,40.9]
    *偏锋。物体平面与光照方向之间的角度(单位为度)。
    Tilts := [6.1,95.0,-176.1,-86.8]
    *倾斜。物体平面内光照方向的角度(单位为度)
    ResultType := [‘gradient’,‘albedo’]
    *输出结果的类型。[“梯度”、“反照率”].
    photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, ‘poisson’, [], [])

  • 光度立体技术重建一个表面。具有至少三个不同光照方向的输入图像数组(Images)重建的高度(HeightField)
    *表面的梯度图像(Gradient)表面的反照率图像(Albedo)参上 参上 参上 重构方法的类型(泊松分布)
    *泛型参数的类型与值(默认为空)

  • 显示反照率图像。二维纹理称为反照率,与表面的局部光吸收和反射特性相对应,不包括任何阴影效果。
    dev_display (Albedo)
    *显示反照率图像
    disp_message (WindowHandle, ‘Albedo image’, ‘window’, 12, 12, ‘black’, ‘true’)
    *文本框显示“Albedo image”
    disp_continue_message (WindowHandle, ‘black’, ‘true’)
    *同上
    stop ()

*使用gradient field作为erivate_vector_field的输入来计算曲面的高斯曲率。
*在曲率图像中缺陷通常很容易检测到。
derivate_vector_field (Gradient, GaussCurvature, 1, ‘gauss_curvature’)

  • 用高斯函数的导数卷积向量场。
    *输入向量场(Gradient)过滤后的结果图像(GaussCurvature)高斯函数的变量(1)待计算分量(高斯曲率)

*检测缺陷
*在曲率图像中分割平板区域
regiongrowing (GaussCurvature, Regions, 1, 1, 0.001, 250)
*分割图像。输入图像(GaussCurvature)分割图像(Regions)测试像素之间的垂直与水平距离(光栅的高度)(1,1)
*将灰度值差小于或等于容差的点累加到同一对象中。容差(0.001)输出区域的最小面积(250)
select_shape (Regions, TabletRegions, [‘width’,‘height’], ‘and’, [150,150], [200,200])

  • 通过宽和高的特征,进行特征选择。参数:待考察区域(Regions)满足条件的区域(TabletRegions)
    *待检查的形态特征([‘width’,‘height’])独立特征间的连接关系(’and’)特征的最小限制([150,150])特征的最大限制([200,200])
    shape_trans (TabletRegions, TabletRegions, ‘convex’)
    *改变一个区域的形状。待转换区域(TabletRegions)改变后区域(TabletRegions)类型的转换(凸出)
    union1 (TabletRegions, TabletRegions)
    *返回集合。参数:包含所有区域的待计算区域(TabletRegions)所有输入区域集合(TabletRegions)
    erosion_circle (TabletRegions, TabletRegions, 3.5)
    *具有循环结构元素的侵蚀区域。被侵蚀的区域(TabletRegions)侵蚀后的区域(TabletRegions)循环结构元素的半径(3.5)

  • 寻找平板内部的缺陷
    reduce_domain (GaussCurvature, TabletRegions, ImageReduced)
    *减少图像的域。输入域(GaussCurvature)与新定义的域(TabletRegions)的交集为图像简化的域(ImageReduced)
    abs_image (ImageReduced, ImageAbs)
    *计算区域内的绝对灰度值。需要计算绝对灰度值的区域(ImageReduced)结果(ImageAbs)
    threshold (ImageAbs, Region, 0.03, 255)
    *利用全局阈值算子分割图像。输入的图片(ImageAbs)分割后(Region)阈值(0.03,255)
    *分割后图像灰度范围:MinGray <= RegionDynThresh <= MaxGray
    closing_circle (Region, RegionClosing, 10.5)
    *用一个圆圈表示瑕疵区域。参数:含有瑕疵的区域(Region)瑕疵区域(RegionClosing)圆圈的半径(10.5)
    connection (RegionClosing, ConnectedRegions)
    *计算区域的连通分量。参数:输入的图片(RegionClosing)连接组件(ConnectedRegions)
    select_shape (ConnectedRegions, Defects, ‘area’, ‘and’, 10, 99999)
    *根据指定的形态特征选择区域。参数:输入的图片(ConnectedRegions)满足条件的区域(Defects)
    *将要计算的形态特征(’area’)独立特征间的连接关系(’and’)特征的最小限制(10)特征的最大限制(99999)
    area_center (Defects, Area, Row, Column)
    *获得缺陷区域的中心。待检查区域(Defects)选择区域的大小(Area)中心坐标(Row, Column)
    gen_circle (Circle, Row, Column,20.5)
    *gen_tuple_const(|Row|,20.5)
    *创建一个圆。生成的圆(Circle)圆心坐标索引(Row, Column)圆的半径(20.5)

  • 在曲率图像中显示缺陷
    dev_set_draw (‘margin’)
    *定义圆区域填充模式(边缘)
    dev_set_color (‘red’)
    *圆为红色
    dev_set_line_width (2)
    *圆宽2
    dev_display (GaussCurvature)
    *在窗口显示曲率图像
    dev_display (Circle)
    *在窗口显示定义的圆
    Message := ‘The defect can easily be detected’
    Message[1] := ‘in the surface curvature image’
    *文本显示的两行内容
    disp_message (WindowHandle, Message, ‘window’, 12, 12, ‘black’, ‘true’)
    stop ()

  • 在反照像中显示缺陷
    dev_set_draw (‘margin’)
    dev_set_color (‘red’)
    dev_display (Albedo)
    *在窗口显示反照率图像
    dev_display (Circle)
    *同上
    disp_message (WindowHandle, ‘Defect in albedo image’, ‘window’, 12, 12, ‘black’, ‘true’)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值