2016-12-04 93 views
1

我正在尝试实现离散傅立叶逆变换我预先应用离散傅立叶变换的图像。输出是两种图像。一张图像位于正确位置,另一张图像位于反向位置。你能帮我解决这个问题吗?逆离散傅立叶变换输出图像

这是我写的代码。

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)); 


    } 

您可以在这里看到的输出图像:

img

编辑: 我已经改变了代码,你可以看到新的输出。它是颠倒的。 imgg 我使用了Lena图像作为输入
P.S抱歉我的英语水平很差。

+0

当我们没有看到你正在做的这部分代码时,我们该如何帮助?最可能类似的问题:[使用1D变换实现二维逆傅里叶变换](http://stackoverflow.com/a/40816757/2521214) – Spektre

+0

@Spektre感谢您的回复。我已经添加了我用于逆向变换的那段代码 – Hikmat

+0

添加了答案,至少我是这么看的。 – Spektre

回答

0

奇怪镜像混合

什么是fourierFilterImg?你在做某种卷积而不是IDFT?也希望invr_FourierRealfourierImageReal不一样。我敢打赌,它只是一个复制/粘贴错字,所以我会改变这一行:

inverseFourierReal += (cosValue * fourierImageReal[rowk][coll] - sinValue * fourierFilterImg[rowk][coll]); 

要:

inverseFourierReal += cosValue * fourierImageReal[rowk][coll] - sinValue * fourierImageImg[rowk][coll]; 

此外,我希望你的输入图像是正确DFT转化和复杂域。 X的

[EDIT1]反转,Y

这可以是只是没有row,col方向为DFTIDFT某处相同计数。图像通常有Y轴向下,X轴向右。如果它是颠倒的,那么只需要把那个错误的东西倒过来。

如果问题是IDFT然后只是改变:

invr_FourierReal.at<double>(rowm,coln) 

到:

invr_FourierReal.at<double>(rows-rowm-1,cols-coln-1) 

但我敢打赌,它加载或渲染和DFT/IDFT期间刚刚倒与此无关。

+0

谢谢。这只是错字。我试图做逆傅里叶变换比我会做“频域滤波”。 – Hikmat

+0

@Hikmat新增** edit1 ** – Spektre

+0

非常感谢您。它是知道的。我会尝试过滤。 – Hikmat