用Python从零复现傅里叶单像素成像(FSI):四步相移法保姆级代码解析
2026/6/9 3:12:23 网站建设 项目流程

用Python从零复现傅里叶单像素成像(FSI):四步相移法保姆级代码解析

在计算成像领域,傅里叶单像素成像(Fourier Single-pixel Imaging, FSI)正逐渐成为一项颠覆性技术。与传统的阵列传感器成像不同,FSI仅需单个像素探测器就能重建高质量图像,这为低光环境、特殊光谱成像等场景提供了全新解决方案。本文将带您用Python从零实现这一技术,重点解析四步相移法的核心代码逻辑,让抽象的数理公式转化为可运行的工程实践。

1. 环境准备与基础理论

1.1 所需工具栈

实现FSI需要以下Python库支持:

import numpy as np import matplotlib.pyplot as plt import cv2 from scipy.fft import ifft2, fftshift

关键参数说明

  • a=0.5:基底图案直流分量(保持非负)
  • b=0.5:调制幅度(需满足a+b≤1)
  • M, N=64:图像分辨率(建议从64x64开始调试)

1.2 四步相移法原理

四步相移通过不同相位的基底图案提取傅里叶系数:

相位φ数学表达式物理意义
0P₀ = a + b·cos(2πfₓx + 2πfᵧy)初始相位
π/2P₁ = a + b·cos(2πfₓx + 2πfᵧy + π/2)90°偏移
πP₂ = a - b·cos(2πfₓx + 2πfᵧy)反相位
3π/2P₃ = a + b·cos(2πfₓx + 2πfᵧy + 3π/2)270°偏移

傅里叶系数计算式:

Î = (D₀ - Dπ) + j·(D_{π/2} - D_{3π/2})

2. 基底图案生成实现

2.1 空间频率网格构建

def build_frequency_grid(M, N): """生成(fx, fy)频率网格""" u = np.fft.fftfreq(M).reshape(-1, 1) v = np.fft.fftfreq(N).reshape(1, -1) return np.meshgrid(u, v, indexing='ij')

2.2 相位调制图案生成

def generate_pattern(fx, fy, phi, M=64, N=64): """生成指定频率和相位的基底图案""" x = np.arange(M).reshape(-1, 1) y = np.arange(N).reshape(1, -1) return 0.5 + 0.5 * np.cos(2*np.pi*(fx*x + fy*y) + phi)

注意:实际硬件投射时需将浮点值映射到0-255范围,可通过cv2.normalize()处理

3. 傅里叶系数采集仿真

3.1 单次测量模拟

def simulate_measurement(img, pattern): """模拟单像素探测器测量过程""" return np.sum(img * pattern) / (img.shape[0] * img.shape[1])

3.2 四步相移完整流程

def four_step_phase_shifting(img, fx, fy): """执行四步相移获取复数傅里叶系数""" measurements = [] for phi in [0, np.pi/2, np.pi, 3*np.pi/2]: pattern = generate_pattern(fx, fy, phi) measurements.append(simulate_measurement(img, pattern)) real_part = measurements[0] - measurements[2] imag_part = measurements[1] - measurements[3] return real_part + 1j * imag_part

常见问题排查

  1. 数值溢出:确保a+b≤1,否则cos值可能超出[0,1]范围
  2. 频谱泄露:图像尺寸建议取2的整数幂(如64,128)
  3. 共轭对称:需正确处理负频率分量

4. 图像重构与优化

4.1 频谱矩阵组装

def build_spectrum(img, max_freq=0.3): """构建截断频率范围内的频谱矩阵""" M, N = img.shape fx_grid, fy_grid = build_frequency_grid(M, N) spectrum = np.zeros((M, N), dtype=complex) for i in range(M): for j in range(N): if np.sqrt(fx_grid[i,j]**2 + fy_grid[i,j]**2) <= max_freq: spectrum[i,j] = four_step_phase_shifting(img, fx_grid[i,j], fy_grid[i,j]) # 强制满足共轭对称 spectrum = np.fft.fftshift(spectrum) spectrum[-1:0:-1, -1:0:-1] = np.conj(spectrum[1:, 1:]) return spectrum

4.2 图像重建与可视化

def reconstruct_image(spectrum): """执行逆傅里叶变换重建图像""" reconstructed = np.real(ifft2(fftshift(spectrum))) return (reconstructed - reconstructed.min()) / (reconstructed.max() - reconstructed.min())

性能优化技巧

  1. 使用numba.jit加速四步相移循环
  2. 并行化不同频率点的计算(joblib.Parallel
  3. 低频优先采样策略(逐步扩展频率半径)

5. 完整流程验证

5.1 测试案例运行

# 准备测试图像 original = cv2.imread('test.png', cv2.IMREAD_GRAYSCALE) / 255.0 original = cv2.resize(original, (64, 64)) # 频谱采集 spectrum = build_spectrum(original) # 图像重建 reconstructed = reconstruct_image(spectrum) # 结果可视化 plt.figure(figsize=(12,4)) plt.subplot(131), plt.imshow(original, cmap='gray'), plt.title('Original') plt.subplot(132), plt.imshow(np.abs(spectrum), cmap='jet'), plt.title('Spectrum') plt.subplot(133), plt.imshow(reconstructed, cmap='gray'), plt.title('Reconstructed') plt.show()

5.2 实际应用建议

  1. 硬件接口:通过pySerial控制DMD投影仪
  2. 噪声处理:添加中值滤波cv2.medianBlur
  3. 动态范围优化:自适应调整(a,b)参数组合

在最近的项目实践中,发现当目标物体具有明显边缘特征时,将最大采集频率max_freq提高到0.4能显著改善重建质量,但会相应增加约60%的计算时间。这种权衡需要根据具体应用场景进行调整。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询