Java 使用逆DFT和幅值+重建图像;OpenCV中的相位矩阵
假设使用官方DFT教程(使用java绑定),我将执行以下操作:Java 使用逆DFT和幅值+重建图像;OpenCV中的相位矩阵,java,opencv,dft,Java,Opencv,Dft,假设使用官方DFT教程(使用java绑定),我将执行以下操作: 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
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), planes.get(1), phasI);
Mat newComplexI = new Mat();
Core.merge(magI, phasI, newComplexI);
complexI.get(0,0)[0] == newComplex.get(0,0)[0]; // FALSE
发生了什么事?只需将复杂度分解为幅值矩阵和相位矩阵,然后重新组合它们,即可生成不同的矩阵。如果我在调用Core.dft
之前进行此测试,那么它工作正常。这是因为Mat
post-dft有浮点数,我们的精度降低了吗?然而,complexI
和newComplexI
之间的差异远大于一个phew小数,有时是数千
如何使用逆dft从mag和相位矩阵正确地重建图像?本应删除该问题,但该问题被否决,我想其他人也有同样的问题 这是完全有道理的,我只是在问之前觉得这个问题还不够。
complexI
是一个双通道矩阵,表示第一个通道中的Re
数字和第二个通道中的Im
。Split基本上给出了两个单通道矩阵,分别包含所有的Re
和Im
编号。使用magnity
函数基本上计算sqrt(Re^2+Im^2)
,它给出了一个与Re
和Im
完全不同的数字<代码>相位类似,但使用相位计算公式。获取这两个数字(mag和相位)并将其通过合并
只需生成一个新的双通道矩阵,其中Re
现在是mag
数字,Im
现在是相位号,与原始数字无关这与newComplexI
完全不同,正如所料
为了实现我想要的,调用
polarToCart(mag,phase,…)
函数以获取Re
和Im
值。本应删除该问题,但该问题被升级,我想其他人也有同样的问题
这是完全有道理的,我只是在问之前觉得这个问题还不够。complexI
是一个双通道矩阵,表示第一个通道中的Re
数字和第二个通道中的Im
。Split基本上给出了两个单通道矩阵,分别包含所有的Re
和Im
编号。使用magnity
函数基本上计算sqrt(Re^2+Im^2)
,它给出了一个与Re
和Im
完全不同的数字<代码>相位类似,但使用相位计算公式。获取这两个数字(mag和相位)并将其通过合并
只需生成一个新的双通道矩阵,其中Re
现在是mag
数字,Im
现在是相位号,与原始数字无关这与newComplexI
完全不同,正如所料
为了实现我想要的,调用polarToCart(mag,phase,…)
函数以获取Re
和Im
值