OpenCV入门(22):图像处理之噪声
一、添加椒盐噪声
椒盐噪声是一种随机噪声,模拟图像中出现黑白像素点的情况,即有些像素点变为白色(盐噪声),有些变为黑色(椒噪声)。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
// 函数定义:添加椒盐噪声
void saltAndPepper(Mat image, int n)
{
for (int k = 0; k < n; k++)
{
int i, j;
// 随机选择像素位置
i = cvflann::rand_int() % image.cols;
j = cvflann::rand_int() % image.rows;
int white_black = cvflann::rand_int() % 2;
if (white_black == 0)
{
// 添加白噪声
if (image.type() == CV_8UC1)
{
image.at<uchar>(j, i) = 255;
}
else if (image.type() == CV_8UC3)
{
image.at<cv::Vec3b>(j, i)[0] = 255;
image.at<cv::Vec3b>(j, i)[1] = 255;
image.at<cv::Vec3b>(j, i)[2] = 255;
}
}
else
{
// 添加黑噪声
if (image.type() == CV_8UC1)
{
image.at<uchar>(j, i) = 0;
}
else if (image.type() == CV_8UC3)
{
image.at<cv::Vec3b>(j, i)[0] = 0;
image.at<cv::Vec3b>(j, i)[1] = 0;
image.at<cv::Vec3b>(j, i)[2] = 0;
}
}
}
}
int main()
{
// 读取 Lena 图像
Mat lena = imread("lena.jpg");
Mat lenaGray = imread("lena.jpg", 0);
// 创建存储添加噪声后图像的变量
Mat lena_SP, lenaGray_SP, lena_G, lenaGray_G;
// 复制原图像到变量
lena.copyTo(lena_SP);
lenaGray.copyTo(lenaGray_SP);
lena.copyTo(lena_G);
lenaGray.copyTo(lenaGray_G);
// 添加椒盐噪声
saltAndPepper(lena_SP, 10000);
saltAndPepper(lenaGray_SP, 10000);
// 显示原图像
imshow("src Image", lena);
imshow("src Image Gray", lenaGray);
// 显示添加椒盐噪声后图像
imshow("dst Image", lena_SP);
imshow("dst Image Gray", lenaGray_SP);
// 等待用户按键
waitKey();
}
在函数 saltAndPepper(Mat image, int n) 中,输入参数 image 为输入图片,输入参数 n 为产生椒盐噪声的数量。使用 cvflann::rand_int() 产生随机整数,模以图片的行数和列数得到随机的像素位置,模 2 得到余数 0 或 1,0 代表添加白噪声,1 代表添加黑噪声。使用 image.type() 判断图片的类型,对灰度图或彩色图添加噪声,在对彩色图添加噪声时需要将三个通道的值全部置为 0 或 255。
效果图如下所示:

二、添加高斯噪声
高斯噪声是一种符合高斯分布的随机噪声,它在图像处理中常用于模拟自然环境中的随机干扰或误差。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
// 函数定义:添加高斯噪声
void gaussianNoise(Mat image, int i, int j)
{
// 创建与原图像相同大小的噪声图像
Mat image_noise = Mat::zeros(image.rows, image.cols, image.type());
RNG rng;
// 生成高斯分布的随机噪声
rng.fill(image_noise, RNG::NORMAL, i, j);
// 将原图像和噪声图像相加得到带噪声的图像
image = image + image_noise;
}
int main()
{
// 读取 Lena 图像
Mat lena = imread("lena.jpg");
Mat lenaGray = imread("lena.jpg", 0);
// 创建存储添加噪声后图像的变量
Mat lena_SP, lenaGray_SP, lena_G, lenaGray_G;
// 复制原图像到变量
lena.copyTo(lena_SP);
lenaGray.copyTo(lenaGray_SP);
lena.copyTo(lena_G);
lenaGray.copyTo(lenaGray_G);
// 添加高斯噪声
gaussianNoise(lenaGray_G, 10, 20);
gaussianNoise(lena_G, 10, 20);
// 显示原图像
imshow("src Image", lena);
imshow("src Image Gray", lenaGray);
// 显示添加高斯噪声后图像
imshow("dst Image", lena_G);
imshow("dst Image Gray", lenaGray_G);
// 等待用户按键
waitKey();
}
在函数 void gaussianNoise(Mat image, int i, int j) 中,image 表示输入的图像,用于添加高斯噪声,i 和 j 两个整数,用于生成高斯噪声的均值和标准差。首先创建一个与原图像大小相同的噪声图像 image_noise,并将其初始化为全零,即黑色图像。使用 OpenCV 中的 RNG 类(随机数生成器)生成符合高斯分布的随机噪声,将其填充到 image_noise 中。这个随机噪声具有指定的均值 i 和标准差 j。将原图像 image 与生成的高斯噪声图像 image_noise 相加,从而得到带有高斯噪声的图像。
效果图如下所示:


浙公网安备 33010602011771号