OpenCV 并使用 Fourier 变换 dft()

OpenCV and working with Fourier transform dft()

本文关键字:dft 变换 Fourier OpenCV      更新时间:2023-10-16

我正在尝试逐点乘以两个单独图像的傅里叶变换,然后转换回普通图像。我对在OpenCV中使用傅里叶变换不是很熟悉,但这就是我目前所拥有的。显示输出的最后一行导致类型为"System.Runtime.InteropServices.SEHException"的异常,但我无法弄清楚如何解决它。我在每个阶段都尝试了各种不同的参数和函数,但似乎都给出了异常或空输出。我做错了什么?感谢您给我的任何帮助!

Mat dftInput1, dftImage1, dftInput2, dftImage2, multipliedDFT, inverseDFT, inverseDFTconverted;
image1.convertTo(dftInput1, CV_32F);
dft(dftInput1, dftImage1, DFT_COMPLEX_OUTPUT);
image2.convertTo(dftInput2, CV_32F);
dft(dftInput2, dftImage2, DFT_COMPLEX_OUTPUT);
multiply(dftImage1, dftImage2, multipliedDFT);
idft(multipliedDFT, inverseDFT, DFT_SCALE);
inverseDFT.convertTo(inverseDFTconverted, CV_8U);
imshow("Output", inverseDFTconverted);

imshow不能显示2个通道的图像,只能显示1,3,4个通道的图像。

如果将DFT_COMPLEX_OUTPUT用于 DFT,则会得到一个 2 通道图像,再次应用反向 IDFT 会产生一个 2 通道(复杂)垫子

不知道,为什么你会得到一个"System.Runtime.InteropServices.SEHException"(这是"托管的c ++"吗?

convertTo() 更改通道的类型,但不更改其计数(是的,令人惊讶)。

因此,要么将其限制在真实部分:

 idft(multipliedDFT, inverseDFT, CV_DFT_SCALE | CV_DFT_REAL_OUTPUT );

或者拆分它,只把真实的部分扔在IMSHOW上:

Mat chan[2];
split( inverseDFTconverted, chan );
imshow("lalala", chan[0]);