0

我正在尝试对两个单独的图像进行逐点乘傅立叶变换,然后转换回普通图像。我对在 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);
4

1 回答 1

2

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

如果对 dft 使用 DFT_COMPLEX_OUTPUT,则会得到 2 通道图像,再次应用反向 idft 会产生 2 通道(复杂)Mat

不知道,为什么你得到一个'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]);
于 2013-11-12T20:13:32.937 回答