基于Glodstein枝切法相位解包裹算法

一、原理

1988年Goldstein提出了采用枝切法进行相位解包裹,他先根据提取的包裹相位信息,确定所有残差点的正负极性和位置分布,再将相邻的残差点连接起来,这样就绘制形成了枝切线,连线的过程中必须满足枝切线上残差点的正负极性正好互相抵消,即枝切线上的“电荷”达到平衡,这样就保证了所选取的积分路径(即枝切线)都是环绕相互抵消的正负残差点进行积分。在设置好枝切线后,就要对包裹图中的所有像元做逐行、逐列解包裹操作,从而得到真实相位信息。详细步骤如下:

第一步:找出残差点。

第二步:绘制枝切线。在整幅包裹图内按照逐行逐列的方式计算所有的残差点,一旦计算得到第一个残差点时,就把这个残差点作为中心,建立一个3×3的闭环区域,之后再通过计算该区域所有点来确定是否还有残差点,如果该区域内计算得到其他的残差点,就把此残差点和中心残差点相连。若这两个残差点极性不同,就可以改枝切线上的“电荷” 彼此抵消,处于平衡状态,则此次枝切线绘制完成,接下来再按照上面的步骤计算新的残差点,建立新的中心点来绘制枝切线;若这两个残差点极性一样,即同正或同负,则此枝切线上的正负“电荷” 不能相互抵消,没有处于平衡状态,这时就要把该闭环区域的中心点换成第二个残差点,再继续计算。在继续计算绘制枝切线时,若计算得到的残差点同时也被其他枝切线连接,此时仍要连接这个残差点,不过在计算电荷时新的枝切线不计此点电荷;若计算得到的残差点是单独的没被其他枝切线连接,就要连接这个残差点并计算此点电荷。若在3×3的闭环区域内计算出了所有残差点但是枝切线上电荷未处于平衡状态,就要扩大计算区域,同时把枝切线的初始点设置我中心点继续上面的步骤。假如计算区域抵达包裹图边缘,此时把中心点和包裹图边缘连接来平衡电荷,截断积分路径。

第三步:根据积分路径解包裹。枝切线设置完成后,只需绕开所有枝切线对包裹相位图进行逐行逐列积分即可获得真实的相位图。

二、实验验证

2.1 仿真包裹相位图的相位解包裹

首先,通过仿真得到一幅包裹相位图,如下图所示:

在这里插入图片描述

图 1 仿真包裹相位图

对其采用Glodstein算法进行解包裹,得到的结果如下:
在这里插入图片描述

图 2 解包裹相位

在这里插入图片描述

图3 解包裹相位三维分布

运行程序时,需要选择一个已知真实相位参考点,具体操作如下动图演示:
请添加图片描述

2.2 实验包裹相位图的相位解包裹

现验证实际实验得到的包裹相位图,如下图所示:

在这里插入图片描述

图 4 实验得到的包裹相位图

根据原理中的第一步,求解得到的相位残差点如下图所示:
在这里插入图片描述

图 5 残差点计算

对于实际实验得到的含有包裹相位图,在绘制枝切线时,大约需要花120秒,结果如下图所示:
在这里插入图片描述

图 6 绘制枝切线
随后,根据积分路径解包裹,得到的结果如下,此过程大约需要花140秒左右(具体所用时间看电脑的配置)。

在这里插入图片描述

图 7 解包裹相位

三、资源获取

上述资源可从以下链接处获取:

https://download.csdn.net/download/qq_36584460/84532899

资源共包含以下内容:

1) BranchCuts.m
2) FloodFill.m
3) PhaseResidues.m
4) 基于Goldstein相位解包裹算法-仿真包裹相位.m(实例分析)
5) 基于Goldstein相位解包裹算法-仿真包裹相位-GBK格式.m(实例分析,防注释乱码格式)
6) 基于Goldstein相位解包裹算法-实验包裹相位.m(实验包裹相位分析)
7) 基于Goldstein相位解包裹算法-实验包裹相位-GBK格式.m(实验包裹相位分析-防中文注释乱码格式)
8) phase_wrapped.mat (实验包裹相位数据)
9) 操作流程演示GIF.gif

四、其他解包裹算法

此外,其他解包裹算法可参考

  1. 最小二乘法解包裹
    https://blog.csdn.net/qq_36584460/article/details/122682867

  2. 基于快速质量图导向法的相位解包裹
    https://blog.csdn.net/qq_36584460/article/details/122690728

  3. 基于最小二乘、迭代和相位梯度校正的解包裹算法
    https://blog.csdn.net/qq_36584460/article/details/123410789

最后,如有任何疑问,可私信交流讨论~简单光学技术组可提供相关技术支持!

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Goldstein枝切法相位解包算法程序的实现可以分为以下几个步骤: 1. 根据相位差值计算出相位差的梯度值。 2. 对梯度值进行高斯滤波,去除噪声。 3. 将滤波后的梯度值映射到[-π,π]范围内。 4. 采用Goldstein枝切法相位进行解包裹。 5. 将解包裹后的相位进行平滑处理,得到最终的相位解包裹结果。 下面是一个简单的Goldstein枝切法相位解包算法程序的示例: ```python import numpy as np def goldstein_unwrap(phase_diff): """Goldstein枝切法相位解包算法""" height, width = phase_diff.shape unwrapped_phase = np.zeros((height, width)) # 计算相位差的梯度值 gradient = np.gradient(phase_diff) # 对梯度值进行高斯滤波 sigma = 1 gradient = np.array([np.apply_along_axis(lambda m: np.convolve(m, np.exp(-(np.arange(-5, 6)**2)/(2.*sigma**2))/np.sum(np.exp(-(np.arange(-5, 6)**2)/(2.*sigma**2))), mode='same'), axis=0, arr=row) for row in gradient]) # 将滤波后的梯度值映射到[-π,π]范围内 gradient = np.mod(gradient+np.pi, 2*np.pi)-np.pi # 采用Goldstein枝切法相位进行解包裹 for i in range(height): for j in range(width): if j == 0: unwrapped_phase[i,j] = phase_diff[i,j] elif gradient[0][i,j] > np.pi/2: unwrapped_phase[i,j] = unwrapped_phase[i,j-1] - 2*np.pi elif gradient[0][i,j] < -np.pi/2: unwrapped_phase[i,j] = unwrapped_phase[i,j-1] + 2*np.pi else: unwrapped_phase[i,j] = unwrapped_phase[i,j-1] - gradient[0][i,j] # 将解包裹后的相位进行平滑处理 for i in range(height): unwrapped_phase[i] = np.convolve(unwrapped_phase[i], np.ones(5)/5, mode='same') return unwrapped_phase ``` 其中,phase_diff是相位差矩阵,可以根据需要自行输入。在实际应用中,还需要根据具体的情况进行参数调整和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

简单光学

您的鼓励是我创作的最大动力!

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

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

打赏作者

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

抵扣说明:

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

余额充值