写一个读取图像并进行二维离散傅立叶变换的C语言代码
时间: 2024-06-12 16:03:43 浏览: 184
这里提供一个基于OpenCV库的C语言代码,读取图像并进行二维离散傅立叶变换:
```c
#include <opencv2/opencv.hpp>
#include <iostream>
#include <cmath>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
// 读取图像
Mat img = imread(argv[1], IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "Could not read the image: " << argv[1] << endl;
return -1;
}
// 双通道图像才能进行傅立叶变换
Mat img_float;
img.convertTo(img_float, CV_32F);
Mat planes[] = { img_float, Mat::zeros(img.size(), CV_32F) };
Mat complexImg;
merge(planes, 2, complexImg);
// 进行傅立叶变换
dft(complexImg, complexImg, DFT_COMPLEX_OUTPUT);
// 将傅立叶变换结果分离成实部和虚部
split(complexImg, planes);
Mat magImg;
magnitude(planes[0], planes[1], magImg);
// 对数变换,使结果更容易观察
magImg += Scalar::all(1);
log(magImg, magImg);
// 归一化到0~1之间
normalize(magImg, magImg, 0, 1, NORM_MINMAX);
// 显示傅立叶变换的幅度谱
imshow("Magnitude spectrum", magImg);
waitKey();
return 0;
}
```
这段代码首先使用OpenCV库中的`imread`函数读取图像,然后将图像转换为双通道浮点型图像,以便进行傅立叶变换。接着,使用`dft`函数对图像进行二维离散傅立叶变换,将得到的结果分离成实部和虚部,并计算出幅度谱。为了更容易观察幅度谱,对其进行对数变换,并将结果归一化到0~1之间。最后,使用`imshow`函数显示幅度谱,等待用户按下任意键后退出程序。
阅读全文