基于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
相关产品推荐
相关产品推荐

