使用正向DFT实现IDFT处理图像返回旋转结果的问题求助
问题分析与修复方案
1. 逆变换逻辑不符合教材公式
你参考的教材公式对应逻辑为:
$f(x,y) = \frac{1}{MN} \text{conj}\left( \text{DFT}\left( \text{conj}(F(u,v)) \right) \right)$
你的代码中直接将滤波后的频谱product_image传入正向DFT,漏掉了先对频谱取共轭的步骤,是逆变换结果错误的原因之一。
修复方式:修改逆变换行代码为:
% 先对滤波后的频谱取共轭,再传入正向DFT,最后对结果取共轭并归一化 idft_img = (1/(size(product_image,1)*size(product_image,2))) * conj(cust_fft(conj(product_image)));
2. 2D DFT矩阵实现存在行列转置问题
这是你得到旋转图像的核心原因。二维DFT的矩阵运算规则为 $F = W_M \cdot f \cdot W_N^T$,你当前cust_fft函数中直接右乘wN,缺少了对列变换矩阵$W_N$的转置操作,导致输出结果转置。
修复方式:修改cust_fft函数中的变换行代码:
% 右乘wN的转置,符合二维DFT的矩阵运算规则 transformed = wM * img * wN.';
3. 补充优化建议
- 你的
pad_and_center函数中padarray参数有误,原图像尺寸为$M\times N$,要填充到$P\times Q$,应该填充的尺寸是[P-M, Q-N]而非[P,Q],修改为:
padded = padarray(A, [P-M, Q-N], 'post');
- 不要硬编码归一化因子
2048*2048,用size(product_image)动态获取尺寸,适配不同大小的输入图像。 - 提取最终结果时,如果填充是在图像边缘补0,建议提取中心区域而非左上角区域,避免有效信息截断。
修改完成后即可得到和Matlab内置ifft2一致的输出结果。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

