C++中使用傅里叶变换求一幅图像的高频分量,并将高频分量求和存入到矩阵中的代码
时间: 2024-03-04 18:47:57 浏览: 65
以下是使用OpenCV库实现的C++代码示例:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("lena.jpg", IMREAD_GRAYSCALE);
Mat planes[] = { Mat_<float>(img), Mat::zeros(img.size(), CV_32F) };
Mat complexImg;
merge(planes, 2, complexImg);
dft(complexImg, complexImg);
// 将高频分量置为0
int cx = complexImg.cols / 2;
int cy = complexImg.rows / 2;
for (int i = 0; i < cy; i++)
{
for (int j = 0; j < cx; j++)
{
complexImg.at<Vec2f>(i, j)[0] = 0;
complexImg.at<Vec2f>(i, j)[1] = 0;
}
}
// 将变换结果转换回图像
Mat inverseTransform;
idft(complexImg, inverseTransform, DFT_SCALE | DFT_REAL_OUTPUT);
// 取出高频分量
Mat highFreq = inverseTransform(Rect(cx, cy, cx, cy));
// 显示结果
imshow("Original Image", img);
imshow("High Frequency Component", highFreq);
waitKey();
return 0;
}
```
这里使用了OpenCV中的dft函数来进行傅里叶变换,并将变换结果转换回图像使用了idft函数。将高频分量置为0的过程可以通过访问Mat中的像素来实现。最后使用Rect函数取出高频分量并显示。
阅读全文