如何用角谱法(ASM)模拟光学图像放大?现有实现遇畸变问题
问题分析与修正建议
核心问题定位
角谱法模拟球面波照明的菲涅耳传播时,畸变和放大失效通常源于采样匹配问题、球面波曲率与传播距离的物理关联错误,或是角谱传递函数推导遗漏了球面波的相位影响。
关键修正点
1. 球面波曲率的物理约束
你使用的球面波表达式 $u_{inp}=\exp(i\beta{(x2+y2)})$ 中,$\beta$ 不能随意调整,它与实际传播距离 $z$ 存在严格物理关联:
$$\beta = \frac{1}{\lambda z}$$
手动调整 $\beta$ 会打破采样与传播的物理匹配,直接导致畸变。正确做法是通过调整传播距离 $z$ 间接控制球面波曲率,进而实现放大。
2. 角谱传递函数的正确推导
菲涅耳衍射的角谱传递函数为:
$$H(f_x, f_y) = \exp\left(i \pi \lambda z \left(f_x^2 + f_y^2\right)\right)$$
当输入为球面波照明时,需先将输入场与球面波相乘,再计算角谱并乘以菲涅耳传递函数,避免相位叠加或抵消错误。
3. 采样与放大的匹配逻辑
测试参数中,物面尺寸 $L = N_{pixels} \times p = 200\mu m$,频域采样间隔 $\Delta f = 1/L$。传播后的空域采样间隔为 $p' = \lambda z / L$,要实现放大需满足 $p' < p$(即 $z > L^2/\lambda \approx 0.057m$,进入菲涅耳远场区域),同时需保证输出采样点数足够,避免混叠。
代码修改示例(适配你的测试参数)
import numpy as np import matplotlib.pyplot as plt # 参数设置 p = 1e-6 # 像素尺寸(m) N = 200 # 像素数 lam = 700e-9 # 波长(m) L = N * p # 物面尺寸(m) # 生成测试线图像 u_in = np.zeros((N, N)) u_in[:, N//2] = 1 # 定义传播距离z(通过z控制放大倍数,需大于0.057m) z = 0.1 # 计算空域坐标 x = np.linspace(-L/2, L/2, N) y = np.linspace(-L/2, L/2, N) X, Y = np.meshgrid(x, y) # 生成符合物理约束的球面波照明 beta = 1 / (lam * z) u_in_spherical = u_in * np.exp(1j * beta * (X**2 + Y**2)) # 计算输入场的角谱 U_in = np.fft.fftshift(np.fft.fft2(np.fft.ifftshift(u_in_spherical))) # 计算频域坐标 fx = np.linspace(-1/(2*p), 1/(2*p), N) fy = np.linspace(-1/(2*p), 1/(2*p), N) Fx, Fy = np.meshgrid(fx, fy) # 菲涅耳角谱传递函数 H = np.exp(1j * np.pi * lam * z * (Fx**2 + Fy**2)) # 计算传播后的角谱 U_out = U_in * H # 逆傅里叶变换得到输出场 u_out = np.fft.fftshift(np.fft.ifft2(np.fft.ifftshift(U_out))) # 可视化结果 plt.figure(figsize=(10,5)) plt.subplot(121) plt.imshow(np.abs(u_in), cmap='gray') plt.title('输入线图像') plt.subplot(122) plt.imshow(np.abs(u_out), cmap='gray') plt.title(f'放大输出(z={z}m)') plt.show()
额外注意事项
- 若需精准控制放大倍数,可在传播后对输出场进行重采样,匹配目标像素尺寸,避免采样间隔过大导致的畸变。
- 对比4F系统:4F系统的采样匹配由透镜焦距和物像距严格保证,而角谱法的采样依赖传播距离,必须严格遵循空域-频域的采样关系,否则极易出现混叠和畸变。
内容的提问来源于stack exchange,提问作者Samyak Marathe
相关产品推荐
相关产品推荐

