IDFT输出出现双重镜像图像的原因排查求助
傅里叶变换滤波后图像出现垂直翻转叠加的问题求助
我是OpenCV和C++新手,写了个用于学习的小程序,现在搞不懂输出结果的问题,希望有经验的人提些引导性问题帮我自己理解并修复。
程序要实现的功能:
- 加载图像
- 对图像执行DFT(离散傅里叶变换)
- 对频谱应用圆形二进制掩码,按按键逐步增大圆形半径(实现简易滤波)
- 显示掩码处理后频谱的逆变换结果
目前基础功能已经实现:能加载图像、执行DFT、查看输出,还能逐步增大掩码半径并查看IDFT结果。但现在的问题是,输出图像会出现输入图像的垂直翻转副本叠加的情况(比如用Lena.png测试时),这并非预期结果。不应用掩码直接显示IDFT结果时,图像正常无双重叠加,只有使用掩码后才会出现该问题。
我不需要直接的解决方案,希望能得到一些引导性问题,帮助我自行排查原因并修复。
我的代码:
#include <opencv2/core/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/imgproc.hpp> #include <iostream> using namespace cv; void expand_img_to_optimal(Mat &padded, Mat &img); void fourier_transform(Mat &img); int main(int argc, char **argv) { Mat input_img; input_img = imread("Lena.png" , IMREAD_GRAYSCALE); if (input_img.empty()) { fprintf(stderr, "Could not Open image\n\n"); return -1; } fourier_transform(input_img); return 0; } void fourier_transform(Mat &img) { Mat padded; expand_img_to_optimal(padded, img); Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)}; Mat complexI; merge(planes, 2, complexI); dft(complexI, complexI, DFT_COMPLEX_OUTPUT); // 逐步增大掩码圆形半径的循环 for (int i=0; i<400; i+=10) { Mat mask = Mat::ones(complexI.size(), complexI.type()); mask.convertTo(mask, CV_8U); Mat dest = Mat::ones(complexI.size(), complexI.type()); circle(mask, Point(mask.cols/2, mask.rows/2), i, 0, -1, 8, 0); complexI.copyTo(dest, mask); Mat inverseTransform; idft(dest, inverseTransform, DFT_INVERSE|DFT_REAL_OUTPUT); normalize(inverseTransform, inverseTransform, 0, 1, NORM_MINMAX); imshow("Reconstructed", inverseTransform); waitKey(0); } } void expand_img_to_optimal(Mat &padded, Mat &img) { int row = getOptimalDFTSize(img.rows); int col = getOptimalDFTSize(img.cols); copyMakeBorder(img, padded, 0, row - img.rows, 0, col - img.cols, BORDER_CONSTANT, Scalar::all(0)); }
内容的提问来源于stack exchange,提问作者avi
相关产品推荐
相关产品推荐

