【问题标题】:Blurry image after IFT using FFTW library in QT C++在 QT C++ 中使用 FFTW 库的 IFT 后图像模糊
【发布时间】:2016-05-12 20:23:28
【问题描述】:

我对使用 FFT 而不是 IFFT 创建的图像有疑问。这是我正在转换的图像:oryginal image,这是我在 FFT 和 IFFT 之后得到的图像:output image。我认为相位转换很好,问题出在幅度转换的某个地方。下面是我的 FFT 函数的一部分,用于每个像素的循环中的红色通道,outR 是 fftw_plan_dft_2d 函数的输出,而 magRMax 是所有幅度的最大值:

realR = outR[tempCounter][0] / (double)(squareSize * squareSize);
imagR = outR[tempCounter][1] / (double)(squareSize * squareSize);
...
magR = sqrt((realR * realR) + (imagR * imagR));
...
int param = 255;
magR = (param*log(magR+1)) / log(1 + magRMax);
...
magR = (magR > 255 ? 255 : magR);
...
magR = (magR < 0 ? 0 : magR);
...
tempColor.setRed((int)magR);

新像素被分配给幅度图像。在 FFT 和创建幅度、相位图像之后,我尝试在幅度、相位图像没有任何中间变化的情况下进行 IFFT。以下是我对红色 chanell 的 IFFT 函数的一部分:

planR = fftw_plan_dft_2d(squareSize, squareSize, inR, outR, FFTW_BACKWARD, FFTW_ESTIMATE);
...
tempColor.setRgb(myImageMag->pixel(i,j));
tempColor2.setRgb(myImagePhase->pixel(i,j));

magR = tempColor.red() / 255.0;
phaseR = ((tempColor2.red() / 255.0) * 2 * M_PI) - M_PI;
inR[tempCounter][0] = (magR * cos(phaseR));
inR[tempCounter][1] = (magR * sin(phaseR));
...
redMax += abs(redMin);
...
red = (int)(outR[tempCounter][0]);
...
red = ((red + abs(redMin)) / (double)redMax)*255.0;
...
tempColor.setRed(red);

redMax 是 outR[tempCounter][0] 的所有像素的最大值,redMin 是 outR[tempCounter][0] 的所有像素的最小值。 redMax += abs(redMin) 正在调用进程,因为我得到低于 0 的值,我也调用了所有红色值。

在 GitHub 上编程的代码:

https://github.com/Hariver/POID/blob/master/main.cpp

【问题讨论】:

    标签: c++ qt image-processing fftw


    【解决方案1】:

    模糊像素只是意味着每个像素在空间域中被涂抹(卷积)。空间域中的卷积是频域中的乘法,这确实是您正在做的事情。

    【讨论】:

      猜你喜欢
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多