OpenCV 并使用 Fourier 变换 dft()
OpenCV and working with Fourier transform dft()
我正在尝试逐点乘以两个单独图像的傅里叶变换,然后转换回普通图像。我对在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]);
相关文章:
- 基于范围的变换以实现正常循环
- OpenCV 傅里叶变换复杂输出问题
- SFML 纹理变换(放大)
- OpenCV C++,难以理解DFT的起始代码
- 平面缓冲区可以利用向量中的 0 吗?还是其他小波比哈尔变换更好?
- 有没有一种惯用的方法可以在不存储变换或不必要地重新计算的情况下找到数组变换的最小/最大值?
- 在特征中显示仿射变换
- fftw:为什么我的 2D DFT 输出与每行的 1D DFT 输出不同?
- 离散傅立叶变换C++
- ICP变换矩阵平移和旋转
- 如何从2D数组为QHeightMapSurfaceDataProxy创建高度图以显示2D傅立叶变换结果
- 将 3D 变换转换为 2D
- 根据定义计算DFT <complex>(C++
- 使用变换翻转地图,接收错误"type int unexpected"
- 指示 Qi 变换属性失败的适当方法是什么?
- 如何在 c++ 中将变换与对的向量一起使用
- 骨骼动画:变换矩阵(collada)之间的插值
- DFT(离散傅里叶变换)与C++代码
- OpenCV 并使用 Fourier 变换 dft()
- DFT(离散傅里叶变换)与C++ STL