Halcon光度立体法

article/2025/6/8 0:07:43

1、光度立体法,可用于将对象的三维形状与其二维纹理(例如打印图像)分离。需要用不同方向而且已知照明方向的多个光源,拍摄同一物体的至少三张图像。请注意,所有图像的相机视角必须相同。
物体的三维形状主要被计算为三维表面的局部梯度。这些梯度可以进一步积分以获得高度场,即像素值对应于相对高度的图像。二维纹理称为反照率,对应于表面的局部光吸收和反射特性,不包括任何阴影效果。
2、光度立体的典型应用
光度立体的典型应用是检测表面中的高度不一致的特征,例如凹坑,凸点等缺陷,或者从所使用的图像中排除光方向的影响,例如用于非平面字符的印刷检查。请注意,光度立体不适合重建绝对高度,也就是说,它不能替代典型的3D重建算法,如焦点深度或光片。
3、光度立体的局限性
PhotometricStereo基于Woodham的算法,因此一方面假设相机执行正视投影。也就是说,你必须使用远心镜头或长焦距镜头。另一方面,它假设每个光源都发出平行且均匀的光束。也就是说,您必须使用强度均匀的远心照明源,或者作为替代方案,使用远点光源。此外,物体必须具有朗伯反射特性,即它必须以漫反射的方式反射入射光。具有镜面反射特性(即镜像或光滑表面)的对象或对象区域无法正确处理,从而导致错误的结果。
4、场景设置
具有远心镜头的相机必须垂直与产品放置,即垂直于应重建的场景。在图像采集过程中,相机相对于场景的方向不得改变。相比之下,对于至少三个灰度值图像,照明相对于相机的方向必须改变。
指定照明方向
对于每张图像,照明方向必须指定为参数“倾斜”和“倾斜”中的角度,这些参数描述了照明相对于场景的方向。要理解参数“倾斜”和“倾斜”的含义,请记住,假设照明源产生平行光线,相机有一个远心透镜,相机与场景正交放置以重建:
4.1下图是光源与相机竖直方向夹角Slants
在这里插入图片描述
4.2下图是光源之间各自夹角Tilts
在这里插入图片描述
5.算子详解
5.1 photometric_stereo (根据光度立体技术重建曲面)
photometric_stereo (Images ,HeightField, Gradient, Albedo : Slant, Tilt, ResultType, ReconstructionMethod, GenParamName, GenParamValue )
参数列表:
Images:包含多个输入图像的图像元组。这些图像对应于不同光照条件下采集的物体表面图像。
HeightField:输出的高度图像。将包含根据输入图像计算得到的物体表面的高度信息。
Gradient:输出的梯度图像。将包含根据输入图像计算得到的物体表面的梯度信息。
Albedo:输出的反照率图像。将包含根据输入图像计算得到的物体表面的反照率信息。
Slant:光源倾斜角度。用于指定光源相对于物体表面的倾斜角度。
Tilt:光源倾斜角度。用于指定光源相对于物体表面的倾斜角度。
ResultType:请求结果类型。用于指定输出的结果类型,可以是高度图像、梯度图像或反照率图像。
ReconstructionMethod:重建方法。指定用于三维重建的方法,例如 “shape”(形状重建)或"normals"(法线重建)。
GenParamName:通用参数名称。用于指定其他的通用参数名称,例如标定参数、光源参数等。
GenParamValue:通用参数值。用于指定与通用参数名称对应的参数值。
5.2 derivate_vector_field (将向量场的分量与高斯函数的导数进行卷积,并计算由此得到的各种特征。在光度立体项目中,专门用于处理photometric_stereo 函数输出的重建后的梯度、反射率、以及高度场图像。)
derivate_vector_field(VectorField ,Result , Sigma, Component )
参数列表:
VectorField(in)// 梯度场图像
Result(out) // 返回平均曲率场图像
Sigma(in) // 高斯系数
Component(in) //组件计算
1.Sigma参数:
如果在Sigma中传递一个值,那么在列和行方向上的平滑量是相同的。
如果在Sigma中传递两个值,第一个值指定列方向的平滑量,第二个值指定行方向的平滑量。
2.Component参数:(有四个值可选,后两个值专用于光度立体)
curl,向量场的旋度。旋度的一个应用是分析光流场。旋度是如果向量场是流体,小船会旋转多少。
divergence,向量场的散度。“divergence”的一个应用是分析光流场。打个比方,如果向量场是流体,散度就是源和汇的位置。
mean_curvature,当输入向量场 VectorField为梯度场时,下垫面的平均曲率H。用于处理photometric_stereo返回的向量场。
gauss_curvature,当输入向量场 VectorField 为梯度场时,下垫面的高斯曲率K。用于处理photometric_stereo返回的向量场。
6、应用案例源码
dev_close_window ()
dev_update_off ()
dev_open_window (0, 0, 512, 512, ‘black’, WindowHandle)
set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)
Message := ‘Inspect the backside of a blister’
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 ()
*

  • 读取输入图像
    read_image (Images, ‘photometric_stereo/blister_back_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
  • 设置光度立体参数并运行算子

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)
    disp_message (WindowHandle, ‘Albedo image’, ‘window’, 12, 12, ‘black’, ‘true’)
    disp_continue_message (WindowHandle, ‘black’, ‘true’)
    stop ()

*计算曲面的高斯曲率
*使用梯度场作为操作员的输入
*导数向量场。
*缺陷通常很容易在曲率图像中检测到。
derivate_vector_field (Gradient, GaussCurvature, 1, ‘gauss_curvature’)
*
*检测缺陷
*
*在曲率图像中分割区域
regiongrowing (GaussCurvature, Regions, 1, 1, 0.001, 250)
select_shape (Regions, TabletRegions, [‘width’,‘height’], ‘and’, [150,150], [200,200])
shape_trans (TabletRegions, TabletRegions, ‘convex’)
union1 (TabletRegions, TabletRegions)
erosion_circle (TabletRegions, TabletRegions, 3.5)

  • Search for defects inside the tablet areas
    reduce_domain (GaussCurvature, TabletRegions, ImageReduced)
    abs_image (ImageReduced, ImageAbs)
    threshold (ImageAbs, Region, 0.03, 255)
    closing_circle (Region, RegionClosing, 10.5)
    connection (RegionClosing, ConnectedRegions)
    select_shape (ConnectedRegions, Defects, ‘area’, ‘and’, 10, 99999)
    area_center (Defects, Area, Row, Column)
    gen_circle (Circle, Row, Column, gen_tuple_const(|Row|,20.5))
  • Display the defects in curvature image
    dev_set_draw (‘margin’)
    dev_set_color (‘red’)
    dev_set_line_width (2)
    dev_display (GaussCurvature)
    dev_display (Circle)
    Message := ‘The defect can easily be detected’
    Message[1] := ‘in the surface curvature image’
    disp_message (WindowHandle, Message, ‘window’, 12, 12, ‘black’, ‘true’)
    stop ()
  • Display the defects in the albedo image
    dev_set_draw (‘margin’)
    dev_set_color (‘red’)
    dev_display (Albedo)
    dev_display (Circle)
    disp_message (WindowHandle, ‘Defect in albedo image’, ‘window’, 12, 12, ‘black’, ‘true’)

输入图像如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

输出结果图
在这里插入图片描述
在这里插入图片描述


http://www.hkcw.cn/article/EYImrJpSeb.shtml

相关文章

北方局地40℃又来了 干热烤验来临

天气即将变热,南北方的高温特点各不相同。北方是干热型高温,南方则是闷热型高温。全国大部分地区降水稀少,仅局部有雨。从今天夜间到后两天,降水预报图上将出现大片无降水区域,雨水不再是天气舞台的主要角色。气温成为焦点,南北方30℃以上的高温将连成一片,部分地区还将…

【后端架构师的发展路线】

后端架构师的发展路线是从基础开发到技术领导的系统性进阶过程,需融合技术深度、架构思维和业务洞察力。以下是基于行业实践的职业发展路径和关键能力模型: 一、职业发展阶梯‌ 初级工程师(1-3年)‌ 核心能力‌:掌…

Python爬虫监控程序设计思路

最近因为爬虫程序太多,想要为Python爬虫设计一个监控程序,主要功能包括一下几种: 1、监控爬虫的运行状态(是否在运行、运行时间等) 2、监控爬虫的性能(如请求频率、响应时间、错误率等) 3、资…

[手写系列]从0到1开发并上线Edge浏览器插件

[手写系列]从0到1开发并上线Edge浏览器插件 一、实战开发 我们将从0到1创建一个实用的"页面分析助手"插件,它可以显示当前页面的字数统计、阅读时间和主要关键词。 官方插件文档链接:https://learn.microsoft.com/zh-cn/microsoft-edge/exten…

归一化还是标准化?如何为你的数据选择最佳缩放方法

为什么你的模型需要"身高均等"? 想象一下,如果你在篮球队里同时安排了姚明(2.29米)和"小土豆"姜山(1.65米)一起打球,结果会怎样?显然,姚明会"…

JS逆向-基础入门案例(详细步骤)

一、基础入门案例AES(详细步骤) https://36kr.com/p/952011547555464 点击搜索 输入 decrypt( 看看是否有AES.decrypt( 点进去之后,打断点,打完断点之后,进行刷新 复制内容,可以在控制台输入 可以看到能获取到明文数据 创建…

项目目标和期望未被清晰传达,如何改进?

在项目管理实践中,目标模糊、期望不明、沟通渠道混乱是导致项目偏离方向、资源浪费和团队士气低落的核心原因。根据PMI《项目管理知识体系指南》(PMBOK),超过39%的项目失败源于沟通不畅。要有效解决这一问题,必须优化沟…

推荐一款PDF压缩的工具

今天一位小伙伴找来,问我有没有办法将PDF变小的办法。 详细了解了一下使用场景: 小伙伴要在某系统上传一个PDF文件,原文件是11.6MB,但是上传时系统做了限制,只能上传小于10MB的文件,如图: 我听…

以太网帧结构和封装【三】-- TCP/UDP头部信息

TCP头部用于建立可靠连接、流量控制及数据完整性校验。 Ipv4封装tcp报: Ipv6封装tcp报: UDP头部信息 UDP关键协议特性: 1)无连接:无需握手,直接发送数据。 2)不可靠性:不保证数据…

61、ESB详解

ESB(Enterprise Service Bus,企业服务总线)是一种用于集成企业内不同应用程序和系统的中间件架构,它在企业信息化建设中扮演着关键角色,以下从核心概念、架构组成、功能特性、应用场景、优势与挑战几个方面进行详解&am…

六步完成软件验收:从计划到终验的全面指南(二)

在软件开发项目中,验收环节是确保软件质量、满足客户需求并成功交付的关键步骤。本文将为您详细介绍如何通过六个步骤,从计划到终验,全面完成软件验收工作。 四、执行验收测试并记录结果 按照验收测试计划,执行相应的测试用例&am…

fdisk给磁盘扩容实录

fdisk给磁盘扩容实录 步骤 1:对 /dev/sdb 进行分区步骤 2:创建物理卷(PV)步骤 3:将物理卷添加到卷组(VG)步骤 4:扩展逻辑卷(LV)步骤 5:调整文件系统大小步骤 1:对 /dev/sdb 进行分区 使用 fdisk 工具对 /dev/sdb 进行分区,创建一个新分区。 fdisk /dev/sdb 在 fd…

AbMole| Dimethyl sulfoxide(DMSO, 二甲基亚砜)

Dimethyl sulfoxide(DMSO,二甲基亚砜)是一种常用的有机溶剂,溶解能力强,能溶于水、乙醇、丙醇、乙醚、苯和氯仿等大多数有机物,可用于化合物等产品的溶解。 一、化学性质/溶解性/储存 分子量78.13分子式C2…

多线程1(Thread)

认识线程(Thread) 在进程中,要创建一个进程和销毁一个进程所消耗的硬件和软件资源是巨大的,因此为了优化上述过程,我们引入了“线程”。 线程是系统调度的基本单位。 1)线程和进程的关系 可以认为进程包…

如何进行页面前端监控

🧑‍💻 写在开头 点赞 收藏 学会🤣🤣🤣 前端监控主要分三个方向 前端性能(用户体验优化) 异常监控 业务指标跟 下面我来分别介绍三类指标如何获取 1)前端性能指标: …

【JAVA版】意象CRM客户关系管理系统+uniapp全开源

一.介绍 CRM意象客户关系管理系统,是一个综合性的客户管理平台,旨在帮助企业高效地管理客户信息、商机、合同以及员工业绩。系统通过首页、系统管理、工作流程、审批中心、线索管理、客户管理、商机管理、合同管理、CRM系统、数据统计和系统配置等模块&…

【Python连接数据库基础 04】Django ORM开发指南:模型设计与高效查询完全攻略

Django ORM开发指南:模型设计与高效查询完全攻略 关键词:Django ORM、模型设计、数据库查询优化、Model关系、QuerySet、数据库性能、Python Web开发、ORM最佳实践 摘要:深入解析Django ORM的核心概念和高级用法,从模型设计原则到…

项目计划缺乏风险评估和应对策略,如何完善

项目计划缺乏风险评估和应对策略可通过建立风险识别机制、实施风险定性与定量评估、制定具体应对措施、建立风险监控体系、加强风险意识培训来完善。 特别是实施风险定性与定量评估,这一环节直接决定了风险的处理优先级和资源分配。通过定性评估,我们能明…

java29

1.IO流续续集 序列化流: 上传javabean类后再修改它,会报错 自己定义版本号 方便生产版本号的设置: 版本号要在javabean写完再写 综合练习: 因为不知道写进去多少个对象,因此读的时候不确定读多少次(读一次…

时代星光推出战狼W60智能运载无人机,主要性能超市场同类产品一倍!

在刚刚结束的第九届世界无人机大会上,时代星光科技发布了其全新产品战狼W60智能运载无人机,并展示了基于战狼W60无人机平台的多种应用场景解决方案。据了解,该产品作为一款多旋翼无人机,主要性能参数均远超市场同类产品&#xff0…