相位解包裹的理论-残差点(理论转载!+代码实现)

相位解包裹是ESPI、FPP和InSAR等相位测量技术中后续处理的关键步骤,在一定程度上决定了测量结果的准确性和可靠性。国内外相关学者已经提出了很多种相位解包裹方法,其中较为广泛使用的方法主要包括枝切法、质量图引导法、最小范数法和基于图切割的相位展开法。本章主要介绍了相位解包裹的基本原理以及残差点和质量图的概念,并对上述几种相位解包裹方法的主要原理和优缺点进行了详细的介绍和分析。

1相位解包裹的基本原理

在获得相位φ的过程中,由于反正切函数得到的包裹相位被截断在主值范围[-π,π]之间且具有2π的相位跳变,所以我们必须对包裹相位进行解包裹以获得真实的相位信息。假设包裹相位图处于理想的状态,则任意两个相邻像素点的包裹相位差满足Nyquist采样定理62]。相位解包裹的具体过程为:从包裹相位图的某一点逐行逐列开始,若两个相邻点的相位差大于+π时,则相位跳变处的相位值需要减去2π;若两个相邻点的相位差小于-π时,则相位跳变处的相位值需要加上2π;若两个相邻点的相位差在-π和+π之间,则相位值不需要改变。因此,真实相位功和包裹相位p之间的关系为:

 由上式可以看出,解包裹相位中和包裹相位p之间存在2π整数倍的相位差,所以相位解包裹的本质在于如何得到整数K的值。然而,实际获得的包裹相位图通常会受到相位不连续、噪声等因素的影响,这京严重干扰了真实相位信息的恢复或重建。目前,空间相位解包裹方法得到了国内外众多学者的广泛关注和研究,这类方法的具体实现过程为:首先针对包裹朴位计算相位梯度的估计值,然后针对这个估计值进行积分以获得真实的相位。下面,本章将详细地介绍几种常用的空间相位解包裹方法。

2残差点和质量图的概念

残差点和质量图是空间相位解包裹方法中两个非常重要的概念。它们一方面可以用来指导路径跟踪法对积分路径的选择,另一方面也可以用来定义加权最小二乘法的权重值,从而可以获得较好的相位解包裹结果。

2.1残差点

由于噪声、相位不连续等因素所造成的残差点给包裹相位的展开带来了影响,所以在没有检测残差点的情况下用积分路径对包裹相位进行展开时就会引起解包裹误差的传播。为解决此问题,Goldstein等人提出了残差点(Residue)的概念43],Residue可以用来标识这些相位不可靠的区域。在如图2-1所示的某闭环区域中,按照箭头方向对相邻两点的相位差进行包裹运算,则包裹相位差分△(s=1,2,3,4)为:

其中,W是包裹算子,对任意a0有:

将公式(2-2)中的四个式子累加,得到残差点r(i,)的计算公式为:

残差点的极性具有正负之分。若r(i,j)=-2π,则(i)的极性为负,被标记为-1;若r(i,)=0,则(i,)是非残差点,被标记为0;若r(,)=2π,则(i)的极性为正,被标记为1。

计算包裹相位在图像的相位残差

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PhaseResidues.m 计算给定包裹相位图像的相位残差。
% 按照惯例,相位残差的位置被标记在 2x2 区域的左上角。
%
%   active---res4---right
%      |              |
%     res1           res3
%      |              |
%   below---res2---belowright
% 不考虑整数倍的 2*pi 的相位残差,但这种情况很少发生。
% 由 B.S. Spottiswoode 创建于 2004/10/07
% 最后修改于 2004/10/08
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function residue_charge=PhaseResidues(IM_phase, IM_mask)

[rows, cols]=size(IM_phase); % 获取相位图像的行数和列数

% 下面的代码实际上是对矩阵中 2x2 块的操作的向量化表示
IM_active = IM_phase;
IM_below  = zeros(rows,cols);      % 初始化
IM_right  = zeros(rows,cols);      % 初始化
IM_belowright = zeros(rows,cols);  % 初始化
IM_below(1:rows-1,:) = IM_phase(2:rows,:);       % 将相位图像下移一行
IM_right(:,1:cols-1) = IM_phase(:,2:cols);       % 将相位图像右移一列
IM_belowright(1:rows-1,1:cols-1) = IM_phase(2:rows,2:cols); % 右下角移动

% 计算 2x2 区域内相邻相位之间的包裹相位差
res1=mod(IM_active - IM_below + pi, 2*pi) - pi; % 将相位差包裹到 [-pi,pi] 范围内
res2=mod(IM_below - IM_belowright + pi, 2*pi) - pi;
res3=mod(IM_belowright - IM_right + pi, 2*pi) - pi;
res4=mod(IM_right - IM_active + pi, 2*pi) - pi;

% 计算相位差的和,正的残差点为 2pi,负的为 -2pi
Sum_residues=res1+res2+res3+res4;              % 计算相位差的和
residues=(Sum_residues>=6);                    % 如果 Sum_residues >= 2*pi,则残差为 1
residues=residues - (Sum_residues<=-6);        % 如果 Sum_residues <= -2pi,则残差为 -1
residues(:,cols)=0; residues(rows,:)=0;        % 将边界的残差设置为 0
residues(:,1)=0; residues(1,:)=0;              % 将边界的残差设置为 0
residue_charge=residues;                       % 最终的残差矩阵

residue_sum=sum(sum(abs(residues)));           % 计算图像中所有残差的绝对值之和
residue_sum

end

以下是函数的主要步骤和功能:

  1. 初始化和处理

    • 获取输入相位图像 IM_phase 的尺寸。
    • 初始化几个与 IM_phase 同样尺寸的矩阵,用于存储不同位置的相位值。
  2. 计算相邻像素间的相位差

    • 通过将相位图像的不同部分错位,计算相邻像素间的相位差。这些差值计算涉及当前像素、其下方像素、其右侧像素及其右下方像素。
    • 相位差被 "包裹" 到 [-π, π] 范围内,以处理 2π 的跳变。
    • mod() 函数用于计算除法的余数,其基本形式为 mod(a, m),它会返回 a 除以 m 之后的余数。对于实数 a 和正实数 m
  3. 计算相位残差

    • 计算每个 2x2 区域内的相位残差,即四个相邻差值的和。如果这个和接近 2π 或 -2π,则表明在该区域存在相位残差。
    • 正相位残差(2π)通常表示为 +1,负相位残差(-2π)表示为 -1。
  4. 处理边界情况

    • 在图像边界,相位残差被设置为 0,因为边界上无法形成完整的 2x2 区域。
  5. 输出相位残差

    • 函数返回 residue_charge,这是一个与输入相位图像同样尺寸的矩阵,其中每个元素表示相应位置的相位残差值(+1, -1 或 0)。
  6. 计算残差总和

    • residue_sum=sum(sum(abs(residues))); 这一行代码计算了图像中所有相位残差的总和,这有助于评估相位展开算法需要处理的复杂性。

这个函数在相位展开算法中尤其重要,因为相位残差通常需要被特别处理。在干涉测量中,准确地识别和处理相位残差是重构完整相位图像的关键步骤。

如果 residue_sum 等于 0,这意味着图像中没有检测到任何正的或负的相位残差。换句话说,该图像在执行相位展开算法时可能不会遇到因为残差导致的相位不连续问题。

相位残差是相位展开过程中的关键因素,特别是在采用路径依赖型相位展开算法时,如质点追踪或分支切割算法。这些残差代表了相位场中的奇异点,通常对应于相位跳变 2�2π 的位置。在实际应用中,相位残差会导致展开算法沿错误的路径展开相位,从而引入错误。

如果 residue_sum 等于 0,则有几种可能的情况:

  1. 理想情况:图像确实没有残差,意味着相位场是连续的,没有任何 2�2π 的跳变。

  2. 测量误差:实际的相位跳变可能由于噪声、低分辨率或其他测量误差被掩盖了。

  3. 数据处理问题:可能是数据处理的方式导致未能正确检测到残差点,例如,如果掩膜或其他预处理步骤不正确。

如果确实没有残差点,那么相位展开算法可以更顺利地进行,因为不需要处理相位不连续的问题。然而,如果是由于检测方法不精确或数据质量问题而未检测到残差,那么这可能会在后续的相位展开中导致问题,尤其是如果实际存在但未被检测到的残差点。

总之,residue_sum 等于 0 可能是一个好消息,表明没有残差处理的额外负担,但也需要小心考虑是否所有的残差都真的被正确识别了。在进行相位展开之前,验证残差检测的准确性是一个重要的步骤。

 欢迎留言评论,获取完整版本代码。

文章参考:周秋玲 不连续光条纹图滤波和相位解包裹方法研究及应用 天津大学 2018 年

  • 27
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论
支切法相位缠中的残差检测算法可以通过计算相邻像素相位差来判断是否为残差。下面是一个简单的C代码实现: ```c #include <stdio.h> #include <math.h> #define PI 3.14159265358979323846 // 相位缠函数 void phase_unwrapping(float *phase, int width, int height) { int x, y, k; float diff, dx, dy; float *slice; int *mask; slice = (float*) malloc(sizeof(float) * width * height); mask = (int*) malloc(sizeof(int) * width * height); // 水平方向相位展开 for (y = 0; y < height; y++) { slice[0] = phase[y * width]; mask[0] = 0; for (x = 1; x < width; x++) { diff = phase[y * width + x] - phase[y * width + x - 1]; dx = round(diff / PI); slice[x] = phase[y * width + x] - dx * 2 * PI; mask[x] = (dx != 0) ? 1 : 0; // 判断是否为残差 } for (x = 0; x < width; x++) { phase[y * width + x] = slice[x]; } } // 垂直方向相位展开 for (x = 0; x < width; x++) { slice[0] = phase[x]; mask[0] = 0; for (y = 1; y < height; y++) { diff = phase[y * width + x] - phase[(y - 1) * width + x]; dy = round(diff / PI); slice[y * width + x] = phase[y * width + x] - dy * 2 * PI; mask[y * width + x] = (dy != 0) ? 1 : 0; // 判断是否为残差 } for (y = 0; y < height; y++) { phase[y * width + x] = slice[y * width + x]; } } // 残差处理 for (y = 1; y < height - 1; y++) { for (x = 1; x < width - 1; x++) { k = y * width + x; if (mask[k] == 1) { // 判断周围的是否为残差 if (mask[k - 1] == 0 && mask[k + 1] == 0 && mask[k - width] == 0 && mask[k + width] == 0) { // 将当前相位值赋为周围的平均值 phase[k] = (phase[k - 1] + phase[k + 1] + phase[k - width] + phase[k + width]) / 4.0; } } } } free(slice); free(mask); } int main() { int width = 640, height = 480; float *phase; phase = (float*) malloc(sizeof(float) * width * height); // 假设 phase 数组已经包含了相位图像的数据 // 进行相位缠 phase_unwrapping(phase, width, height); // 处理缠后的相位图像 // ... free(phase); return 0; } ``` 在上面的代码中,我们使用一个 `mask` 数组来记录每个像素是否为残差。在相位展开过程中,如果相邻像素相位差大于一个阈值(这里取的是 $\pi$),则将该像素标记为残差。在残差处理时,我们判断周围的像素是否为残差,如果不是,则将当前像素相位值赋为周围像素的平均值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知新_ROL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值