photometric_stereo halcon光度立体法三维表面重建

名称: photometric_stereo -- 通过光度立体技术重建表面。

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

描述:
photometric_stereo可以用来从一个物体的两维纹理,例如它的打印照片,来区分出它的三维形状。这个算子需要至少需要三张使用已知的不同方向的光源拍摄的相同物体的图像。注意,拍摄这些照片时,相机的视角应该是固定的。(译者注:即固定相机和物体,从多个已知的不同方向打光拍摄)
物体的这种三维形状从根本上来说是通过计算3维表面的局部梯度。这些梯度可以被进一步综合起来获取到一个高度场,也就是说,一张图片的每个像素都与一个相对高度相关联。(译者注:计算得出的)二维的纹理被称为反照率,与对局部光源的吸收和反射表面特征有关,把所有的阴影都排除在外。

光照立体法的典型应用
光照立体法的典型应用是用来检测表面的变化,这种变化可能意味着缺陷,或者被用来将拍照时光照角度的影响排除在外,例如用于非扁平字符的打印检查。注意,光度立体法不适用于重建绝对高度,也就是说,它不能替代传统的3D重建算法,如对焦测距和激光三角测量。

光度立体法的局限性
光度立体法是基于Woodham算法,因此假设相机表现为无畸变的投影。这也就意味着,你必须使用一个远心镜头或者长焦镜头。另一方面,它假设了每个光源发出的都是平行的等截面的光。这也就是说,你使用的照明必须是远心光源,有着均匀的强度,或者作为替代,远距离的点光源。此外,这个物体必须有朗伯反射特性,也就是说它对光的反射是漫反射。有镜面反射的物体或者区域(镜子或者光滑的表面)不能被正确处理,会得到一个错误的结果。

照片采集设置
这个使用远心镜头的相机必须被放置得和被重建的平面正交,即互相垂直。相机和平面的角度在采集过程中一定不能改变。相反,光源和平面的夹角必须至少改变三次来获取三张灰度图片。

具体说明光照的角度
对每张图片,光线的方向用两个角度来表示,使用参数Slants和Tilts,这两个参数描述了光线和平面的方向。来理解一下这两个参数,记住,光源被假设发出的是平行光,照相机有一个远心镜头,相机被放置在重建表面的正交方向。

Slants
这个角度指的是相机的光轴和光线的夹角。如图:

Slants

Tilts
这个角度使用物体平面或者其他与之平行的平面,例如图片表面来进行测量。特别的,它描述了图片中心点向右延伸和光线方向投影到平面上的夹角。也即,当在看图片或者相关的平面时,一个0度的角意味着光从右边来,90度意味着光从顶上来,180度意味着光从左边来,等等。如图:

Tilts

正如之前所说的,光度立体法需要至少三张光线不同情况下拍摄的照片。然而,一个三维的几何体通常会有阴影。在阴影区域,光线有效方向的数量(the number of effectively available directions of illumination)被削减了,这会导致不明确(译者注:ambiguities?模棱两可?)。尽管如此,获取一个鲁棒性好的结果,赘余是需要的。因此,通常会使用超过三个不同方向的光源。但是记住,光线方向的增加,会导致更多的图片需要被处理,因此需要花费更多的处理时间。在绝大多数应用中,4-6个光源是合理的。根据经验法则,slant角度会在30°-60°之间选择。Tilt角度通常会均等得分布在被测物体的周围。请记住,光线的角度必须是经过选择的,以使得他们(译者注:他们是指?)能够不在同一平面上(即:光线的方向必须是独立的)。否则,计算会失败,程序会抛出一个异常。

输入图片和定义的区域
图片必须以一个图片数组输入。如前所述:每张图片必须是使用不同的光线角度的。如果图片是通过存储在多通道图片中的,通过 image_to_channels 可以容易地转换为图片数组。作为替代,图片数组可以通过 concat_obj 来创建。
光度立体法依赖于对光度测定信息的评估,也就是存储在图像中的灰度值。因此,这些信息应当是无偏并且是准确的。我们建议保证用来采集图像的相机有线性特征。如果有非线性特征,你可以使用算子 radiometric_self_calibration 来测定你的相机的特征,使用 lut_trans 来校正灰度信息。此外,如果需要精确的测量,我们建议运用相机的全动态范围,因为这可以获得更精确的灰度信息。为了相同的原因,使用高于8位深度(bit-depth)的图像(例如:使用uint2的图像(译者注:灰度范围065535)而不是byte(0255)类型的图像)可以带来更高的准确率。
输入图像的定义域决定了内部会使用哪一种算法来处理图像。有三种可用的算法:
* 如果整个图像都是定义域(译者注:可以理解为这张图的每个像素点都有灰度值),会使用最快的算法。这被推荐使用在大多数的应用中。
* 如果输入的图像共享了相同的削减过的定义域,只有定义域内的像素会被处理。这种模式会被用来排除图像上的某些区域。通常的,已知显示出非朗伯反射特性或者不感兴趣的区域会被排除,例如表面的孔洞。(译者注:每张图的定义域都是相同的)
* 如果提供了包含清晰定义域的图像,每张图像上包含在范围内的灰度值会被使用。只有在三张图像上拥有独立的slant和tilt角度的像素会被处理(译者注:?only those pixels are processed that have independent slant and tilt angles in at least three images)。这种模式在某些情况下是合适的,例如在图像处理时排除个别图像上的特别的区域。这些区域可能是已知的表现出非朗伯反射特性的区域或者包含了偏光信息的区域,例如影子。排除这些点可以导致更准确的结果。请注意,最后一种模式与前两种相比,显著需要更多的处理时间。(译者注:这种情况下每张图片的定义域都有可能不同)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwpdpw.html