You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Matlab R2016a的四步相移法相位计算问题求助

Matlab R2016a四步相移法实现问题排查

问题概述

在Matlab R2016a中实现四步相移法时,计算结果与VisuIm4程序的预期输出不符。四步相移法通过采集相位依次偏移π/2(0°、90°、180°、270°)的干涉图,利用强度信息求解相位,但两种计算方式均存在问题:

  • 先将图像转为double计算:结果明暗条纹过多,与预期差异大
  • 直接用uint8计算(仅atan2时转double):对比度极低,推测是uint8无符号特性导致负数被截断为0

原始代码

% 读取图像
I1_8 = imread('Img0.tif');
I2_8 = imread('Img90.tif');
I3_8 = imread('Img180.tif');
I4_8 = imread('Img270.tif');

% 转换为double并计算差值与商
I1 = double(I1_8); I2 = double(I2_8); I3 = double(I3_8); I4 = double(I4_8);
a1 = I4-I2;
b1 = I1-I3;
Id = a1./b1;
Id = double(Id);

% 计算反正切
dim = size(Id);
Iat = zeros(dim(1),dim(2));
for j=1:dim(2)
    for i=1:dim(1)
        Iat(i,j) = atan2(sin(Id(i,j)), cos(Id(i,j)));
    end
end

% 缩放显示图像
figure, colormap(gray(256)), imagesc(I)

问题分析与修正方案

1. 核心公式与atan2用法错误

四步相移法的标准相位计算基于以下干涉图强度公式:

I₀ = A + Bcosφ
I₉₀ = A + Bsinφ
I₁₈₀ = A - Bcosφ
I₂₇₀ = A - Bsinφ

推导可得相位φ的正确计算方式为:

phi = atan2(I90 - I270, I0 - I180);

你的代码存在两个关键错误:

  • 分子使用I4-I2,与标准公式符号相反,会导致相位反转
  • 错误使用atan2(sin(Id), cos(Id)):Id是a1./b1,先做除法会丢失象限信息,且sin(Id)和cos(Id)的参数是除法结果而非原始分子分母,完全偏离了atan2的设计逻辑(atan2(y,x)直接通过y和x的符号确定象限)

2. 冗余循环与显示错误

Matlab支持矩阵向量化运算,无需逐像素循环计算atan2;最后一行imagesc(I)中的I未定义,应改为计算得到的相位图Iat。

3. uint8计算的本质问题

uint8是无符号8位整数,减法结果为负时会被自动截断为0,导致有效相位信息丢失,因此必须先将图像转为double再进行运算。

修正后的代码

% 读取干涉图并转换为double
I0 = double(imread('Img0.tif'));    % 0°相位干涉图
I90 = double(imread('Img90.tif'));  % 90°相位干涉图
I180 = double(imread('Img180.tif'));% 180°相位干涉图
I270 = double(imread('Img270.tif'));% 270°相位干涉图

% 计算相位(标准四步相移公式)
phi = atan2(I90 - I270, I0 - I180);

% 相位归一化并显示(将[-π, π]转为[0, 1]区间适配灰度显示)
phi_normalized = (phi + pi) / (2*pi);
figure, colormap(gray(256)), imagesc(phi_normalized);
axis image off;
title('修正后的四步相移相位图');

内容的提问来源于stack exchange,提问作者Keiji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 02:17:53