opencv图像中频域滤波去除正弦噪声,使用c++代码
时间: 2023-11-14 17:17:51 浏览: 119
opencv-基于c++实现的opencv图像处理算法之图像滤波算法方框滤波.zip
以下是使用OpenCV进行频域滤波去除正弦噪声的C++代码示例:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 读取原始图像
Mat img = imread("lena.jpg", IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "Failed to read image" << endl;
return -1;
}
// 添加正弦噪声
Mat noise(img.size(), CV_32F);
randn(noise, 0, 20);
Mat img_noise;
img.convertTo(img_noise, CV_32F);
img_noise += noise;
// 显示原始图像和带噪声的图像
imshow("Original Image", img);
imshow("Noisy Image", img_noise / 255.0);
// 傅里叶变换
Mat img_dft;
dft(img_noise, img_dft, DFT_COMPLEX_OUTPUT);
// 计算傅里叶频谱
Mat img_dft_mag;
magnitude(img_dft, img_dft_mag);
// 反变换
Mat img_idft;
idft(img_dft, img_idft, DFT_SCALE | DFT_REAL_OUTPUT);
// 显示频域和空域图像
imshow("Frequency Domain", img_dft_mag / 255.0);
imshow("Spatial Domain", img_idft / 255.0);
// 创建掩模
Mat mask = Mat::zeros(img.size(), CV_32F);
Rect roi(img.cols / 4, img.rows / 4, img.cols / 2, img.rows / 2);
mask(roi) = 1;
// 应用掩模
Mat img_dft_masked;
multiply(img_dft, mask, img_dft_masked);
// 反变换
Mat img_idft_masked;
idft(img_dft_masked, img_idft_masked, DFT_SCALE | DFT_REAL_OUTPUT);
// 显示去噪后的图像
imshow("Denoised Image", img_idft_masked / 255.0);
waitKey();
return 0;
}
```
在此示例中,我们使用了OpenCV的dft,idft,magnitude和multiply函数来执行傅里叶变换,反变换,计算傅里叶频谱和应用掩模。我们还使用了randn函数来添加正弦噪声。掩模是通过创建一个具有ROI(感兴趣区域)的矩形来创建的,其中ROI是原始图像的中央四分之一。最终,我们显示了原始图像,带噪声的图像,傅里叶频谱,空域图像和去噪后的图像。
阅读全文