在OpenCV中使用逆DFT和幅度+相位矩阵重建图像

问题描述

假设官方DFT教程(使用Java绑定)https://docs.opencv.org/3.4/d8/d01/tutorial_discrete_fourier_transform.html,我将执行以下操作:

    Mat complexI = new Mat();
    Core.merge(planes,complexI);         // Add to the expanded another plane with zeros
    Core.dft(complexI,complexI);         // this way the result may fit in the source matrix
    // compute the magnitude
    Core.split(complexI,planes);
    Mat magI = new Mat();
    Core.magnitude(planes.get(0),planes.get(1),magI);
    Mat phasI = new Mat();
    Core.phase(planes.get(0),phasI);
    Mat newComplexI = new Mat();
    Core.merge(magI,phasI,newComplexI);
    complexI.get(0,0)[0] == newComplex.get(0,0)[0]; // FALSE

这是怎么回事?仅仅将complexI分解成大小矩阵和相位矩阵,然后重新组合它们就可以生成不同的矩阵。如果我在Core.dft调用之前 进行了此测试,那么它将正常工作。是因为Mat后DFT有浮点数,而我们却失去了精度吗?然而,complexInewComplexI间的差异远大于phe的小数,有时是几千。

如何使用逆dft从磁矩阵和相位矩阵正确重建图像?

解决方法

本来可以删除问题,但已被投票通过,我想其他人也有同样的问题。

这很有道理,我只是在问之前没有充分考虑问题。 complexI是2通道矩阵,代表第一个通道中的Re号和第二个通道中的Im。 Split本质上给出了两个分别具有所有ReIm数字的单通道矩阵。实际上,使用magnitude函数可以计算sqrt(Re^2 + Im^2),该数字与ReIm完全不同。 phase与之类似,但使用的是相位计算公式。取这两个数字(磁和相位)并通过merge只需生成一个新的2通道矩阵,其中Re现在是mag数字,而Im现在是相位编号,与原始编号无关,这与newComplexI完全不同。

为了实现我想要的功能,调用polarToCart(mag,phase,...)函数以获取ReIm的值。