halcon缺陷检测学习7皮革·凹痕、磨损、刮伤缺陷inspect_leather_photometric_stereo

勾炳
2023-12-01
  • 本程序演示了使用光度立体技术对皮革样品的检查。
    *输入4张皮革样本的图片,光线来自不同的方向。

  • 初始化
    dev_update_off ()
    dev_close_window ()
    dev_open_window (0, 0, 640, 480, ‘black’, WindowHandle)
    *打开窗口
    set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)
    *设置字体
    Message := ‘用光度立体法检查皮革样本’
    disp_message (WindowHandle, Message, ‘window’, 12, 12, ‘black’, ‘true’)
    *定义对话框
    disp_continue_message (WindowHandle, ‘black’, ‘true’)
    *定义提示对话框
    stop ()

  • Part 1检测凹痕,破损缺陷

  • 以不同的光照显示输入图像
    read_image (Images, ‘photometric_stereo/leather_1_0’ + [1:4])
    *循环读入图片
    for I := 1 to 4 by 1
    Message := ‘样本1:获取图像’ + I + ’ of 4’
    select_obj (Images, ObjectSelected, I)
    *将带有索引(从1开始)的图标对象从图标输入对象元组对象复制到输出对象。
    *输入的元组(Images)复制后的对象(ObjectSelected)要选择的对象的索引(I)
    dev_display (ObjectSelected)
    *显示复制的图像
    disp_message (WindowHandle, Message, ‘window’, 12, 12, ‘black’, ‘true’)
    *显示对话框
    wait_seconds (0.5)
    *暂停运行,等待结束
    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, ‘这个缺陷在反照像上很明显’, ‘window’, 12, 12, ‘black’, ‘true’)
    disp_continue_message (WindowHandle, ‘black’, ‘true’)
    *对话框与提示对话框
    stop ()

  • 缺陷检测
    var_threshold (Albedo, Region, 15, 15, 0.2, 0.05, ‘light’)
    *用局部均值和标准差分析对图像进行阈值分割。输入图像(Albedo)分割区域(Region)掩模宽度与高度(15, 15)
    *因子为灰度值的标准差(0.2)最小灰度值与均值的差值(0.05)阈值类型(‘light’)
    connection (Region, ConnectedRegions)
    *计算区域的连通分量。参数:输入的图片(Region)连接后(ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 10, 99999)
    *根据指定的形态特征选择区域。参数:输入的图片(ConnectedRegions)满足条件的区域(SelectedRegions)
    *将要计算的形态特征(’area’)独立特征间的连接关系(’and’)特征的最小限制(10)特征的最大限制(99999)
    union1 (SelectedRegions, RegionUnion)
    *返回集合。参数:包含所有区域的待计算区域(SelectedRegions)所有输入区域集合(RegionUnion)
    closing_circle (RegionUnion, RegionClosing, 5)
    *用一个圆圈表示瑕疵区域。参数:含有瑕疵的区域(RegionUnion)瑕疵区域(RegionClosing)圆圈的半径(5)
    connection (RegionClosing, Defects)
    *计算区域的连通分量。参数:输入的图片(RegionClosing)连接后(Defects)
    area_center (Defects, Area, Row, Column)
    *获得缺陷区域的中心。待检查区域(Defects)选择区域(缺陷区域)(Area)中心坐标(Row, Column)
    gen_circle (Circle, Row, Column, gen_tuple_const(|Row|,sqrt(Area) + 30))
    *创建实心圆覆盖缺陷。生成的圆(Circle)圆心坐标索引(Row, Column)圆的半径(比原区域大30)

  • 在反照率图像显示缺陷
    dev_display (Albedo)
    dev_set_color (‘red’)
    dev_set_draw (‘margin’)
    dev_set_line_width (4)
    dev_display (Circle)
    disp_message (WindowHandle, ‘缺陷在反照率图像显示结果’, ‘window’, 12, 12, ‘black’, ‘true’)
    disp_continue_message (WindowHandle, ‘black’, ‘true’)
    stop ()

  • Part 2,检测磨损无纹理缺陷

  • 以不同的光照显示输入图像
    *循环图片
    read_image (Images, ‘photometric_stereo/leather_2_0’ + [1:4])
    for I := 1 to 4 by 1
    Message := ‘样本2:获取图像 ’ + I + ’ of 4’
    select_obj (Images, ObjectSelected, I)
    dev_display (ObjectSelected)
    disp_message (WindowHandle, Message, ‘window’, 12, 12, ‘black’, ‘true’)
    wait_seconds (0.5)
    endfor

  • 应用光度立体测定反照率
    photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, ‘poisson’, [], [])
    *设置及解释参上
    threshold (Albedo, Region1, 128, 255)
    *利用全局阈值算子分割图像。输入的图片(Albedo)分割后(Region1)阈值(128,255)
    *分割后图像灰度范围:MinGray <= RegionDynThresh <= MaxGray

  • 显示反照率图像检测不出缺陷
    dev_display (Albedo)
    Message := ‘这些缺陷在反照率图像中很难检测到。’
    Message[1] := ‘因此,我们使用梯度信息来检测它们。’
    disp_message (WindowHandle, Message, ‘window’, 12, 12, ‘black’, ‘true’)
    disp_continue_message (WindowHandle, ‘black’, ‘true’)
    stop ()

  • 使用梯度信息检测纹理缺陷,寻找表面变化很小的区域。
    derivate_vector_field (Gradient, Curl, 1, ‘curl’)

  • 用高斯函数的导数卷积向量场。
    *输入向量场(Gradient)过滤后的结果图像(Curl)高斯函数的变量(1)待计算分量(旋转曲率)
    derivate_gauss (Curl, CurlGradient, 1, ‘gradient’)
    *用高斯函数的导数对图像进行卷积。
    *输入图像(Curl)过滤后的结果图像(CurlGradient)高斯函数的变量(1)待计算分量(梯度)

  • 显示梯度场旋度的变化
    dev_display (CurlGradient)
    Message := ‘梯度旋度的变化’
    disp_message (WindowHandle, Message, ‘window’, 12, 12, ‘black’, ‘true’)
    disp_continue_message (WindowHandle, ‘black’, ‘true’)
    stop ()

  • 检查磨损无纹理缺陷
    threshold (CurlGradient, Region, 0, 0.01)
    *利用全局阈值算子分割图像。输入的图片(Albedo)分割后(Region1)阈值( 0, 0.01)
    *分割后图像灰度范围:MinGray <= RegionDynThresh <= MaxGray
    rank_region (Region, RegionCount, 10, 10, 30)
    *区域的秩计算。待转换区域(Region)转换结果(RegionCount)滤镜遮罩的宽度与长度(10, 10)在遮罩内的最小点数(30)
    connection (RegionCount, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 2000, 99999)
    *根据指定的形态特征选择区域。参数:输入的图片(ConnectedRegions)满足条件的区域(SelectedRegions)
    *将要计算的形态特征(’area’)独立特征间的连接关系(’and’)特征的最小限制(2000)特征的最大限制(99999)
    union1 (SelectedRegions, RegionUnion)
    *集
    rank_region (RegionUnion, RegionCount1, 25, 25, 170)
    *秩计算
    connection (RegionCount1, NoTextured)

  • 在光照率图像显示结构缺陷
    dev_display (Albedo)
    dev_set_draw (‘margin’)
    dev_set_color (‘red’)
    dev_set_line_width (3)
    dev_display (NoTextured)
    disp_message (WindowHandle, ‘皮革上无纹理的区域’, ‘window’, 12, 12, ‘black’, ‘true’)
    stop ()

*part3 使用曲率信息检测深划痕。

*我们正在寻找高曲率的区域
derivate_vector_field (Gradient, MeanCurvature, 1, ‘mean_curvature’)

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

  • 显示表面的平均曲率
    dev_display (MeanCurvature)
    Message := ‘表面的平均曲率’
    disp_message (WindowHandle, Message, ‘window’, 12, 12, ‘black’, ‘true’)
    disp_message (WindowHandle, ‘Press F5’, ‘image’, 720, 850, ‘black’, ‘true’)
    stop ()

  • 检测划痕
    abs_image (MeanCurvature, ImageAbs)
    *计算区域内的绝对灰度值。需要计算绝对灰度值的区域(MeanCurvature)结果(ImageAbs)
    threshold (ImageAbs, Region2, 0.15, 255)
    *分割区域。阈值范围(0.15, 255)
    connection (Region2, ConnectedRegions1)
    select_shape (ConnectedRegions1, SelectedRegions1, ‘area’, ‘and’, 10, 99999)
    union1 (SelectedRegions1, RegionUnion1)
    closing_circle (RegionUnion1, RegionClosing, 1.5)
    *用一个圆圈表示瑕疵区域。参数:含有瑕疵的区域(RegionUnion1)瑕疵区域(RegionClosing)圆圈的半径(1.5)
    connection (RegionClosing, ConnectedRegions2)
    select_shape (ConnectedRegions2, SelectedRegions2, ‘max_diameter’, ‘and’, 50, 99999)
    *根据指定的形态特征选择区域。参数:输入的图片(ConnectedRegions2)满足条件的区域(SelectedRegions2)
    *将要计算的形态特征(最大直径)独立特征间的连接关系(’and’)特征的最小限制(50)特征的最大限制(99999)
    select_gray (SelectedRegions2, MeanCurvature, SelectedRegions3, ‘deviation’, ‘and’, 0.2, 255)
    *根据灰度特征选择区域。待考察的地区(SelectedRegions2)灰度值图像(MeanCurvature)选择的结果区域 (SelectedRegions3)

  • 特性的名称(偏差)特征的逻辑联系(‘and’)。选择区域灰度值的下限与上限( 0.2, 255)

  • 显示缺陷在光照率图像上
    dev_display (Albedo)
    dev_set_draw (‘margin’)
    dev_set_color (‘red’)
    dev_set_line_width (3)
    dev_display (SelectedRegions3)
    disp_message (WindowHandle, ‘深刮伤’, ‘window’, 12, 12, ‘black’, ‘true’)

 类似资料: