我需要一段基于c++de opencv进行图像二维傅里叶变换的代码
以下是基于C++和OpenCV进行图像二维傅里叶变换的代码:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat image = imread("lena.jpg", IMREAD_GRAYSCALE);
if (image.empty())
{
cout << "Could not open or find the image" << endl;
return -1;
}
Mat padded; //用于傅里叶变换的填充图像
int m = getOptimalDFTSize(image.rows); //计算最佳DFT尺寸
int n = getOptimalDFTSize(image.cols);
copyMakeBorder(image, padded, 0, m - image.rows, 0, n - image.cols, BORDER_CONSTANT, Scalar::all(0));
Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) }; //用于存储实部和虚部
Mat complexImg;
merge(planes, 2, complexImg); //合并实部和虚部
dft(complexImg, complexImg); //进行傅里叶变换
//将频谱图像平移,使得低频分量在图像中间
shift(planes[0], planes[0], Point(planes[0].cols / 2, planes[0].rows / 2));
shift(planes[1], planes[1], Point(planes[1].cols / 2, planes[1].rows / 2));
//计算幅度谱和相位谱
Mat mag, phase;
cartToPolar(planes[0], planes[1], mag, phase);
//显示原始图像、幅度谱和相位谱
namedWindow("Original Image", WINDOW_NORMAL);
imshow("Original Image", image);
namedWindow("Magnitude Spectrum", WINDOW_NORMAL);
imshow("Magnitude Spectrum", mag);
namedWindow("Phase Spectrum", WINDOW_NORMAL);
imshow("Phase Spectrum", phase);
waitKey(0);
return 0;
}
在这个代码中,我们首先读取一张灰度图像,然后通过getOptimalDFTSize()函数计算最佳DFT尺寸,并用copyMakeBorder()函数将图像填充到这个尺寸。接着,我们创建一个Mat数组planes,用于存储实部和虚部。我们将原始图像复制到planes[0]中,并将planes[1]初始化为全零。然后,我们将planes数组合并为一个复合图像complexImg,并使用dft()函数进行傅里叶变换。接下来,我们将频谱图像平移,使得低频分量在图像中间,然后使用cartToPolar()函数计算幅度谱和相位谱。最后,我们显示原始图像、幅度谱和相位谱,然后等待用户按下任意按键。
注意,这个代码只展示了如何进行傅里叶变换和计算幅度谱和相位谱,而没有展示如何进行滤波或逆变换。如果你需要进行滤波或逆变换,请参考其他教程或文档。
原文地址: https://www.cveoy.top/t/topic/bstD 著作权归作者所有。请勿转载和采集!