我正在尝试对我预先应用离散傅立叶变换的图像实现离散傅里叶变换。输出是两种图像。一个图像处于正确位置,另一个图像处于反转位置。你能帮我解决这个问题吗?
这是我写的代码。
double inverseFourierReal = 0.0;
double inverseFourierImg = 0.0;
double degreeValue,cosValue,sinValue;
// double inverse = inverseFourier;
for(int rowm = 0; rowm < rows; rowm++ )
for(int coln = 0; coln < cols; coln++ ) {
inverseFourierImg = 0.0;
inverseFourierReal = 0.0;
for(int rowk = 0; rowk < rows; rowk++ ) {
for(int coll = 0; coll < cols; coll++ ) {
degreeValue = 2. * PI * (float(rowk*rowm)/rows + float(coll*coln)/cols);
cosValue = cos(degreeValue);
sinValue = sin(degreeValue);
inverseFourierReal += cosValue * fourierImageReal[rowk][coll] - sinValue * fourierImageImg[rowk][coll];
//inverseFourierImg += (cosValue * fourierImageImg[rowk][coll] + sinValue * fourierImageReal[rowk][coll]);
//cout<<inverseFourierReal;
}
}
invr_FourierReal.at<double>(rowm,coln) = abs((inverseFourierReal) / (sqrt(rows*cols)));
// invr_FourierReal.at<double>(rowm,coln) = double(inverseFourierReal) / (sqrt(rows*cols));
//invr_FourierImg.at<double>(int(rowm),int(coln)) = double(inverseFourierImg) / (sqrt(rows*cols));
}
您可以在此处查看输出图像:
编辑:
我已经更改了代码,你可以看到新的输出。它是颠倒的。
我使用Lena图像作为输入
对不起,我的英语很差。
答案 0 :(得分:0)
奇怪的镜像混合
什么是fourierFilterImg
?你在做某种卷积而不是 IDFT 吗?同样希望invr_FourierReal
与fourierImageReal
的记忆位置不同。我敢打赌,这只是一个复制/粘贴错字,所以我会改变这一行:
inverseFourierReal += (cosValue * fourierImageReal[rowk][coll] - sinValue * fourierFilterImg[rowk][coll]);
要:
inverseFourierReal += cosValue * fourierImageReal[rowk][coll] - sinValue * fourierImageImg[rowk][coll];
此外,我希望您的输入图像正确 DFT 转换并在复杂的域中。
[Edit1]反转X,Y
这可能与某处 DFT 和 IDFT 的row,col
方向的计算方法不同。图像通常Y
轴向下,X
轴向右。如果它只是倒置,那么只需颠倒那个错误的那个。
如果问题出在 IDFT ,则只需更改:
invr_FourierReal.at<double>(rowm,coln)
为:
invr_FourierReal.at<double>(rows-rowm-1,cols-coln-1)
但我的赌注是它在加载或渲染过程中只是反转而且 DFT / IDFT 与此无关。