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

news2024/9/9 5:29:49

文章目录

    • 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.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习-转置卷积

转置卷积 转置卷积&#xff08;Transposed Convolution&#xff09;&#xff0c;也被称为反卷积&#xff08;Deconvolution&#xff09;&#xff0c;是深度学习中的一种操作&#xff0c;特别是在卷积神经网络&#xff08;CNN&#xff09;中。它可以将一个低维度的特征图&#x…

shell快捷命令与正则表达式

一.高效快捷命令 1.快捷排序——sort 以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型来排序比较原则是从首字符向后&#xff0c;依次按ASCII码值进行比较&#xff0c;最后将他们按升序输出。 语法格式 sort [选项] 参数 cat file | sort 选项 -n 按照数…

LeetCode-102. 二叉树的层序遍历【树 广度优先搜索 二叉树】

LeetCode-102. 二叉树的层序遍历【树 广度优先搜索 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;一个全局队列queue&#xff0c;while queue&#xff1a;去搜集当前所有queue的level解题思路二&#xff1a;背诵版解题思路三&#xff1a; 题目描述&#xff1a; 给你二…

modelbox验证expand和condition共用后,是否顺序保持

如图&#xff0c;在expand之后接了个condition&#xff0c;上下两个流中每一对数据buffer的顺序性是否还会保持&#xff1f; 笔者修改让condition在遇到奇数和偶数时的走向不同。 然后在response单元输出每一对数据&#xff0c;发现顺序都不变。且在处理时&#xff0c;输出会卡…

文件系统--inode

文章目录 概述认识磁盘了解磁盘的存储结构对磁盘的存储结构进行逻辑抽象 操作系统对磁盘的使用宏观认识细节认识再谈目录再谈文件的增删 概述 文件有很多&#xff0c;但是被打开的文件很少&#xff0c;这些没有被打开的文件在磁盘中&#xff0c;这就叫做磁盘文件。每次先打开一…

用眼某星的名片识别与手工录入名片数据的效率及效果对比

OCR名片识别技术&#xff0c;作为现代信息处理领域的一项创新技术&#xff0c;已经逐渐取代了传统的名片管理方式&#xff0c;成为商务人士不可或缺的工具。本文将从OCR名片识别的特点与优势出发&#xff0c;详细阐述其相较于传统人工处理名片的显著差别&#xff0c;并揭示其在…

在chrome中查找和验证xpath

1、快速获取XPath表达式 按F12打开chrome浏览器的开发者模式&#xff0c;点击选择光标&#xff0c;选择页面上的元素位置&#xff0c;在控制台右键选择Copy XPath&#xff0c;表达式就复制到粘贴板中了。 获取到的xpath路径&#xff1a;//*[id"hotsearch-content-wrapper…

护目镜佩戴自动识别预警摄像机

护目镜佩戴自动识别预警摄像机是一种智能监测设备&#xff0c;专门用于佩戴护目镜的工人进行作业时&#xff0c;能够自动识别有潜在风险的场景&#xff0c;并及时发出预警信号。该摄像机配备人脸识别和智能预警系统&#xff0c;可以检测危险情况并为工人提供实时安全保护&#…

【qt】标准项模型

标准项模型 一.使用标准型项模型1.应用场景2.界面拖放3.创建模型4.配套模型5.视图设置模型6.视图属性的设置 二.从文件中拿到数据1.文件对话框获取文件名2.创建文件对象并初始化3.打开文件对象4.创建文本流并初始化5.读取文本流6.关闭文件7.完整代码 三.为模型添加数据1.自定义…

Java 对外API接口开发 java开发api接口如何编写

Java API API&#xff08;Application Programming Interface&#xff09;是指应用程序编程接口&#xff0c;的JavaAPI是指JDK提供的各种功能的Java类 String类 String类的初始化&#xff1a; &#xff08;1&#xff09;使用字符串常量直接初始化 初始化&#xff1a;String s…

沃通国密根证书入根红莲花浏览器,共建国密HTTPS应用生态

近日&#xff0c;沃通CA与海泰方圆红莲花安全浏览器进一步达成合作&#xff0c;沃通新增国密根证书入根红莲花安全浏览器。此次入根合作&#xff0c;标志着沃通国密数字证书产品兼容性再次得到提升&#xff0c;进一步夯实国密应用根基。 沃通CA入根红莲花浏览器&#xff0c;自动…

什么是谷歌留痕?

其实它就是指你的网站在谷歌中留下的种种痕迹&#xff0c;无论你是在做外链&#xff0c;还是优化网站内容&#xff0c;或是改善用户体验&#xff0c;所有这些都会在谷歌的搜索引擎里留下一些“脚印”&#xff0c;用比较seo一点的说法&#xff0c;指的是网站在其构建和优化过程中…

ARM|DSP+FPGA+NVIDIA AI摄像头定制

信迈拥有高性能的摄像头全栈能力&#xff1a;掌握车载模组光学设计能力&#xff0c;具有多名经验丰富光学设计专家&#xff1b;具备丰富的车载摄像模组硬件设计经验&#xff1b;掌握目前市面上大部分车载平台的ISP图像画质服务能力&#xff0c;能自主开发图像ISP和增强算法&…

大厂程序员离职,开发一个盲盒小程序2万,一周开发完!

大家好&#xff0c;我是程序员小孟&#xff01; 前面接了一个盲盒的小程序&#xff0c;主要的还是商城&#xff0c;盲盒的话只是其中的有一个活动。 现在的年轻人是真的会玩&#xff0c;越来越新的东西出来&#xff0c;越来越好玩的东西流行。 就像最近很火的地摊盲盒。 讲…

Linux配置nginx代理功能

ywtool运维工具下载链接及介绍: 工具下载/介绍/安装页面 目录 一.nginx proxy功能介绍二.配置nginx proxy功能2.1 新增nginx代理配置2.1.1 反向代理(当前只举例https转https)2.1.2 负载均衡(当前只举例https转https) 2.2 修改nginx代理配置2.2.1 手动修改配置文件2.2.2 通过此脚…

【图书推荐】《Vue.js 3.x+Element Plus从入门到精通(视频教学版)》

本书用处 内容简介 本书通过对Vue.js&#xff08;简称Vue&#xff09;的示例和综合案例的介绍与演练&#xff0c;使读者快速掌握Vue.js 3.x框架的用法&#xff0c;提高Web前端的实战开发能力。本书配套示例源码、PPT课件、教学大纲、教案、同步教学视频、习题及答案、其他资源…

插件“猫抓”使用方法 - 浏览器下载m3u8视频 - 合并 - 视频检测下载 - 网课下载神器

前言 浏览器下载m3u8视频 - 合并 - 网课下载神器 chrome插件-猫抓 https://chrome.zzzmh.cn/info/jfedfbgedapdagkghmgibemcoggfppbb 步骤&#xff1a; P.s. 推荐大佬的学习视频&#xff01; 《WEB前端大师课》超级棒&#xff01; https://ke.qq.com/course/5892689#term_id…

水面漂浮物生活垃圾识别检测系统

水面漂浮物生活垃圾识别检测系统通过现场监控摄像机对河道湖面等水体进行实时监测&#xff0c;水面漂浮物生活垃圾识别检测系统借助智能视频分析技术和YOLO深度学习技术&#xff0c;系统能够自动识别和抓拍水面上的垃圾漂浮物。一旦系统检测到有垃圾漂浮在水面上&#xff0c;立…

Android-自定义三角形评分控件

效果图 序言 在移动应用开发中&#xff0c;显示数据的方式多种多样&#xff0c;直观的图形展示常常能带给用户更好的体验。本文将介绍如何使用Flutter创建一个自定义三角形纬度评分控件&#xff0c;该控件可以通过动画展示评分的变化&#xff0c;让应用界面更加生动。 实现思…

Pantera 合伙人简谈 Morpho:更高效、适应性更强的 DeFi 解决方案

原文标题&#xff1a;《Pioneering Peer-to-Peer Lending in the DeFi Revolution》撰文&#xff1a;Pantera Capital 合伙人 Paul Veradittakit编译&#xff1a;Chris&#xff0c;Techub News 文章来源&#xff1a;香港Web3媒体Techub News Morpho 正在超越 Compound 等传统…