Gerchberg-Saxton (GS) 和混合输入输出(Hybrid Input-Output, HIO)算法

文章目录

    • 1. 简介
    • 2. 算法描述
    • 3. 混合输入输出(Hybrid Input-Output, HIO)算法
      • 3.1 HIO算法步骤
      • 3.2 HIO算法的优势
      • 3.3 算法描述
    • 4. 算法实现与对比
    • 5. 总结
    • 参考文献

1. 简介

Gerchberg-Saxton (GS) 算法是一种常用于相位恢复和光学成像的迭代算法。该算法最初由R.W. Gerchberg和W.O. Saxton于1972年提出 [1],主要用于从强度测量数据中恢复相位信息。以下是该算法的基本步骤:

  1. 初始化:
    • 准备输入图像的幅度信息(通常是从实验数据中获得的强度图像,取其平方根得到幅度)。
    • 初始化相位信息,通常可以设置为随机相位或者全零相位。
  2. 频域迭代:
    • 对当前的图像(包含初始相位信息)进行傅里叶变换,得到频域图像。
    • 用实验测得的频域幅值替换频域图像的幅度,保留原相位信息。
    • 对替换后的频域图像进行逆傅里叶变换,回到空间域。
  3. 空间域迭代:
    • 用实验测得的空间域幅值替换空间域图像的幅度,保留逆傅里叶变换后得到的相位信息。
    • 将更新后的图像再次进行傅里叶变换,进入下一次迭代。
  4. 收敛判断:
    • 判断相位是否收敛,即相位变化是否在一定阈值范围内。
    • 如果达到收敛条件,则输出最终的相位信息;否则,返回步骤2继续迭代。

2. 算法描述

输入:

  • ∣ x [ n , m ] ∣ | x[ n, m] | x[n,m]:空间域的幅度信息
  • ∣ X [ k , l ] ∣ | X[ k, l] | X[k,l]​: 频域的幅度信息
  • ϵ \epsilon ϵ:误差阈值

输出:

  • z [ n , m ] z[n,m] z[n,m] -满足以下幅度约束的二维数组,即: ∣ z [ n , m ] ∣ = ∣ x [ n , m ] ∣ |z[n,m]|=|x[n,m]| z[n,m]=x[n,m] ∣ Z [ k , l ] ∣ = ∣ X [ k , l ] ∣ |Z[k,l]|=|X[k,l]| Z[k,l]=X[k,l], 其中 Z [ k , l ] Z[k,l] Z[k,l] z [ n , m ] z[n,m] z[n,m] 的离散傅里叶变换(DFT)。

初始化:

  • 选择初始 z 0 [ n , m ] = ∣ x [ n , m ] ∣ exp ⁡ ( j ϕ [ n , m ] ) z_0[n,m]=|x[n,m]|\exp(j\phi[n,m]) z0[n,m]=x[n,m]exp(jϕ[n,m]) (例如,使用随机相位 ϕ [ n , m ] \phi[n,m] ϕ[n,m])。

一般步骤 (第 i i i次迭代, i = 1 , 2 , … ) i=1,2,\ldots) i=1,2,)

  1. ​ 对 z i [ n , m ] z_i[n,m] zi[n,m] 进行二维傅里叶变换,得到 Z i [ k , l ] Z_i[k,l] Zi[k,l]

  2. ​ 保持当前傅里叶相位不变,但施加频域幅度约束: Z i ′ [ k , l ] = ∣ X [ k , l ] ∣ ⋅ Z i [ k , l ] / ∣ Z i [ k , l ] ∣ Z_i^{\prime}[k,l]=|X[k,l]|\cdot Z_i[k,l]/|Z_i[k,l]| Zi[k,l]=X[k,l]Zi[k,l]/∣Zi[k,l]

  3. ​ 对 Z i ′ [ k , l ] Z_i^{\prime}[k,l] Zi[k,l]进行二维逆傅里叶变换,得到 z i ′ [ n , m ] z_i^{\prime}[n,m] zi[n,m]

  4. ​ 保持当前空间相位不变,但施加空间域幅度约束: z i + 1 [ n , m ] = ∣ x [ n , m ] ∣ ⋅ z i ′ [ n , m ] / ∣ z i ′ [ n , m ] ∣ 。 z_{i+1}[n,m]=|x[n,m]|\cdot z_i'[n,m]/|z_i'[n,m]|\text{。} zi+1[n,m]=x[n,m]zi[n,m]/∣zi[n,m]

  5. ​ 回到步骤1。

终止条件:直到误差
E i = ∑ k , l ∥ ∣ Z i [ k , l ] ∣ − ∣ X [ k , l ] ∣ ∥ 2 ≤ ϵ E_i=\sum_{k,l}\left\|\left|Z_i[k,l]\right|-\left|X[k,l]\right|\right\|^2\leq\epsilon Ei=k,lZi[k,l]X[k,l]2ϵ

3. 混合输入输出(Hybrid Input-Output, HIO)算法

​ 混合输入输出(Hybrid Input-Output, HIO)算法是Gerchberg-Saxton (GS) 算法的一种改进版本,用于加快相位恢复的收敛速度,并解决GS算法容易陷入局部最优解的问题。HIO算法由Fienup于1982年提出 [2],通过在迭代过程中引入一种新颖的更新策略,改善了相位恢复的性能。

3.1 HIO算法步骤

  1. 初始化:

    • 与GS算法相同,准备输入图像的幅度信息和初始相位信息(随机相位或全零相位)。
  2. 频域迭代:

    • 对当前的图像(包含当前相位信息)进行傅里叶变换,得到频域图像。
    • 用实验测得的频域幅值替换频域图像的幅度,保留原相位信息。
    • 对替换后的频域图像进行逆傅里叶变换,回到空间域。
  3. 空间域更新:

    • 使用以下更新公式对空间域图像进行修正:
      z n + 1 ( x ) = { z ( x ) if  x ∈ Ω z n ( x ) − β z ( x ) if  x ∉ Ω z_{n+1}(x)=\begin{cases}z(x)&\text{if}\ x\in\Omega\\z_n(x)-\beta z(x)&\text{if}\ x\notin\Omega\end{cases} zn+1(x)={z(x)zn(x)βz(x)if xΩif x/Ω
      其中, z ( x ) z(x) z(x) 是逆傅里叶变换后的图像, z n ( x ) z_n(x) zn(x) 是上一次迭代的图像, β \beta β 是一个控制参数,通常取值在0.5到1之间, Ω \Omega Ω 是已知幅值信息的区域。
  4. 收敛判断:

    • 判断相位是否收敛,即相位变化是否在一定阈值范围内。
    • 如果达到收敛条件,则输出最终的相位信息;否则,返回步骤2继续迭代。

3.2 HIO算法的优势

  1. 更快的收敛速度:HIO算法通过引入混合输入输出的更新策略,有效避免了GS算法的局部最优解问题,通常能够更快地收敛到全局最优解。
  2. 更好的鲁棒性:由于HIO算法可以在不满足约束条件的区域进行负反馈修正,因此在处理复杂相位恢复问题时表现更为稳定。

3.3 算法描述

输入:

  • ∣ x [ n , m ] ∣ | x[ n, m] | x[n,m]:空间域的幅度信息
  • ∣ X [ k , l ] ∣ | X[ k, l] | X[k,l]: 频域的幅度信息
  • ϵ \epsilon ϵ:误差阈值
  • β \beta β :HIO算法的反馈参数

输出:

  • z [ n , m ] z[n,m] z[n,m] - 满足以下幅度约束的二维数组,即: ∣ z [ n , m ] ∣ = ∣ x [ n , m ] ∣ |z[n,m]|=|x[n,m]| z[n,m]=x[n,m] ∣ Z [ k , l ] ∣ = ∣ X [ k , l ] ∣ |Z[k,l]|=|X[k,l]| Z[k,l]=X[k,l], 其中 Z [ k , l ] Z[k,l] Z[k,l] z [ n , m ] z[n,m] z[n,m] 的离散傅里叶变换(DFT)。

初始化:

  • 选择初始 z 0 [ n , m ] = ∣ x [ n , m ] ∣ exp ⁡ ( j ϕ [ n , m ] ) z_0[n,m]=|x[n,m]|\exp(j\phi[n,m]) z0[n,m]=x[n,m]exp(jϕ[n,m]) (例如,使用随机相位 ϕ [ n , m ] \phi[n,m] ϕ[n,m])。

一般步骤 (第 i i i次迭代, i = 1 , 2 , … ) : i=1,2,\ldots): i=1,2,):

  1. z i [ n , m ] z_i[n,m] zi[n,m]进行二维傅里叶变换,得到 Z i [ k , l ] Z_i[k,l] Zi[k,l]

  2. 保持当前傅里叶相位不变,但施加频域幅度约束: Z i ′ [ k , l ] = ∣ X [ k , l ] ∣ ⋅ Z i [ k , l ] / ∣ Z i [ k , l ] ∣ Z_i^{\prime}[k,l]=|X[k,l]|\cdot Z_i[k,l]/|Z_i[k,l]| Zi[k,l]=X[k,l]Zi[k,l]/∣Zi[k,l]

  3. Z i ′ [ k , l ] Z_i^{\prime}[k,l] Zi[k,l]进行二维逆傅里叶变换,得到 z i ′ [ n , m ] z_i^{\prime}[n,m] zi[n,m]

  4. 保持当前空间相位不变,但施加空间域幅度约束,且对不满足约束的区域进行反馈修正:
    z i + 1 [ n , m ] = { ∣ x [ n , m ] ∣ ⋅ z i ′ [ n , m ] / ∣ z i ′ [ n , m ] ∣ if ∣ x [ n , m ] ∣ ≠ 0 z i [ n , m ] − β z i ′ [ n , m ] if ∣ x [ n , m ] ∣ = 0 z_{i+1}[n,m]=\begin{cases}|x[n,m]|\cdot z_i'[n,m]/|z_i'[n,m]|&\text{if}|x[n,m]|\neq0\\z_i[n,m]-\beta z_i'[n,m]&\text{if}|x[n,m]|=0\end{cases} zi+1[n,m]={x[n,m]zi[n,m]/∣zi[n,m]zi[n,m]βzi[n,m]ifx[n,m]=0ifx[n,m]=0

  5. 回到步骤1。

终止条件:直到误差
E i = ∑ k , l ∥ ∣ Z i [ k , l ] ∣ − ∣ X [ k , l ] ∣ ∥ 2 ≤ ϵ E_i=\sum_{k,l}\||Z_i[k,l]|-|X[k,l]|\|^2\leq\epsilon Ei=k,l∥∣Zi[k,l]X[k,l]2ϵ

4. 算法实现与对比

import numpy as np
import matplotlib.pyplot as plt
from skimage.data import camera, checkerboard
from skimage.transform import resize

# 加载skimage库中的示例图像
amplitude_image = camera()
phase_image = checkerboard()

# 如果振幅图像和相位图像的大小不同,调整相位图像的大小
if amplitude_image.shape != phase_image.shape:
    phase_image = resize(phase_image, amplitude_image.shape, anti_aliasing=True)

# 对振幅和相位图像进行填充
padding_width = 50
amplitude_image = np.pad(amplitude_image, pad_width=padding_width, mode='constant', constant_values=0)
phase_image = np.pad(phase_image, pad_width=padding_width, mode='constant', constant_values=0)

# 将图像归一化到[0, 1]范围内
amplitude_image = amplitude_image / np.max(amplitude_image)
phase_image = phase_image / np.max(phase_image)

# 生成复数对象
complex_obj = amplitude_image * np.exp(1j * phase_image)

# 进行傅里叶变换
ft_obj = np.fft.fft2(complex_obj)
abs_ft_obj = np.abs(ft_obj)

# 初始化相位图像
initial_phase = np.angle(np.exp(1j * np.random.rand(*amplitude_image.shape)))


# Gerchberg-Saxton (GS) 算法
def gerchberg_saxton(amplitude, initial_phase, num_iterations, epsilon):
    z = amplitude * np.exp(1j * initial_phase)
    errors = []
    for i in range(num_iterations):
        # 正向傅里叶变换
        Z = np.fft.fft2(z)

        # 计算误差并检查终止条件
        error = np.sum((np.abs(Z) - abs_ft_obj) ** 2)
        errors.append(error)
        if error <= epsilon:
            print(f'GS algorithm converged after {i + 1} iterations with error {error:.6f}')
            break

        # 在傅里叶空间中施加振幅约束
        Z = abs_ft_obj * Z / np.abs(Z)
        # 逆傅里叶变换
        z_prime = np.fft.ifft2(Z)
        # 在实空间中施加振幅约束
        z = amplitude * z_prime / np.abs(z_prime)

    final_phase = np.angle(z)
    return final_phase, errors


# Hybrid Input-Output (HIO) 算法
def hio(amplitude, initial_phase, num_iterations, beta, epsilon):
    z = amplitude * np.exp(1j * initial_phase)
    errors = []
    for i in range(num_iterations):
        # 正向傅里叶变换
        Z = np.fft.fft2(z)

        # 计算误差并检查终止条件
        error = np.sum((np.abs(Z) - abs_ft_obj) ** 2)
        errors.append(error)
        if error <= epsilon:
            print(f'HIO algorithm converged after {i + 1} iterations with error {error:.6f}')
            break

        # 在傅里叶空间中施加振幅约束
        Z = abs_ft_obj * Z / np.abs(Z)
        # 逆傅里叶变换
        z_prime = np.fft.ifft2(Z)
        # 在实空间中施加振幅约束,并引入反馈机制
        mask = (amplitude != 0)
        z = np.where(mask,
                     amplitude * z_prime / np.abs(z_prime),
                     z - beta * z_prime)

    final_phase = np.angle(z)
    return final_phase, errors


# 参数设置
num_iterations = 50
beta = 0.9
epsilon = 1e-6

# 应用GS算法
gs_phase, gs_errors = gerchberg_saxton(amplitude_image, initial_phase, num_iterations, epsilon)

# 应用HIO算法
hio_phase, hio_errors = hio(amplitude_image, initial_phase, num_iterations, beta, epsilon)

# 设置绘图的字体和字号
font = {'family': 'serif',
        'weight': 'normal',
        'size': 20}
plt.rc('font', **font)

# 显示结果
plt.figure(figsize=(12, 6))

plt.subplot(1, 3, 1)
plt.title('Original Phase')
plt.imshow(phase_image, cmap='gray')
plt.axis('off')

plt.subplot(1, 3, 2)
plt.title('GS Phase')
plt.imshow(gs_phase, cmap='gray')
plt.axis('off')

plt.subplot(1, 3, 3)
plt.title('HIO Phase')
plt.imshow(hio_phase, cmap='gray')
plt.axis('off')

plt.tight_layout()
plt.show()


# 绘制误差下降曲线
plt.figure(figsize=(12, 6))
plt.plot(gs_errors, label='GS Errors')
plt.plot(hio_errors, label='HIO Errors')
plt.xlabel('Iteration')
plt.ylabel('Error')
plt.yscale('log')
plt.title('Error Convergence')
plt.legend()
plt.show()

循环50次的结果对比如下:

在这里插入图片描述

在这里插入图片描述

5. 总结

GS算法和HIO算法都是相位检索的有效方法,各有优缺点。GS算法简单易实现,但在复杂情况下收敛较慢且易陷入局部极小值。HIO算法通过引入反馈机制加速收敛,并增强鲁棒性,但其实现相对复杂且对参数选择敏感。在实际应用中,可以根据具体问题的需求选择合适的算法,或者结合两种算法的优点进行混合使用。

参考文献

  1. R. Gerchberg and W. Saxton, “A practical algorithm for the determination of phase from image and diffraction plane pictures,” Optik, vol. 35, p. 237, 1972.
  2. Fienup J R. Phase retrieval algorithms: a comparison[J]. Applied optics, 1982, 21(15): 2758-2769.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/637121.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【抽代复习笔记】18-置换练习题(2)及两个重要定理

最近一直忙于学校的事情&#xff0c;好久没更新了&#xff0c;实在抱歉。接下来几期大概也会更得慢一些&#xff0c;望见谅。 练习4&#xff1a;写出4次对称群S4中所有置换。 解&#xff1a;由上一篇笔记结尾的定理我们知道&#xff0c;4次对称群的阶&#xff08;也就是所含元…

JSON的序列化与反序列化以及VSCode执行Run Code 报错

JSON JSON: JavaScript Object Notation JS对象简谱 , 是一种轻量级的数据交换格式。 JSON格式 { "name":"金苹果", "info":"种苹果" } 一个对象&#xff1a;由一个大括号表示.括号中通过键值对来描述对象的属性 (可以理解为, 大…

2024年 电工杯 (A题)大学生数学建模挑战赛 | 园区微电网风光储协调优化配置 | 数学建模完整代码解析

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 本次DeepVisionary带来的是电工杯的详细解读&#xff1a; 完整内容可以在文章末尾全文免费领取&阅读&#xff01; 问题重述…

MVS net笔记和理解

文章目录 传统的方法有什么缺陷吗&#xff1f;MVSnet深度的预估 传统的方法有什么缺陷吗&#xff1f; 传统的mvs算法它对图像的光照要求相对较高&#xff0c;但是在实际中要保证照片的光照效果很好是很难的。所以传统算法对镜面反射&#xff0c;白墙这种的重建效果就比较差。 …

【Python自动化测试】:Unittest单元测试与HTMLTestRunner自动生成测试用例的好帮手

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;unittest编写测试用例&#x1f680;unittest测…

【408精华知识】Cache类题目解题套路大揭秘

有关Cache的题目&#xff0c;需要理解Cache的工作原理&#xff0c;也即给出一个地址&#xff0c;要知道如何在Cache中寻找或者如何将其从主存中复制入Cache&#xff0c;同时理解Cache中具体是如何存储的&#xff0c;包含三种存储方式&#xff0c;分别是直接映射、全相联映射、组…

clion/pycharm 安装中文

楼主版本 2024.1 mac 操作系统&#xff0c;理论上不同版本和不同操作系统操作应该大同小异 首先找到插件的位置 方式一 1、进入工程&#xff0c;右上角找到设置 2、找到插件&#xff08;欢迎界面也能找到这个&#xff09; 方式二 在欢迎界面找到插件 最后 插件商店搜索 l…

矩阵乘法不满足交换律-反证法

假定有2个矩阵A和B A*B 不等于 B*A 手写证明&#xff1a; A*B为 B*A为 由此可以看出&#xff0c;矩阵乘法不满足交换律&#xff01;&#xff01;

Python | Leetcode Python题解之第100题相同的树

题目&#xff1a; 题解&#xff1a; class Solution:def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:if not p and not q:return Trueif not p or not q:return Falsequeue1 collections.deque([p])queue2 collections.deque([q])while queue1 and queue2:node…

centos7和centos8安装mysql5.6 5.7 8.0

https://dev.mysql.com/downloads/repo/yum/ 注意构造下http://repo.mysql.com/mysql-community-release-el*-*.noarch.rpm 【以centos7为例】 安装mysql5.6 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5…

初识Qt:从Hello world到对象树的深度解析

Qt中的对象树深度解析 Hello world1.图形化界面创建命令行式创建在栈上创建在堆上创建为什么传文本需要QString&#xff0c;std::string不行吗&#xff1f;那为什么要传入this指针&#xff1f;为什么new后不用显示调用delete函数呢&#xff0c;不会造成内存泄漏问题吗&#xff…

国产操作系统上使用SQLynx连接数据库 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上使用SQLynx连接数据库 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天我们将探讨如何在国产操作系统上使用SQLynx。这是一款功能强大的数据库管理工具&#xff0c;可以帮助用户高效地管理和操作数据库。本文将详细介绍…

2024 电工杯高校数学建模竞赛(A题)数学建模完整思路+完整代码全解全析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024电工杯数学建模竞赛&#xff08;B题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过程和解…

Docker搭建mysql性能测试环境

OpenEuler使用Docker搭建mysql性能测试环境 一、安装Docker二、docker安装mysql三、测试mysql连接 一、安装Docker 建立源文件vim /etc/yum.repos.d/docker-ce.repo增加内容[docker-ce-stable] nameDocker CE Stable - $basearch baseurlhttps://repo.huaweicloud.com/docker…

NLP(18)--大模型发展(2)

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 Transformer结构&#xff1a; LLM的结构变化&#xff1a; Muti-head 共享&#xff1a; Q继续切割为muti-head,但是K,V少切&#xff0c;比如切为2个&#xff0c;然后复制到n个muti-head减少参数量&#xff0c;加速训练 atte…

STM32-串口通信波特率计算以及寄存器的配置详解

您好&#xff0c;我们一些喜欢嵌入式的朋友一起建立的一个技术交流平台&#xff0c;本着大家一起互相学习的心态而建立&#xff0c;不太成熟&#xff0c;希望志同道合的朋友一起来&#xff0c;抱歉打扰您了QQ群372991598 串口通信基本原理 处理器与外部设备通信的两种方式 并行…

flume使用实例

1、监听端口a1.sources.r1.type netcat 配置文件nc-flume-console.conf # Name the components on this agent a1 表示jvm进程名 a1.sources r1 a1.sinks k1 a1.channels c1 # Describe/configure the source a1.sources.r1.type netcat a1.sources.r1.bind node…

《王者荣耀》4月狂揽2.34亿美元 单日流水1亿美元 全球销量第二

易采游戏网5月24日消息&#xff0c;在刚刚过去的四月&#xff0c;全球手游市场迎来了一场收益的盛宴&#xff0c;其中《王者荣耀》以其惊人的吸金能力&#xff0c;以2.34亿美元的月收入在全球手游排行榜上位列第二。4月5日&#xff0c;这款由腾讯游戏开发的多人在线战斗竞技游戏…

软考考前前怎么复习?

有一些经验&#xff0c;可以和大家分享一下。 软考的考试内容 软考包含许多科目&#xff0c;共分为五大类&#xff0c;27个专业。 软考的等级不同&#xff0c;考试内容也有所不同。初级和中级考试只包括两门科目&#xff0c;而高级则需要考三门科目。每门科目满分75分&#x…

knife4j-swagger

文章目录 knife4j-swagger第 1 步&#xff1a;引入 jar 包第 2 步&#xff1a;添加注释来开启 knife4j第 3 步&#xff1a;验证问题解决新增功能&#xff1a;ApiOperationSupport 注解新增功能&#xff1a;DynamicParameters 注解忽略参数属性 knife4j-swagger knife4j 是 Swa…