功能:光度立体法主要应用于物体表面瑕疵检测以及三维重建。本文主要讲述它在表面检测领域的应用。
对于物体表面的微小瑕疵,从不同角度打光,成像效果自然有好有坏。光度立体法基于多种角度打光的图像,计算图像的梯度
初始化
1
2
3
4
5
6
7
8
9
10dev_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 ()使用光度立体法得到曲率图,检测缺陷
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
53for 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