求Python中对应MATLAB otf2psf函数的实现库
实现MATLAB
otf2psf 功能的Python方案 目前没有专门的成熟Python库直接提供和MATLAB otf2psf完全一致的开箱即用功能,但可以基于逆傅里叶变换(IFFT)手动实现,逻辑和你找到的psf2otf代码完全对应,反向完成转换。
核心实现逻辑
OTF到PSF的转换本质是逆多维傅里叶变换,同时需要修正psf2otf过程中做的循环移位,确保PSF的原点回到中心,最后取实部(因为PSF是实值信号)。
代码实现
import numpy as np def otf2psf(otf, output_size=None): # 获取输入OTF的尺寸 otf_shape = np.array(otf.shape) if output_size is None: output_size = otf_shape # 执行逆多维傅里叶变换 psf = np.fft.ifftn(otf) # 相位校正:逆循环移位,对应psf2otf的移位操作 for axis in range(psf.ndim): psf = np.fft.ifftshift(psf, axes=axis) # 取实部(数值计算误差可能产生极小虚部,直接丢弃) psf = np.real(psf) # 调整输出尺寸:裁剪或补零到目标大小 if not np.array_equal(output_size, otf_shape): start_indices = (otf_shape - output_size) // 2 end_indices = start_indices + output_size slice_obj = tuple(slice(s, e) for s, e in zip(start_indices, end_indices)) psf = psf[slice_obj] return psf
关键说明
- 该函数和MATLAB
otf2psf的行为对齐:支持指定输出尺寸、自动校正相位移位、处理多维OTF(2D/3D) - 如果需要和MATLAB的计算结果完全一致,注意保持数据类型(如双精度
float64)一致,避免数值精度差异 - 你找到的
psf2otf代码中做的FFT移位和尺寸扩展,这里通过逆操作完全对应还原
内容的提问来源于stack exchange,提问作者Dhakshan
相关产品推荐
相关产品推荐

