使用QT C ++中的FFTW库进行IFT后的模糊图像

时间:2016-05-12 20:23:29

标签: c++ qt image-processing fftw

我使用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和创建幅度之后,相位图像i尝试进行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)是scalling proces,因为我得到的值低于0,同时我也调整了所有红色值。

在GitHub上编程的代码:

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

1 个答案:

答案 0 :(得分:0)

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