opencv图像中频域滤波去除噪声,使用c++代码
时间: 2023-11-14 13:17:51 浏览: 84
以下是使用 OpenCV C++ 实现频域滤波去除噪声的示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <opencv2/core/types_c.h>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("image.jpg", 0); // 读取灰度图像
imshow("Original Image", img);
Mat padded; // 填充后的图像
int m = getOptimalDFTSize(img.rows);
int n = getOptimalDFTSize(img.cols);
copyMakeBorder(img, padded, 0, m - img.rows, 0, n - img.cols, BORDER_CONSTANT, Scalar::all(0));
Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) };
Mat complexImg;
merge(planes, 2, complexImg);
dft(complexImg, complexImg);
// 频域滤波器
Mat filter = Mat::zeros(complexImg.size(), CV_32F);
int centerX = filter.cols / 2;
int centerY = filter.rows / 2;
int radius = min(centerX, centerY) / 2;
circle(filter, Point(centerX, centerY), radius, Scalar(1), -1);
filter2D(complexImg, complexImg, -1, filter);
idft(complexImg, complexImg);
Mat restoredImg;
split(complexImg, planes);
normalize(planes[0], restoredImg, 0, 255, NORM_MINMAX, CV_8U);
imshow("Restored Image", restoredImg);
waitKey();
return 0;
}
```
在这个例子中,我们首先读取了一张灰度图像并将其填充到最佳尺寸。然后,我们将图像转换为复数形式,并对其进行傅里叶变换。接下来,我们使用一个圆形滤波器来过滤掉高频噪声,并对滤波后的图像进行逆傅里叶变换以恢复原始图像。最后,我们将恢复的图像归一化并显示出来。
请注意,此示例代码仅适用于灰度图像。如果您要处理彩色图像,请首先将其转换为灰度图像,然后再进行处理。
阅读全文