基于MATLAB的四步相移干涉包裹相位提取系统
项目简介
本项目实现了一个经典的光学测量算法——四步相移干涉术(Four-Step Phase-Shifting Interferometry, PSI)。系统通过MATLAB构建,旨在演示如何从具有固定相移量的干涉条纹序列中提取高精度的包裹相位信息。
程序不仅实现了核心的相位提取算法,还包含了一个完整的干涉图模拟生成模块。该模块能够模拟真实的光学物理过程,生成带有背景光强、调制幅度变化及高斯噪声的干涉条纹。核心算法利用正交信号解调原理,通过四幅相移图像计算出对应的相位主值(Wrapped Phase),其结果呈现为特征性的锯齿状条纹,通过反正切函数严格映射在[-pi, pi]区间内。
功能特性
- 高保真干涉数据模拟:利用MATLAB内置数学函数模拟复杂波前(Peaks函数),并叠加高斯分布的背景光强与调制幅度,同时引入高斯白噪声以模拟真实的相机采集环境。
- 标准四步相移算法:实现了经典的四步相移公式,通过四幅具有pi/2(90度)连续相移的图像精确解算相位。
- 鲁棒的相位计算:采用双参数反正切函数(atan2)替代普通反正切,有效解决了象限模糊问题,并能自动处理分母为零的奇点,确保相位计算覆盖完整的2pi周期。
- 多维结果可视化:提供从原始干涉输入图、相位真值对比、误差残差分析到3D相位形貌的全方位可视化展示。
- 精度评估机制:内置误差分析模块,能够计算提取结果与理论真值之间的均方根误差(RMSE),验证算法的准确性。
系统要求
- MATLAB R2016a 或更高版本
- 无需额外的工具箱(代码仅使用了MATLAB基础函数和图像处理基础功能)
使用方法
- 启动MATLAB环境。
- 将包含主程序代码的脚本文件(通常命名为 main.m)放置于工作路径中。
- 直接运行主程序脚本。
- 程序运行后将自动生成并显示四张图表窗口,并在命令行窗口输出处理状态及误差统计信息。
实现逻辑详细说明
本项目的代码实现逻辑严格遵循光学测量的物理流程,主要分为三个步骤:
1. 数据生成模块(模拟物理过程)
程序首先构建虚拟的光学环境。定义了一个512x512的像素网格,利用MATLAB的
peaks 函数生成一个连续变化的物理相位分布作为“真值”。
- 光强模型:依据干涉公式 I = A + B * cos(phi + delta) 生成图像。
- 参数设定:背景光强 (A) 和调制幅度 (B) 被设计为高斯分布,模拟激光束的强度变化;引入随机高斯噪声以测试算法的抗噪能力。
- 相移生成:依次生成四幅干涉图 (I1, I2, I3, I4),对应的相移量 delta 分别为 0, pi/2, pi, 3pi/2。
- 预处理:生成的图像数据经过归一化处理(
mat2gray),模拟相机输出的灰度图像格式。
2. 核心算法模块(相位提取)
这是系统的处理核心,用于从光强信息反演相位信息。
- 数据转换:将图像数据转换为双精度浮点型(double),防止计算过程中的精度丢失或溢出。
- 相移公式应用:
* 计算分子项:I4 - I2,该项正比于 2B * sin(phi)。
* 计算分母项:I1 - I3,该项正比于 2B * cos(phi)。
- 相位解算:调用
atan2(numerator, denominator) 函数。利用分子分母的比值消除了背景光强 (A) 和调制幅度 (B) 的影响,直接提取出相位值。 - 异常值处理:对于因调制幅度极低导致的计算异常(NaN),程序强制将其置零,增强程序的稳定性。
3. 未视化与评估模块
程序最后生成四组可视化图表并输出统计数据:
- 图1 (输入):展示模拟生成的四幅具有不同相移量的干涉条纹图。
- 图2 (对比):并列显示理论相位真值(Ground Truth)与算法提取的包裹相位图,直观对比算法效果。
- 图3 (误差):计算提取相位与真实相位之间的残差。此处特别处理了相位周期的截断误差(利用复数指数运算),确保 -pi 与 pi 之间的跳变不会被误判为巨大误差。
- 图4 (3D):以三维曲面形式展示提取的包裹相位,呈现锯齿状的空间分布。
- 控制台输出:打印最大/最小相位值以及计算出的均方根误差(RMSE),从数值上量化算法性能。
关键算法与技术细节
代码中采用的核心公式为
phi = arctan((I4 - I2) / (I1 - I3))。这种算法是相移干涉术中最常用的算法之一,其优势在于通过差分运算有效消除了背景光强 (DC项) 的干扰,并且对探测器的灵敏度不均匀性不敏感。
代码明确使用了
atan2(Y, X) 而非
atan(Y/X)。这是相位提取中的关键细节。
atan2 利用分子和分母的符号信息,能够准确识别相位角所在的象限,从而将计算结果的范围从 [-pi/2, pi/2] 扩展到 [-pi, pi],获得正确的包裹相位。
在评估误差时,代码没有直接使用简单的线性相减(
est - true),因为相位在 2pi 处存在周期性跳变(例如 -3.14 和 3.14 在物理上非常接近,但数值差很大)。代码采用了
angle(exp(1i * (est - true))) 的方法,通过复数域的转换,正确计算了循环相位差,从而得到真实的物理误差。