我试图逐点地对两个单独图像进行傅里叶变换,然后转换回正常图像。我不太熟悉在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);
答案 0 :(得分:2)
imshow无法显示2个频道的图像,只有1,3,4个频道图像。
如果您使用DFT_COMPLEX_OUTPUT作为dft,则会获得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]);