halcon——缺陷检测常⽤⽅法总结(光度⽴体)
引⾔
机器视觉中缺陷检测分为⼀下⼏种:
blob分析+特征
模板匹配(定位)+差分
光度⽴体
特征训练
测量拟合
频域+空间域结合:
深度学习
前⼀篇总结了频域与空间域的结合使⽤,本篇就光度⽴体的缺陷检测做⼀个总结。
光度⽴体
在⼯业领域,表⾯检测是⼀个⾮常⼴泛的应⽤领域。在halcon中,使⽤增强的光度⽴体视觉⽅法,三维表⾯检测被加强。利⽤阴影可⽅便快速的检测物体表⾯的缺⼝或凹痕。使⽤光度⽴体视觉⽅法可在复杂图像中轻松到表⾯缺陷。
适⽤场景:光度⽴体法可以看作是2.5维,适⽤于检测⾦属物料上⾯的凹凸特征。
函数原理:
1.通过photometric_stereo算⼦获得表⾯梯度图像,该算⼦可以得到表⾯梯度图像和反照率图像。需要输⼊多张从不同⾓度照明所得到的图像。
2.通过derivate_vector_field算⼦获得⾼斯(平均)曲率图像,该算⼦中需要输⼊表⾯梯度图像。
光源:光度⽴体法不需要特殊的光源,只需要从不同的⾓度打光⽽已。
1  光度⽴体法的典型应⽤:
光度⽴体法的典型应⽤是检测物体表⾯微⼩变化,例如,受打光⽅向影响的缺陷。⽐如⾮平⾯的打印检
测(个⼈理解:普通打光⽅式受光线影响特征成像不理想,可以通过光度⽴体法检测)。值得注意的是:光度⽴体法不适⽤于绝对⾼度的重建,也就是说,它不能替代传统的3D重建算法,如对焦测距和激光三⾓测量。
2  光度⽴体法的局限性:tilt
光度⽴体法基于Woodham算法。因此:
⼀⽅⾯假定相机是⽆畸变成像,也就是说必须使⽤远⼼镜头或者长焦镜头。
另⼀⽅⾯假定每⼀个光源发射的光束都是平⾏且均匀的,也就是说必须使⽤具有均匀强度的远⼼照明光源,或者使⽤远距离的点光源代替。
此外,物体必须具有朗伯反射特性,即它必须以漫反射的⽅式反射⼊射光。有镜⾯反射的物体或者区域(镜⼦或者光滑的表⾯)不能使⽤此⽅法,会得到⼀个错误的结果。
3  采集图像设置:
带有远⼼镜头的相机必须与被测物体表⾯垂直安装,在采集多幅图像时,⼀定要保证相机和物体不被移动。相反,对于采集⾄少三张的灰度图像,其每次取像的照明⽅向必须改变(相对于相机)。
光度⽴体核⼼算⼦:(注意:光度⽴体法需要使⽤灰度图,⽽且⾄少需要3张图像,最好是4张)
photometric_stereo (根据光度⽴体技术重建曲⾯)
photometric_stereo (Images ,HeightField, Gradient, Albedo : Slant, Tilt, ResultType, ReconstructionMethod, GenParamName, GenParamValue )
参数列表:
Images(in)//输⼊灰度图像(4张)
HeightField(out)//返回重建⾼度信息图
Gradient(out)//返回表⾯的梯度信息图
Albedo(out)//返回表⾯的反射率信息图
Slant//光源光线与摄像机光轴的夹⾓(下⾯有⽰意图)
Tilt//光源光线投影与被测物主轴的夹⾓
ResultType//请求结果类型(⾼度场/梯度场/反射率)
ReconstructionMethod//重建⽅法类型
GenParamName//⼀般参数名称
GenParamValue// ⼀般参数设置
photometric_stereo 函数详解:
光度⽴体法可以根据⼆维纹理信息提取出三维模型(实际只有2.5维)。photometric_stereo算⼦⾄少需要三张图(最好四张图),这些图是在相机和物体相对位置不变条件下(Note),通过不同⽅向打光获取的。
物体的三维模型主要是根据三维表⾯的局部梯度计算提取的。三维表⾯的局部梯度信息可以进⼀步整合获得⾼度信息图,灰度值与⾼度值⼀⼀对应。⼆维纹理被称为反照率,它对应于物体表⾯局部光吸收和反射特性,被遮挡的部分没有此特性。
1  光照⽅向说明:
对于采集的多张图像中的每⼀幅图,照明⽅向必须指定Slants和Tilts两个参数⾓度,其描述了相对于当前场景的光照⾓度。为了更好的理解这两个参数含义,我
们假定光源射出的光束是平⾏光,镜头是远⼼镜头,相机垂直于物体表⾯。
Slant参数:
Tilt参数:
这个⾓度是以图像为准的,⽐如光从图像右侧打过来,⾓度就是0°,从上⾯打过来,⾓度是90°,从左⾯打过来,⾓度是180°,下边打过来是270°。
正常情况下⼀般都是⾄少采集三张不同⽅向打光的图。但对于⼀些特殊的产品,因为阴影的原因,三个
⽅向打光不能很好的表征缺陷特征,造成重建的图像特征不明显,这个时候就需要在原来基础上增加打光⽅向,避免死⾓。随着打光⽅向增加采集图像也跟着增加,那么算法处理时间也变长。根据经验:
1. 4-6个不同⽅向打光能满⾜⼤部分应⽤;
2. Slant⾓度⼀般选择30度-60度;
3. Tilt⾓度通常都是均匀分布在被测物体周围,⽐如3个⽅向打光,Tilt⾓度应该是[0,120,240]OR[0,120,-120],4个⽅向打光是[0,90,180,-90]。需要注意的是,打光⽅向
不能相同,否则重构的图像结果达不到预期效果。
2  输⼊图像:
输⼊图像是⼀个图像数组,其中每张图像都是在不同打光⽅向下采集的。如果采集的是多通道图像,可以通过算⼦image_to_channels转换成单通道图像,采集的多张图像可以通过算⼦concat_obj合并成⼀个数组图像。
光度⽴体法依托于对光度信息的评估,也就是图像中的灰度值。因此,图像质量的好坏决定了结果。要保证好的图像质量,⾸先要确保相机采集的图像具有线性特征,可以使⽤算⼦radiometric_self_calibrati
on确认相机特性,如果相机采集的图像是⾮线性的,可以利⽤算⼦ lut_trans 矫正灰度信息。此外,如果需要更⾼精度,可以从以下两点着⼿:(1)、使⽤相机的全部动态范围;(2)、使⽤⾼于8位深度的图像(灰度范围0-65535⽽不是0-255类型的图像)
3  输出图像:
算⼦输出重建后的梯度、反射率、以及⾼度场图像。
1、梯度图(⽮量场)是根据对图像求偏导数获取,它可以作为算⼦reconstruct_height_field_from_gradient的输⼊。
为了视觉观看更直观,将表⾯梯度进⾏归⼀化处理。因此ResultType类型需要设置成“normalized_gradient”,⽽不是“gradient”。如果ResultType设置成默认模式“all”,处理⽅式是“gradient”,⽽不是“normalized_gradient”,所以在参数设置时要根据需要设置。
2、Albedo 图像描述的是物体的反射率,其值介于0(⿊⾊)-1(⽩⾊)之间。因此,Albedo反应了物体表⾯特性。⽐如对于印刷表⾯表⾯,Albedo反应的是表
⾯明暗程度的特性。
3,HeightField 图像中每个像素值以某种关系与其⾼度⼀⼀对应。
4  ResultType参数:
默认情况下,ResultType设置成“all”。假如在应⽤中仅仅需要部分结果,可以通过数组的形式在‘gradient’, ‘albedo’, and ‘height_field’中选择设置ResultType参
数,例如ResultType := [‘gradient’,‘albedo’]。对于特定的表⾯检测应⽤,如果只需要‘gradient’, ‘albedo’,那么将ResultType设置成‘gradient’, 'albedo’不进⾏三
维重构(‘height_field’),处理速度将会有效提升。
5  photometric_stereo 函数:
photometric_stereo算⼦⾸先会计算出梯度⽮量场,如果需要⾼度场,光度⽴体法内部会采⽤reconstruct_height_field_from_gradient算⼦进⾏整合处理,通过ReconstructionMethod, GenParamName, and GenParamValue这三个参数控制效果。如果参数ResultType参数中没有设置‘height_field’,可以忽略这三个参
数。
derivate_vector_field(处理photometric_stereo 函数输出的重建后的梯度、反射率、以及⾼度场信息图)
derivate_vector_field(VectorField ,Result , Sigma, Component )
参数列表:
VectorField(in)// 梯度场图像
Result(out)// 返回平均曲率场图像
Sigma(in)// ⾼斯系数
Component(in)//组件计算
derivate_vector_field函数详解:
将向量场的分量与⾼斯函数的导数进⾏卷积,并计算由此得到的各种特征。在光度⽴体项⽬中,专门⽤于处理photometric_stereo 函数输出的重建后的梯度、反射率、以1  Sigma参数:
如果在Sigma中传递⼀个值,那么在列和⾏⽅向上的平滑量是相同的。
如果在Sigma中传递两个值,第⼀个值指定列⽅向的平滑量,第⼆个值指定⾏⽅向的平滑量。
2  Component参数:(有四个值可选,后两个值专⽤于光度⽴体)
1. curl,向量场的旋度。旋度的⼀个应⽤是分析光流场。旋度是如果向量场是流体,⼩船会旋转多少。
2. divergence,向量场的散度。“divergence”的⼀个应⽤是分析光流场。打个⽐⽅,如果向量场是流体,散度就是源和汇的位置。
3. mean_curvature,当输⼊向量场 VectorField为梯度场时,下垫⾯的平均曲率H。⽤于处理photometric_stereo返回的向量场。
4. gauss_curvature,当输⼊向量场 VectorField 为梯度场时,下垫⾯的⾼斯曲率K。⽤于处理photometric_stereo返回的向量场。
halcon实例分析
在实际应⽤中,有些产品缺陷对光源⾓度有要求,且⽅向不固定(⽐如:带⽅向的缺陷,需要多⾓度打光才能凸显缺陷的产品)那么就可以考虑光度⽴体法。
利⽤反射率图像和梯度图像检测⽪⾰表⾯缺陷
下⾯是两种⽪⾰表⾯拍摄图像:
dev_close_window ()
dev_open_window (0, 0, 640, 480, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
* Part 1利⽤反射率图像检测⽪⾰表⾯缺陷
read_image (Images, 'photometric_stereo/leather_1_0' + [1:4])
write_image (Images, 'tiff', 0, 'D:/1.tiff')
** 展⽰不同⽅向光源成像图像
for I := 1 to 4 by 1
Message := 'Sample 1: 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
* 应⽤光度⽴体法⽣成的反射率图进⾏缺陷检测
Tilts := [6.1,95.0,-176.1,-86.8]
Slants := [41.4,42.6,41.7,40.9]
ResultType := ['gradient','albedo']
photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, 'poisson', [], []) * 显⽰反射率图
dev_display (Albedo)
*检测缺陷
var_threshold (Albedo, Region, 15, 15, 0.4, 0.4, 'light')
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10, 99999)
union1 (SelectedRegions, RegionUnion)
closing_circle (RegionUnion, RegionClosing, 3.5)
connection (RegionClosing, Defects)
area_center (Defects, Area, Row, Column)
gen_circle (Circle, Row, Column, gen_tuple_const(|Row|,sqrt(Area) + 30))
*显⽰缺陷
dev_display (Albedo)
dev_set_color ('red')
dev_set_draw ('margin')
dev_set_line_width (4)
dev_display (Circle)
* Part 2 利⽤梯度图像检测⽪⾰表⾯缺陷
read_image (Images, 'photometric_stereo/leather_2_0' + [1:4])
for I := 1 to 4 by 1
Message := 'Sample 2: 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
* 应⽤光度⽴体法⽣成的反射率图
photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, 'poisson', [], []) *对反射率图⼆值化(发现⽆法⼆值化)
threshold (Albedo, Region1, 128, 255)
* 显⽰反射率图
dev_display (Albedo)
derivate_vector_field (Gradient, Curl, 1, 'curl')
derivate_gauss (Curl, CurlGradient, 1, 'gradient')
* 显⽰梯度图
dev_display (CurlGradient)
Message := 'Changes in the gradient curl'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* ⽤梯度图寻缺陷
threshold (CurlGradient, Region, 0, 0.01)
rank_region (Region, RegionCount, 10, 10, 30)//归类区域
connection (RegionCount, ConnectedRegions)
select_shape (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, 'Non-textured areas on leather', 'window', 12, 12, 'black', 'true')
stop ()
Part1:反射率图缺陷                                                                                                    Part2:梯度图缺陷
思考:Part1利⽤反射率图检测⽪⾰表⾯缺陷,⽽Part2却利⽤梯度信息图检测缺陷,Why?
[分析]
仔细观察不难发现,Part1中的缺陷区域(左图)展现的都是⾼亮特性。缺陷特征⽐背景区域具有较⾼的反光特性,所以反射率图能很好的凸显缺陷特征,所以⽤反射率图检测缺陷。
如果⽤梯度图去检测Part1中的缺陷会怎样呢?如下图:(可以看出缺陷和纹理对⽐度很差,所以不能⽤梯度信息图检测Part1中的缺陷。)
对于Part2,可以发现,缺陷为细条状,是⽐较明显的划痕因此利⽤梯度信息图检测这种缺陷是⼀种不错的选择。
该例程的Tilts参数构建:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。