问题描述
假设官方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有浮点数,而我们却失去了精度吗?然而,complexI
和newComplexI
之间的差异远大于phe的小数,有时是几千。
如何使用逆dft从磁矩阵和相位矩阵正确重建图像?
解决方法
本来可以删除问题,但已被投票通过,我想其他人也有同样的问题。
这很有道理,我只是在问之前没有充分考虑问题。 complexI
是2通道矩阵,代表第一个通道中的Re
号和第二个通道中的Im
。 Split本质上给出了两个分别具有所有Re
和Im
数字的单通道矩阵。实际上,使用magnitude
函数可以计算sqrt(Re^2 + Im^2)
,该数字与Re
和Im
完全不同。 phase
与之类似,但使用的是相位计算公式。取这两个数字(磁和相位)并通过merge
只需生成一个新的2通道矩阵,其中Re
现在是mag
数字,而Im
现在是相位编号,与原始编号无关,这与newComplexI
完全不同。
为了实现我想要的功能,调用polarToCart(mag,phase,...)
函数以获取Re
和Im
的值。