功能:光度立体法主要应用于物体表面瑕疵检测以及三维重建。本文主要讲述它在表面检测领域的应用。

对于物体表面的微小瑕疵,从不同角度打光,成像效果自然有好有坏。光度立体法基于多种角度打光的图像,计算图像的梯度

  1. 初始化

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dev_close_window ()
    dev_update_off ()
    dev_open_window (0, 0, 640, 512, 'black', WindowHandle)
    set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
    Message := 'Inspect the label of flooring panels'
    Message[1] := 'using photometric stereo. In this case four'
    Message[2] := 'different light orientations were used.'
    disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
    disp_continue_message (WindowHandle, 'black', 'true')
    stop ()
  2. 使用光度立体法得到曲率图,检测缺陷

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    for Index := 1 to 2 by 1
    * 不同角度打光的图像
    read_image (Images, 'photometric_stereo/flooring_' + Index + '_0' + [1:4])
    for I := 1 to 4 by 1
    Message := 'Acquire image ' + 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

    * 光照倾斜角度和光照旋转角度
    Slants := [39.4, 40.5, 39.5, 38.4]
    Tilts := [-6.0, 83.7, 172.9, -98.2]
    * 计算结果,表面梯度和反照率
    ResultType := ['gradient', 'albedo']
    * 光度立体法
    photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, 'poisson', [], [])

    dev_display (Albedo)
    disp_message (WindowHandle, 'Albedo image', 'window', 12, 12, 'black', 'true')
    disp_continue_message (WindowHandle, 'black', 'true')
    stop ()

    * 计算表面的高斯曲率,输入为梯度场,输出为均值曲率图像。
    derivate_vector_field (Gradient, MeanCurvature, 1.0, 'mean_curvature')

    * 在均值曲率图像上检测缺陷
    threshold (MeanCurvature, Region, 0.02, 1000)
    connection (Region, Defects)
    area_center (Defects, Area, Row, Column)
    gen_circle (Circle, Row, Column, sqrt(Area) + 10)

    dev_set_draw ('margin')
    dev_set_color ('red')
    dev_set_line_width (2)
    dev_display (MeanCurvature)
    dev_display (Circle)
    Message := 'The defects 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, 'Defects in albedo image', 'window', 12, 12, 'black', 'true')
    if (Index < 2)
    disp_continue_message (WindowHandle, 'black', 'true')
    stop ()
    endif
    endfor