You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python将干涉图傅里叶变换为空间频率的技术求助

解决方案:从傅里叶频谱生成空间频率图并计算激光条纹波长

第一步:修正图像预处理(避免二值图丢失信息)

你当前用image.convert('1')转成二值图,会丢失灰度细节,严重影响傅里叶分析的精度。建议转成8位灰度图('L'模式),保留更多图像信息:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

# 读取图像并转为8位灰度图
image = Image.open("your_image_file.jpg")  # 替换为你的图像路径
image_greyscale = image.convert('L')
img_np = np.array(image_greyscale)

# 显示灰度图
plt.imshow(img_np, cmap='gray')
plt.xlabel('Pixel X')
plt.ylabel('Pixel Y')
plt.title('Laser Stripe Grayscale Image')
plt.show()

第二步:生成带空间频率轴的频谱图

傅里叶变换后,需要将像素坐标转换为空间频率轴(单位:1/像素),这样才能得到真正的空间频率图:

# 2D傅里叶变换并移频(将直流分量移到中心)
fourier = np.fft.fft2(img_np)
fourier_shifted = np.fft.fftshift(fourier)
magnitude = np.abs(fourier_shifted)
log_magnitude = np.log(magnitude + 1)  # +1避免log(0)报错

# 计算空间频率轴(单位:1/像素)
rows, cols = img_np.shape
freq_x = np.fft.fftshift(np.fft.fftfreq(cols))  # X方向频率
freq_y = np.fft.fftshift(np.fft.fftfreq(rows))  # Y方向频率

# 绘制带频率轴的空间频率图
plt.figure(figsize=(8, 6))
# extent参数绑定频率轴范围,让坐标轴显示实际空间频率
plt.imshow(log_magnitude, cmap='gray', extent=[freq_x.min(), freq_x.max(), freq_y.min(), freq_y.max()])
plt.xlabel('Spatial Frequency (1/pixel)')
plt.ylabel('Spatial Frequency (1/pixel)')
plt.title('Spatial Frequency Spectrum (Log Magnitude)')
plt.colorbar(label='Log Magnitude')
plt.show()

第三步:提取峰值频率并转换为物理单位

要计算激光波长,需要先从频谱中提取条纹对应的峰值频率,再结合相机标定参数(像素尺寸)转换为物理空间频率:

# 提取X方向的平均频谱(假设激光条纹是水平的,峰值在X轴方向)
avg_spectrum = np.mean(magnitude, axis=0)
center_idx = cols // 2

# 排除中心直流分量,找右侧的峰值位置
peak_idx = np.argmax(avg_spectrum[center_idx+1:]) + center_idx + 1
peak_freq_pixel = freq_x[peak_idx]  # 单位:1/像素

# 转换为物理空间频率:替换为你的相机像素尺寸(单位:米)
pixel_size = 5e-6  # 示例:5微米像素
peak_freq_physical = peak_freq_pixel / pixel_size  # 单位:线/米(1/m)

# 计算条纹周期(相邻条纹的物理距离)
stripe_period = 1 / peak_freq_physical  # 单位:米

第四步:从条纹周期计算激光波长

激光条纹的波长计算取决于你的条纹生成方式:

  • 双光束干涉条纹:若两束激光的夹角为2θ,则波长公式为:
    λ = 2 * stripe_period * sin(θ)
    
    其中θ是单束光与法线的夹角,需要通过实验标定或系统参数获取。
  • 投影正弦条纹:若使用SLM或投影设备生成条纹,需要结合投影系统的放大率M(投影到目标平面的放大倍数),先得到原始条纹周期T0 = stripe_period / M,再根据生成条纹的光学系统参数推导波长。

关键注意事项

  • 绝对不要用二值图做傅里叶分析,灰度图能保留更多条纹细节,让频谱峰值更清晰。
  • 物理空间频率的计算必须依赖相机的像素尺寸标定值,否则只能得到相对频率(1/像素)。
  • 若条纹是垂直/斜向的,只需调整峰值提取的方向(比如计算Y方向的平均频谱,或直接找2D频谱中的峰值坐标)。

内容的提问来源于stack exchange,提问作者user2279603

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:35:59