我正在研究图像频率过滤的 GPU 实现。我的代码在 CPU 上运行良好(我使用过类似的东西),但我花了一整天的时间试图在 GPU 上做同样的工作——但没有成功。我想在频域中应用一个滤波器,因此我需要正向变换的完整(复杂)结果。我已经读到我需要通过两个复杂的矩阵(src 和 dst)来转发 dft 以获得全谱(32FC2)。但是,我在逆变换后无法获得相同的图像(返回的图像非常失真)。
我的代码(最接近的结果):
gpu.img1 = gpu::GpuMat(vrH, imgWidth, CV_32FC2);
gpu.img2 = gpu::GpuMat(vrH, imgWidth, CV_32FC2);
gpu.img4 = gpu::GpuMat(vrH, imgWidth, CV_32FC1);
gpu.img5 = gpu::GpuMat(vrH, imgWidth, CV_8UC1);
Mat planes[] = {imageIn, Mat::zeros(imageIn.size(), CV_32FC1)};
merge(planes, 2, imageIn);
gpu::Stream stream;
gpu.img1.upload(imageIn);
gpu::dft(gpu.img1, gpu.img2, gpu.img1.size(), 0, stream);
gpu::dft(gpu.img2, gpu.img4, gpu.img1.size(), DFT_INVERSE | DFT_REAL_OUTPUT | DFT_SCALE, stream);
stream.enqueueConvert(gpu.img4, gpu.img5, CV_8U);
stream.waitForCompletion();
gpu.img5.download(imageOut);
namedWindow("processed",1); imshow("processed", imageOut); waitKey(1000);
非常感谢您的帮助和建议。