用C++写图像的傅里叶变换的程序流程
时间: 2024-04-30 14:21:00 浏览: 81
c++实现傅里叶变换的程序
5星 · 资源好评率100%
下面是用C++实现图像的傅里叶变换的程序流程:
1. 读入图像。
2. 对图像进行灰度化处理,将彩色图像转换为灰度图像。
3. 对图像进行填充,使其大小为2的整数次幂。这是因为傅里叶变换要求输入信号的长度为2的整数次幂。
4. 对填充后的图像进行傅里叶变换。
5. 对变换后的结果进行中心化处理,将低频部分移到图像中心,高频部分移到图像边缘。
6. 对中心化后的结果进行反傅里叶变换,得到滤波后的图像。
7. 对滤波后的图像进行裁剪,去掉填充时添加的边缘部分。
8. 将裁剪后的图像保存。
下面是一个简单的示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
// 读入图像
Mat img = imread("lena.jpg", IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "Could not read the image: " << endl;
return 1;
}
// 将图像大小调整为2的整数次幂
int m = getOptimalDFTSize(img.rows);
int n = getOptimalDFTSize(img.cols);
Mat padded;
copyMakeBorder(img, padded, 0, m - img.rows, 0, n - img.cols, BORDER_CONSTANT, Scalar::all(0));
// 进行傅里叶变换
Mat complexImg;
Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) };
merge(planes, 2, complexImg);
dft(complexImg, complexImg);
// 对结果进行中心化处理
int cx = padded.cols / 2;
int cy = padded.rows / 2;
Mat tmp;
Mat q0(complexImg, Rect(0, 0, cx, cy));
Mat q1(complexImg, Rect(cx, 0, cx, cy));
Mat q2(complexImg, Rect(0, cy, cx, cy));
Mat q3(complexImg, Rect(cx, cy, cx, cy));
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);
q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);
// 进行反傅里叶变换
Mat ifft;
idft(complexImg, ifft, DFT_SCALE | DFT_REAL_OUTPUT);
// 进行裁剪
Rect roi(0, 0, img.cols, img.rows);
Mat filteredImg = ifft(roi);
// 显示结果
imshow("Original Image", img);
imshow("Filtered Image", filteredImg);
waitKey(0);
return 0;
}
```
这个示例代码中使用了OpenCV库,对图像进行了傅里叶变换和反傅里叶变换,并对结果进行了中心化处理和裁剪。
阅读全文