基于条纹投影的物体三维形貌测量理论与仿真实验-含Matlab代码

本文主要是介绍基于条纹投影的物体三维形貌测量理论与仿真实验-含Matlab代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

▒▒本文目录▒▒

  • ✳️ 一、引言
  • ✳️ 二、条纹投影原理
    • ✳️ 2.1 ==相移轮廓术==
    • ✳️ 2.2 ==傅里叶变换轮廓术==
  • ✳️ 三、仿真分析
    • ✳️ 3.1 傅里叶变换轮廓术仿真实验
      • ✳️ 3.1.1 ==Matlab代码获取==
    • ✳️ 3.2 相移轮廓术仿真实验
      • ✳️ 3.2.1 ==Matlab代码获取==
  • ✳️ 参考文献

✳️ 一、引言

基于光栅投影的光学三维面形测量具有非接触、精度高、速度快、低成本、全场测量和易于实现等特点,在逆向工程、工业检测、质量控制、虚拟现实、医学诊断、文物修复和物体识别等领域应用广泛。相移轮廓术(PSM)和傅里叶变换轮廓术(FTP)是两种传统方法。相移法计算简单,测量精度高,但对噪声比较敏感,噪声会引起解相位结果存在大量虚假2π跳变,增加了相位展开的难度,且至少需要三幅以上的条纹图像,适用于静态测量;傅里叶变换法是M.Takeda 等人在1983年提出来的,它只需要一幅条纹图案,即可恢复物体三维形貌,可用于动态物体的三维形貌测量;但由于傅里叶变换不具有局部分析的能力,频谱混叠等问题,影响了其测量精度。小波变换具有多分辨率分析特点,抑噪能力强,可分为一维小波变换轮廓术(1D WTP)和二维小波变换轮廓术(2D WTP)。小波脊提取是小波变换轮廓术的关键步骤,最大模法是常见的小波脊提取方法。

✳️ 二、条纹投影原理

✳️ 2.1 相移轮廓术

相移法的投影条纹一般为余弦条纹(或正弦),得到条纹的灰度值用下式(1)表示:
g ( x , y ) = a ( x , y ) + b ( x , y ) cos ⁡ [ 2 π f 0 x + ϕ ( x , y ) ] (1) \text{g}\left( x,y \right)=a\left( x,y \right)+b\left( x,y \right)\cos \left[ 2\pi {{f}_{0}}x+\phi \left( x,y \right) \right] \tag{1} g(x,y)=a(x,y)+b(x,y)cos[2πf0x+ϕ(x,y)](1)

式中, a ( x , y ) a\left( x,y \right) a(x,y)为背景光强值, b ( x , y ) b\left( x,y \right) b(x,y)为调制强度, f 0 {{f}_{0}} f0为载波频率, ϕ ( x , y ) \phi \left( x,y \right) ϕ(x,y)为被测物体高度调制相位。

沿着垂直于光栅条纹方向在一个周期内移动n次,n∈(3,5)。当n=3时称为三步相移法,当n=4时称为四步相移法,当n=5时称为五步相移法。以四步相移法为例,四幅带有π/2相移的灰度值函数分别用下式表示:

g 1 ( x , y ) = a ( x , y ) + b ( x , y ) cos ⁡ [ 2 π f 0 x + ϕ ( x , y ) ] g 2 ( x , y ) = a ( x , y ) + b ( x , y ) cos ⁡ [ 2 π f 0 x + ϕ ( x , y ) + π / 2 ] g 3 ( x , y ) = a ( x , y ) + b ( x , y ) cos ⁡ [ 2 π f 0 x + ϕ ( x , y ) + π ] g 4 ( x , y ) = a ( x , y ) + b ( x , y ) cos ⁡ [ 2 π f 0 x + ϕ ( x , y ) + 3 π / 2 ] (2) \begin{align} & {{g}_{1}}\left( x,y \right)=a\left( x,y \right)+b\left( x,y \right)\cos \left[ 2\pi {{f}_{0}}x+\phi \left( x,y \right) \right] \\ & {{g}_{2}}\left( x,y \right)=a\left( x,y \right)+b\left( x,y \right)\cos \left[ 2\pi {{f}_{0}}x+\phi \left( x,y \right)+{\pi }/{2}\; \right] \\ & {{g}_{3}}\left( x,y \right)=a\left( x,y \right)+b\left( x,y \right)\cos \left[ 2\pi {{f}_{0}}x+\phi \left( x,y \right)+\pi \right] \\ & {{g}_{4}}\left( x,y \right)=a\left( x,y \right)+b\left( x,y \right)\cos \left[ 2\pi {{f}_{0}}x+\phi \left( x,y \right)+3{\pi }/{2}\; \right] \\ \end{align} \tag{2} g1(x,y)=a(x,y)+b(x,y)cos[2πf0x+ϕ(x,y)]g2(x,y)=a(x,y)+b(x,y)cos[2πf0x+ϕ(x,y)+π/2]g3(x,y)=a(x,y)+b(x,y)cos[2πf0x+ϕ(x,y)+π]g4(x,y)=a(x,y)+b(x,y)cos[2πf0x+ϕ(x,y)+3π/2](2)

得到

tan ⁡ [ 2 π f 0 x + ϕ ( x , y ) ] = g 4 ( x , y ) − g 2 ( x , y ) g 1 ( x , y ) − g 3 ( x , y ) (3) \tan \left[ 2\pi {{f}_{0}}x+\phi \left( x,y \right) \right]=\frac{{{g}_{4}}\left( x,y \right)-{{g}_{2}}\left( x,y \right)}{{{g}_{1}}\left( x,y \right)-{{g}_{3}}\left( x,y \right)} \tag{3} tan[2πf0x+ϕ(x,y)]=g1(x,y)g3(x,y)g4(x,y)g2(x,y)(3)

求取反正切函数,得到:

在这里插入图片描述

式(4)反正切运算得到的相位值 包裹在(-π,π]之间,称为相位主值(或包裹相位),需要通过相位解包裹算法展开得到实际相位。

✳️ 2.2 傅里叶变换轮廓术

傅里叶变换解相位的基本原理是在频域中把代表背景光的零频分量和代表噪声的高频分量通过合适的滤波器滤除掉,剩下的是包含有用相位信息的基频分量,再对基频分量进行逆傅里叶变换,通过正切运算即可解出被测物体高度调制相位主值。

根据欧拉公式,式(1)可以(5)表示为:

g ( x , y ) = a ( x , y ) + c ( x , y ) + c ∗ ( x , y ) (5) \text{g}\left( x,y \right)=a\left( x,y \right)+c\left( x,y \right)+{{c}^{*}}\left( x,y \right) \tag{5} g(x,y)=a(x,y)+c(x,y)+c(x,y)(5)

式中:

c ( x , y ) = 1 2 b ( x , y ) exp ⁡ ( i ( 2 π f 0 x + ϕ ( x , y ) ) ) c ∗ ( x , y ) = 1 2 b ( x , y ) exp ⁡ ( − i ( 2 π f 0 x + ϕ ( x , y ) ) ) (6) \begin{align} & c\left( x,y \right)=\frac{1}{2}b\left( x,y \right)\exp \left( i\left( 2\pi {{f}_{0}}x+\phi \left( x,y \right) \right) \right) \\ & {{c}^{*}}\left( x,y \right)=\frac{1}{2}b\left( x,y \right)\exp \left( -i\left( 2\pi {{f}_{0}}x+\phi \left( x,y \right) \right) \right) \\ \end{align} \tag{6} c(x,y)=21b(x,y)exp(i(2πf0x+ϕ(x,y)))c(x,y)=21b(x,y)exp(i(2πf0x+ϕ(x,y)))(6)

沿 x 方向对式(5)采用一维傅里叶变换,得到:

G ( f ) = A ( f ) + C ( f − f 0 ) + C ∗ ( f + f 0 ) (7) \text{G}\left( f \right)=\text{A}\left( f \right)+\text{C}\left( f-{{f}_{0}} \right)+{{C}^{*}}\left( f+{{f}_{0}} \right) \tag{7} G(f)=A(f)+C(ff0)+C(f+f0)(7)

上式(7)由-1级 C ∗ ( f + f 0 ) {{C}^{*}}\left( f+{{f}_{0}} \right) C(f+f0)、0级 A ( f ) \text{A}\left( f \right) A(f)、1级 C ( f − f 0 ) \text{C}\left( f-{{f}_{0}} \right) C(ff0)三种频谱信号组成,如图0所示

在这里插入图片描述

图0 一维傅里叶变换的基频分量提取[1]

其中 A ( f ) \text{A}\left( f \right) A(f)其代表零频背景信号,而 C ( f − f 0 ) \text{C}\left( f-{{f}_{0}} \right) C(ff0) C ∗ ( f + f 0 ) {{C}^{*}}\left( f+{{f}_{0}} \right) C(f+f0)包含了所需的相位信号。这里选取 C ( f − f 0 ) \text{C}\left( f-{{f}_{0}} \right) C(ff0),逆傅里叶变换得到:

c ( x , y ) = 1 2 b ( x , y ) [ cos ⁡ ( 2 π f 0 x + ϕ ( x , y ) ) + i sin ⁡ ( 2 π f 0 x + ϕ ( x , y ) ) ] (8) c\left( x,y \right)=\frac{1}{2}b\left( x,y \right)\left[ \cos \left( 2\pi {{f}_{0}}x+\phi \left( x,y \right) \right)+i\sin \left( 2\pi {{f}_{0}}x+\phi \left( x,y \right) \right) \right] \tag{8} c(x,y)=21b(x,y)[cos(2πf0x+ϕ(x,y))+isin(2πf0x+ϕ(x,y))](8)

其实部和虚部分别为:

Re ⁡ { c ( x , y ) } = 1 2 b ( x , y ) cos ⁡ ( 2 π f 0 x + ϕ ( x , y ) ) Im ⁡ { c ( x , y ) } = 1 2 b ( x , y ) sin ⁡ ( 2 π f 0 x + ϕ ( x , y ) ) (9) \begin{align} & \operatorname{Re}\left\{ c\left( x,y \right) \right\}=\frac{1}{2}b\left( x,y \right)\cos \left( 2\pi {{f}_{0}}x+\phi \left( x,y \right) \right) \\ & \operatorname{Im}\left\{ c\left( x,y \right) \right\}=\frac{1}{2}b\left( x,y \right)\sin \left( 2\pi {{f}_{0}}x+\phi \left( x,y \right) \right) \\ \end{align} \tag{9} Re{c(x,y)}=21b(x,y)cos(2πf0x+ϕ(x,y))Im{c(x,y)}=21b(x,y)sin(2πf0x+ϕ(x,y))(9)

被测物体高度调制相位主值可以写成:

ψ ( x , y ) = Im ⁡ { c ( x , y ) } Re ⁡ { c ( x , y ) } = arctan ⁡ [ 2 π f 0 x + ϕ ( x , y ) ] (10) \begin{align} & \psi \left( x,y \right)=\frac{\operatorname{Im}\left\{ c\left( x,y \right) \right\}}{\operatorname{Re}\left\{ c\left( x,y \right) \right\}} \\ & =\arctan \left[ 2\pi {{f}_{0}}x+\phi \left( x,y \right) \right] \end{align} \tag{10} ψ(x,y)=Re{c(x,y)}Im{c(x,y)}=arctan[2πf0x+ϕ(x,y)](10)

同相移法类似,傅里叶变换法得到的相位主值也是截断的,即包裹在(-π,π]之间,需要相位解包裹才可得到实际相位。

✳️ 三、仿真分析

✳️ 3.1 傅里叶变换轮廓术仿真实验

原始待测物体及其三维形貌如图2(a)与(b)所示,模拟得到的参考条纹与变形条纹如图1(a)与©所示。分别对参考条纹与变形条纹图进行傅里叶变换,其各自频谱如图1(b)与图1(d)所示。提取+1级频谱进行居中处理后,进行逆傅里叶变换变换即可得到包裹相位信息,对其进行解包裹后进行解包裹,即可恢复出待测物体的相位信息。重构结果如图2©与(d)所示。
在这里插入图片描述

图1 模拟得到的参考条纹与变形条纹

在这里插入图片描述

图2 原始待测物体与傅里叶变换轮廓术重构物体三维形貌

✳️ 3.1.1 Matlab代码获取

傅里叶变换轮廓术仿真实验Matlab代码下载链接如下:

傅里叶变换轮廓术仿真实验

✳️ 3.2 相移轮廓术仿真实验

待测物体任然如图2(a)与(b)所示。以四步相移为例,分别获取四副参考条纹图与变形条纹图,如图3(a)-(h)所示。根据四步相移算法,可分别解调得到参考包裹相位以及目标包裹相位,如图3(i)与(j)所示。通过解包裹算法即可重构出待测物体的相位信息,其结果分别如图3(k)与(l)所示。

在这里插入图片描述

图3 相移轮廓术仿真实验结果

✳️ 3.2.1 Matlab代码获取

相移轮廓术仿真实验Matlab代码下载链接如下:

相移轮廓术仿真实验-Matlab代码

✳️ 参考文献

[1] 徐昆鹏, 王建华. 光栅投影三维测量解相位方法的对比研究[J]. 电子制作, 2022, 30(15): 64-69.


⭐️◎⭐️◎⭐️◎⭐️ · · · **博 主 简 介** · · · ⭐️◎⭐️◎⭐️◎⭐️

▁▂▃▅▆▇ 博士研究生生 ,研究方向主要涉及定量相位成像领域,具体包括干涉相位成像技术(如**全息干涉☑**、散斑干涉☑等)、非干涉法相位成像技术(如波前传感技术☑相位恢复技术☑)、此外,还对各种相位解包裹算法☑相干噪声去除算法☑等开展过深入的研究。


这篇关于基于条纹投影的物体三维形貌测量理论与仿真实验-含Matlab代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/194553

相关文章

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Java强制转化示例代码详解

《Java强制转化示例代码详解》:本文主要介绍Java编程语言中的类型转换,包括基本类型之间的强制类型转换和引用类型的强制类型转换,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录引入基本类型强制转换1.数字之间2.数字字符之间引入引用类型的强制转换总结引入在Java编程语言中,类型转换(无论

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu