本程序演示了使用光度立体技术对皮革样品的检查。
*输入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’)