opencv通过傅里叶变换去除图像正弦噪声的c++代码
时间: 2023-10-09 15:08:24 浏览: 117
以下是使用OpenCV进行傅里叶变换去除图像正弦噪声的C ++代码示例:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("lena.jpg", IMREAD_GRAYSCALE); // 读取灰度图像
if (img.empty())
{
cout << "Failed to load image" << endl;
return -1;
}
// 添加正弦噪声
int amplitude = 50;
float frequency = 0.1;
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
img.at<uchar>(i, j) += amplitude * sin(frequency * j);
}
}
// 显示原始图像
imshow("Original Image", img);
// 执行傅里叶变换
Mat planes[] = { Mat_<float>(img), Mat::zeros(img.size(), CV_32F) };
Mat complexImg;
merge(planes, 2, complexImg);
dft(complexImg, complexImg);
// 去除正弦噪声
for (int i = 0; i < complexImg.rows; i++)
{
for (int j = 0; j < complexImg.cols; j++)
{
float real = complexImg.at<Vec2f>(i, j)[0];
float imag = complexImg.at<Vec2f>(i, j)[1];
// 计算频率
float freq = sqrt(i * i + j * j);
// 如果频率在噪声频率附近,则将该频率的幅度设置为0
if (freq > frequency * img.cols - amplitude && freq < frequency * img.cols + amplitude)
{
complexImg.at<Vec2f>(i, j)[0] = 0;
complexImg.at<Vec2f>(i, j)[1] = 0;
}
}
}
// 执行傅里叶逆变换
Mat filteredImg;
idft(complexImg, filteredImg, DFT_SCALE | DFT_REAL_OUTPUT);
// 显示去噪后的图像
imshow("Filtered Image", filteredImg);
waitKey(0);
return 0;
}
```
在这个示例中,我们首先加载一张灰度图像,并添加了一个正弦噪声。然后,我们执行傅里叶变换来将图像从空间域转换到频率域。接下来,我们遍历频率域中的每个像素,并检查其频率是否在噪声频率附近。如果是,则将该频率的幅度设置为零,以去除噪声。最后,我们执行傅里叶逆变换以将图像从频率域转换回空间域,并显示去噪后的图像。
阅读全文