从磁盘读入一幅图像,显示。给图像加载图像分别添加 高斯噪声、椒盐噪声和均匀分布的噪声,对图像进行各种去 噪滤波处理。c++
时间: 2024-03-23 20:38:09 浏览: 15
好的,我来为您解答这个问题。
首先,需要使用OpenCV库来实现图像的读入和显示,以及噪声添加和去噪滤波处理。可以使用以下代码来读入和显示图像:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("test.jpg"); // 读入图像
imshow("Original Image", img); // 显示原图像
waitKey(0); // 等待按键
return 0;
}
```
接下来,可以使用OpenCV提供的函数来添加高斯噪声、椒盐噪声和均匀分布的噪声。以下是添加高斯噪声的代码示例:
```c++
Mat addGaussianNoise(const Mat& img, double mean, double stddev)
{
Mat noise = Mat(img.size(), CV_32FC3);
randn(noise, mean, stddev); // 产生高斯噪声
Mat result;
add(img, noise, result, Mat(), CV_8UC3);
return result;
}
```
以下是添加椒盐噪声的代码示例:
```c++
Mat addSaltAndPepperNoise(const Mat& img, double ratio)
{
Mat result = img.clone();
int height = img.rows;
int width = img.cols;
int num = (int)(height * width * ratio);
for (int i = 0; i < num; i++)
{
int x = rand() % width;
int y = rand() % height;
if (rand() % 2 == 0)
result.at<Vec3b>(y, x) = Vec3b(0, 0, 0); // 盐噪声
else
result.at<Vec3b>(y, x) = Vec3b(255, 255, 255); // 椒噪声
}
return result;
}
```
以下是添加均匀分布噪声的代码示例:
```c++
Mat addUniformNoise(const Mat& img, double a, double b)
{
Mat noise = Mat(img.size(), CV_32FC3);
randu(noise, Scalar(a, a, a), Scalar(b, b, b)); // 产生均匀分布噪声
Mat result;
add(img, noise, result, Mat(), CV_8UC3);
return result;
}
```
接下来,可以使用OpenCV提供的函数来实现各种去噪滤波处理。以下是一些常见的去噪滤波处理方法:
1. 均值滤波:
```c++
Mat meanFilter(const Mat& img, int ksize)
{
Mat result;
blur(img, result, Size(ksize, ksize));
return result;
}
```
2. 中值滤波:
```c++
Mat medianFilter(const Mat& img, int ksize)
{
Mat result;
medianBlur(img, result, ksize);
return result;
}
```
3. 高斯滤波:
```c++
Mat gaussianFilter(const Mat& img, int ksize, double sigma)
{
Mat result;
GaussianBlur(img, result, Size(ksize, ksize), sigma);
return result;
}
```
4. 双边滤波:
```c++
Mat bilateralFilter(const Mat& img, int ksize, double sigmaColor, double sigmaSpace)
{
Mat result;
bilateralFilter(img, result, ksize, sigmaColor, sigmaSpace);
return result;
}
```
最后,完整的代码如下:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
Mat addGaussianNoise(const Mat& img, double mean, double stddev)
{
Mat noise = Mat(img.size(), CV_32FC3);
randn(noise, mean, stddev); // 产生高斯噪声
Mat result;
add(img, noise, result, Mat(), CV_8UC3);
return result;
}
Mat addSaltAndPepperNoise(const Mat& img, double ratio)
{
Mat result = img.clone();
int height = img.rows;
int width = img.cols;
int num = (int)(height * width * ratio);
for (int i = 0; i < num; i++)
{
int x = rand() % width;
int y = rand() % height;
if (rand() % 2 == 0)
result.at<Vec3b>(y, x) = Vec3b(0, 0, 0); // 盐噪声
else
result.at<Vec3b>(y, x) = Vec3b(255, 255, 255); // 椒噪声
}
return result;
}
Mat addUniformNoise(const Mat& img, double a, double b)
{
Mat noise = Mat(img.size(), CV_32FC3);
randu(noise, Scalar(a, a, a), Scalar(b, b, b)); // 产生均匀分布噪声
Mat result;
add(img, noise, result, Mat(), CV_8UC3);
return result;
}
Mat meanFilter(const Mat& img, int ksize)
{
Mat result;
blur(img, result, Size(ksize, ksize));
return result;
}
Mat medianFilter(const Mat& img, int ksize)
{
Mat result;
medianBlur(img, result, ksize);
return result;
}
Mat gaussianFilter(const Mat& img, int ksize, double sigma)
{
Mat result;
GaussianBlur(img, result, Size(ksize, ksize), sigma);
return result;
}
Mat bilateralFilter(const Mat& img, int ksize, double sigmaColor, double sigmaSpace)
{
Mat result;
bilateralFilter(img, result, ksize, sigmaColor, sigmaSpace);
return result;
}
int main()
{
Mat img = imread("test.jpg"); // 读入图像
imshow("Original Image", img); // 显示原图像
Mat img_gaussian = addGaussianNoise(img, 0, 30); // 添加高斯噪声
imshow("Gaussian Noise", img_gaussian); // 显示带高斯噪声的图像
Mat img_salt_and_pepper = addSaltAndPepperNoise(img, 0.1); // 添加椒盐噪声
imshow("Salt and Pepper Noise", img_salt_and_pepper); // 显示带椒盐噪声的图像
Mat img_uniform = addUniformNoise(img, 0, 30); // 添加均匀分布噪声
imshow("Uniform Noise", img_uniform); // 显示带均匀分布噪声的图像
Mat img_mean = meanFilter(img_gaussian, 5); // 均值滤波
imshow("Mean Filtering", img_mean); // 显示均值滤波后的图像
Mat img_median = medianFilter(img_salt_and_pepper, 5); // 中值滤波
imshow("Median Filtering", img_median); // 显示中值滤波后的图像
Mat img_gaussian_filter = gaussianFilter(img_uniform, 5, 2); // 高斯滤波
imshow("Gaussian Filtering", img_gaussian_filter); // 显示高斯滤波后的图像
Mat img_bilateral = bilateralFilter(img_gaussian, 5, 30, 30); // 双边滤波
imshow("Bilateral Filtering", img_bilateral); // 显示双边滤波后的图像
waitKey(0); // 等待按键
return 0;
}
```
希望能够帮助到您!