Halcon 光度立体法(photometric_stereo)详解

photometric_stereo

通过在项目中应用摸索算子的特性,对光度立体法有了进一步认识。基于此重新理解文档,希望文章能够帮助有疑惑的同志,同时也期望看到博客的同志如果有更深的理解以及应用技巧,共享与大家共同交流进步。另外,后续抽空用例子来解释原理。

原型

photometric_stereo(Images : HeightField, Gradient, Albedo : Slants, Tilts, ResultType, ReconstructionMethod, GenParamName, GenParamValue : )

功能

根据光度立体技术重建图像。

参数列表

Images (input_object) :输入图像(一个至少包含3张图像(每张图像光照角度不同)的图像数组)
HeightField (output_object) :根据多个图像重构的高度信息图
Gradient (output_object) :根据多个图像重构的梯度信息图
Albedo (output_object) :根据多个图像重构的反射率信息图
Slants (input_control) :文中详细说明
Tilts (input_control) :文中详细说明
ResultType (input_control) :文中说明
ReconstructionMethod (input_control) :文中说明
GenParamName (input_control) :文中说明
GenParamValue (input_control) :文中说明

详解

光度立体法可以根据二维纹理信息提取出三维模型。photometric_stereo算子至少需要三张图,这些图是在相机和物体相对位置不变条件下(Note),通过不同方向打光获取的。
物体的三维模型主要是根据三维表面的局部梯度计算提取的。三维表面的局部梯度信息可以进一步整合获得高度信息图,灰度值与高度值一一对应。二维纹理被称为反照率,它对应于物体表面局部光吸收和反射特性,被遮挡的部分没有此特性。

光度立体法的典型应用
光度立体法的典型应用是检测物体表面微小变化,例如,受打光方向影响的缺陷。比如非平面的打印检测(个人理解:普通打光方式受光线影响特征成像不理想,可以通过光度立体法检测)。值得注意的是:光度立体法不适用于绝对高度的重建,也就是说,它不能替代传统的3D重建算法,如对焦测距和激光三角测量。

光度立体法的局限性
光度立体法基于Woodham算法。因此,一方面假定相机是无畸变成像,也就是说必须使用远心镜头或者长焦镜头。另一方面假定每一个光源发射的光束都是平行且均匀的,也就是说必须使用具有均匀强度的远心照明光源,或者使用远距离的点光源代替。此外,物体必须具有朗伯反射特性,即它必须以漫反射的方式反射入射光。有镜面反射的物体或者区域(镜子或者光滑的表面)不能使用此方法,会得到一个错误的结果。

采集图像设置
带有远心镜头的相机必须与被测物体表面垂直安装,在采集多幅图像时,一定要保证相机和物体不被移动。相反,对于采集至少三张的灰度图像,其每次取像的照明方向必须改变(相对于相机)。

光照方向说明
对于采集的多张图像中的每一幅图,照明方向必须指定Slants和Tilts两个参数角度,其描述了相对于当前场景的光照角度。为了更好的理解这两个参数含义,我们假定光源射出的光束是平行光,镜头是远心镜头,相机垂直于物体表面。

Slants
在这里插入图片描述

Tilts
在这里插入图片描述

正常情况下一般都是至少采集三张不同方向打光的图。但对于一些特殊的产品,因为阴影的原因,三个方向打光不能很好的表征缺陷特征,造成重建的图像特征不明显,这个时候就需要在原来基础上增加打光方向,避免死角。随着打光方向增加采集图像也跟着增加,那么算法处理时间也变长。根据经验:(1)、4-6个不同方向打光能满足大部分应用;(2)、Slant角度一般选择30度-60度;(3)、Tilt角度通常都是均匀分布在被测物体周围,比如3个方向打光,Tilt角度应该是[0,120,240]OR[0,120,-120],4个方向打光是[0,90,180,-90]。需要注意的是,打光方向不能相同,否则重构的图像结果达不到预期效果。

输入图像和定义区域
输入图像是一个图像数组,其中每张图像都是在不同打光方向下采集的。如果采集的是多通道图像,可以通过算子 image_to_channels转换成单通道图像采集的多张图像可以通过算子concat_obj合并成一个数组图像。

光度立体法依托于对光度信息的评估,也就是图像中的灰度值。因此,图像质量的好坏决定了结果。要保证好的图像质量,首先要确保相机采集的图像具有线性特征,可以使用算子radiometric_self_calibration确认相机特性,如果相机采集的图像是非线性的,可以利用算子 lut_trans 矫正灰度信息。此外,如果需要更高精度,可以从以下两点着手:(1)、使用相机的全部动态范围;(2)、使用高于8位深度的图像(灰度范围0-65535而不是0-255类型的图像)
输入图像的定义域决定了使用哪种内部算法处理图像,有三种可用的算法:

1、如果输入图像为全局定义域,那么将会利用最快的算法处理图像。对于大多数应用都采用这种方式。

2、如果输入图像都是同一个缩小的区域,只需要处理区域内的灰度值,其他区域不处理。通常要处理区域指排除了不具有朗伯反射特性以及不感兴趣区域,比如物体表面上的孔洞。

3、以上两种方式每张图像的定义域都是相同的,而这种是每一张图像的定义域都是独立、不同的。为了提高精度,对于每张独立的图像,定义域都排除了不具有朗伯反射特性以及不感兴趣区域。但这样的代价就是需要更多的处理时间。

输出图像
算子输出重建后的梯度、反射率、以及高度场图像。
1、梯度图(矢量场)是根据对图像求偏导数获取,它可以作为算子reconstruct_height_field_from_gradient的输入。
为了视觉观看更直观,将表面梯度进行归一化处理。因此ResultType类型需要设置成“normalized_gradient”,而不是“gradient”。如果ResultType设置成默认模式“all”,处理方式是“gradient”,而不是“normalized_gradient”,所以在参数设置时要根据需要设置。

2、Albedo 图像描述的是物体的反射率,其值介于0(黑色)-1(白色)之间。因此,Albedo反应了物体表面特性。比如对于印刷表面表面,Albedo反应的是表面明暗程度的特性。HeightField 图像中每个像素值以某种关系与其高度一一对应。
默认情况下,ResultType设置成“all”。假如在应用中仅仅需要部分结果,可以通过数组的形式在‘gradient’, ‘albedo’, and ‘height_field’中选择设置ResultType参数,例如ResultType := [‘gradient’,‘albedo’]。对于特定的表面检测应用,如果只需要‘gradient’, ‘albedo’,那么将ResultType设置成‘gradient’, 'albedo’不进行三维重构(‘height_field’),
处理速度将会有效提升。

3、photometric_stereo算子首先会计算出梯度矢量场,如果需要高度场,光度立体法内部会采用reconstruct_height_field_from_gradient算子进行整合处理,通过 ReconstructionMethod, GenParamName, and GenParamValue这三个参数控制效果。如果参数ResultType参数中没有设置‘height_field’,可以忽略这三个参数。

<think>嗯,用户现在想用Halcon实现产品边缘凹痕缺陷检测。首先,我需要回顾一下之前提供的Halcon条形码识别的相关信息,但用户现在转向了缺陷检测,特别是边缘凹痕。根据用户提供的引用内容,特别是引用[2]和引用[4],里面提到了光度立体视觉和差分等方,这些可能适用于凹痕检测。 用户的需求是边缘凹痕,这可能涉及到表面缺陷,可能需要三维信息或者高对比度的图像处理。引用[2]提到使用增强的光度立体视觉方,利用阴影来检测缺口或凹痕,这应该是一个关键点。另外,引用[4]里提到的差分、频域+空间结合以及光度立体都是可能的解决方案。 接下来需要考虑用户可能的应用场景。边缘凹痕可能在制造过程中出现,比如金属件、塑料件等,检测这类缺陷需要高精度和稳定性。用户可能需要实时检测,或者离线检测,这会影响算选择和参数调整。 在Halcon中,光度立体可能需要多张不同光照条件下的图像,这对硬件布置有要求。如果用户的环境无满足多光源条件,可能需要其他方,比如基于纹理分析或模板匹配结合差分的方。另外,边缘检测结合局部阈值可能也是一个方向,特别是针对边缘区域的凹痕。 还需要考虑图像预处理步骤,比如增强对比度、去噪等,这些在之前的回答中也有提到,比如使用scale_image_max或median_image。用户可能需要先进行图像预处理,然后应用特定的缺陷检测算。 用户可能没有提到的是如何处理复杂的背景或如何区分凹痕和其他类型的缺陷,比如划痕或污点。这时候可能需要特征提取,比如计算凹痕的面积、深度或形状特征,从而进行分类。 另外,引用[3]提到的缺陷特征提取的三个部分:图像预处理、缺陷定位和特征提取,这也是一个完整的流程,需要指导用户按照这个步骤来实施。 可能还需要考虑算的实时性和处理速度,尤其是在工业生产线上。Halcon的算优化和硬件加速可能也是需要考虑的因素。 最后,用户可能需要具体的代码示例和参数设置,比如如何使用光度立体或差分,以及如何调整参数以适应不同的凹痕情况。需要确保提供的代码示例正确,并且参数可调,方便用户根据实际应用进行修改。</think>### Halcon边缘凹痕缺陷检测方详解 基于工业视觉的凹痕检测需结合三维特征分析与图像处理技术,以下为分步骤实施方案: --- #### **一、核心方选择(根据引用[2][4])** 1. **光度立体**(核心算子`photometric_stereo`) $$ \text{表面深度} \propto \frac{\text{光照强度}}{\text{反射率}} $$ 通过多角度光源图像重建表面高度场,突出凹痕阴影特征[^2]。 2. **差分+边缘分析** $$ \Delta I = |I_{\text{样本}} - I_{\text{模板}}| $$ 结合边缘提取(`edges_sub_pix`)与局部阈值分割(`dyn_threshold`),捕捉边缘形变[^4]。 --- #### **二、实现流程与代码示例** ```python * 案例:金属部件边缘凹痕检测 * 1. 图像采集与预处理 read_image (Image, 'metal_part.png') decompose3 (Image, R, G, B) // 针对彩色图像分离通道 emphasize (G, EnhancedImage, 7, 7, 2) // 增强边缘对比度 * 2. 光度立体重建表面(需3张不同光源图像) photometric_stereo (Images, HeightField, Gradient, Albedo, 'default', 'fast') // 引用[2] threshold (HeightField, DefectRegions, -0.5, 0.5) // 根据高度阈值提取凹痕 * 3. 边缘差分检测(模板比对) create_shape_model (TemplateImage, 'auto', 0, rad(360), 'auto', 'auto', 'use_polarity', ModelID) find_shape_model (EnhancedImage, ModelID, [0,0,0], rad(360), 0.7, 0, 0.5, 'least_squares', 0, Row, Column, Angle, Score) dyn_threshold (EnhancedImage, TemplateImage, DefectCandidates, 15, 'light') // 引用[4] * 4. 结果融合与特征提取 union2 (DefectRegions, DefectCandidates, FinalDefects) select_shape (FinalDefects, SelectedDefects, 'area', 'and', 100, 99999) ``` --- #### **三、参数优化关键点** 1. **光源控制**:确保多角度光源均匀性(光度立体必需) 2. **高度场阈值**:根据材料特性调整`threshold`范围(金属件常用-0.5~0.5) 3. **差分灵敏度**:`dyn_threshold`偏移量(建议10-20,根据噪声水平调整) --- #### **四、工业部署建议** 1. **硬件选型**: - 使用同轴光源减少反光干扰 - 高分辨率相机(5MP以上)捕捉微小凹痕 2. **稳定性提升**: - 添加`median_image`滤波抑制噪声 - 通过`train_dl_classifier`训练凹痕分类器(针对复杂场景)[^4] --- #### **五、官方文档指引** 1. 帮助文档搜索: - `photometric_stereo`:光度立体原理与参数说明[^2] - `dyn_threshold`:动态阈值在缺陷检测中的应用案例[^4] --- ### 相关问题 1. 如何验证光度立体重建的高度场精度? 2. 动态阈值与固定阈值在凹痕检测中的优劣对比? 3. Halcon中如何训练自定义缺陷分类模型? --- 通过结合三维重建与图像差分技术,可有效解决边缘凹痕的检测难题。实际应用中需根据材料特性调整算组合[^2][^4]。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值