opencv图像中频域滤波去除噪声,使用c++代码
时间: 2023-11-14 14:22:26 浏览: 185
数字图像处理基于c++和opencv的图像小波阈值去噪源码(软阈值和硬阈值处理)+代码注释+sln解决方案.zip
5星 · 资源好评率100%
以下是使用C语言和OpenCV库实现频域滤波去除噪声的示例代码:
```
#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 noisyImg;
GaussianBlur(img, noisyImg, Size(7, 7), 10);
imwrite("noisyImage.jpg", noisyImg);
// 傅里叶变换
Mat planes[] = { Mat_<float>(noisyImg), Mat::zeros(noisyImg.size(), CV_32F) };
Mat complexImg;
merge(planes, 2, complexImg);
dft(complexImg, complexImg);
// 显示频谱图
Mat magImg;
magnitude(planes[0], planes[1], magImg);
magImg += Scalar::all(1);
log(magImg, magImg);
normalize(magImg, magImg, 0, 1, NORM_MINMAX);
imshow("频谱图", magImg);
// 生成滤波器
Mat filter = Mat::zeros(noisyImg.size(), CV_32F);
int cx = noisyImg.cols / 2;
int cy = noisyImg.rows / 2;
for (int i = 0; i < noisyImg.rows; i++)
{
for (int j = 0; j < noisyImg.cols; j++)
{
float d = sqrt(pow(i - cy, 2) + pow(j - cx, 2));
if (d < 30)
{
filter.at<float>(i, j) = 1;
}
}
}
// 显示滤波器
imshow("滤波器", filter);
// 应用滤波器
Mat filteredImg;
mulSpectrums(complexImg, filter, complexImg, 0);
idft(complexImg, filteredImg, DFT_SCALE | DFT_REAL_OUTPUT);
// 显示去噪后的图像
imshow("去噪后的图像", filteredImg);
waitKey();
return 0;
}
```
以上代码实现了以下功能:
1. 读取图像;
2. 给图像添加高斯噪声;
3. 进行傅里叶变换,并显示频谱图;
4. 生成滤波器;
5. 应用滤波器;
6. 进行反傅里叶变换,得到去噪后的图像;
7. 显示去噪后的图像。
在代码中,我们使用`imread`函数读取图像,使用`GaussianBlur`函数添加高斯噪声。然后,我们将图像转换为频域表示,通过计算距离生成一个低通滤波器,将其应用于频域图像,再进行反傅里叶变换得到去噪后的图像。最后,我们使用`imshow`函数显示频谱图、滤波器和去噪后的图像,并使用`waitKey`函数等待用户按下键盘上的任意键。
注意:这里的代码只适用于灰度图像。如果要处理彩色图像,需要将其转换为YUV或HSV等颜色空间,对亮度通道进行处理,再转换回RGB。
阅读全文