逆离散傅里叶变换图像重构代码像素存储位置错误求助
逆离散傅里叶变换图像重构:像素位置错误排查方案
嘿,我看到你在2D逆DFT重构图像时卡了一天,像素值对但位置全错——这种细节bug确实磨人,咱们一步步拆解问题:
核心问题1:循环范围完全搞反了
你明确说M是图像宽度(每行像素数),N是高度(行数),但代码里的外层循环逻辑完全颠倒了:
- 行索引
k应该遍历高度N(0到N-1),但你写成了k <= M-1(遍历宽度次数) - 列索引
l应该遍历宽度M(0到M-1),但你写成了l <= N-1(遍历高度次数)
这直接导致图像的行列被转置,尺寸也不匹配,位置不乱才怪!
核心问题2:Spectrum指针的致命错误移动
你在最内层循环里写了std::complex<float> fourier = *spectrum; spectrum++;——这意味着第一次处理k=0,l=0时,就把整个spectrum数组遍历完了,后面所有循环访问的都是数组越界的内存!不仅位置会错,还会出现随机垃圾值。正确的做法是用索引访问spectrum,绝对不能移动传入的const指针。
修正后的代码片段
void DiscreteFourier2D::reconstruct( int M, int N, std::complex<float> const *spectrum, std::complex<float> *reconstruction) { float A = (1.f / sqrt(M * N)); // 修正循环范围:k遍历行(高度N),l遍历列(宽度M) for (int k = 0; k < N; k++) { for (int l = 0; l < M; l++) { std::complex<float> total(0.f, 0.f); for (int m = 0; m < N; m++) { for (int n = 0; n < M; n++) { // 用行主序索引访问spectrum,避免指针越界 std::complex<float> fourier = spectrum[m * M + n]; std::complex<float> i(0.f, 1.f); float mM = (float) m / (float) M; float nN = (float) n / (float) N; float e_1 = 2.f * M_PI * k * (mM - 0.5); float e_2 = 2.f * M_PI * l * (nN - 0.5); total += fourier * exp(e_1 * i) * exp(e_2 * i); } } // 索引公式(k*M+l)是正确的,前提是k是行索引(0到N-1) reconstruction[k * M + l] = total * A; } } }
补充说明
你提到像素值计算正确,说明DFT的核心指数公式是符合你的需求的,不用改动这部分。主要问题就是循环范围的颠倒和指针操作的错误,修正后应该就能得到位置正确的重构图像了。
内容的提问来源于stack exchange,提问作者aTuring
相关产品推荐
相关产品推荐

