opencv图像中频域滤波去除噪声,使用c++代码
时间: 2023-11-14 17:16:28 浏览: 36
以下是一个简单的示例代码,展示如何使用OpenCV进行频域滤波去除噪声:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
// 读取图像
Mat img = imread("lena.jpg", IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "图像加载失败!" << endl;
return -1;
}
// 对图像进行傅里叶变换
Mat complexImg;
dft(img, complexImg, DFT_COMPLEX_OUTPUT);
// 构建滤波器
Mat filter(complexImg.size(), CV_32F);
Point center(complexImg.cols / 2, complexImg.rows / 2);
for (int i = 0; i < complexImg.rows; i++)
{
for (int j = 0; j < complexImg.cols; j++)
{
float distance = sqrt(pow((i - center.y), 2) + pow((j - center.x), 2));
if (distance > 50) // 阈值可以自行调整
{
filter.at<float>(i, j) = 1.0;
}
else
{
filter.at<float>(i, j) = 0.0;
}
}
}
// 对频域图像进行滤波
Mat filteredImg;
mulSpectrums(complexImg, filter, filteredImg, 0);
// 对滤波后的频域图像进行反傅里叶变换
Mat resultImg;
idft(filteredImg, resultImg, DFT_SCALE | DFT_REAL_OUTPUT);
// 显示原始图像和去噪后的图像
imshow("原始图像", img);
imshow("去噪后的图像", resultImg);
waitKey();
return 0;
}
```
该示例代码实现了以下步骤:
1. 加载图像。
2. 对图像进行傅里叶变换,得到频域图像。
3. 构建滤波器,根据阈值去除频域中的噪声。
4. 对频域图像进行滤波。
5. 对滤波后的频域图像进行反傅里叶变换,得到去噪后的图像。
6. 显示原始图像和去噪后的图像。
其中,步骤3中的滤波器是一个矩阵,其大小和频域图像相同,每个元素表示对应频率的权重,为0表示该频率被过滤掉,为1表示该频率不受影响。在本示例中,我们使用了一个圆形滤波器,将距离中心点大于50的频率过滤掉,以去除高频噪声。您可以根据实际需求选择不同的滤波器。