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。

效果图如下所示:

Blog_OpenCV_Learnl_115.png


二、添加高斯噪声

高斯噪声是一种符合高斯分布的随机噪声,它在图像处理中常用于模拟自然环境中的随机干扰或误差。

#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 表示输入的图像,用于添加高斯噪声,ij 两个整数,用于生成高斯噪声的均值和标准差。首先创建一个与原图像大小相同的噪声图像 image_noise,并将其初始化为全零,即黑色图像。使用 OpenCV 中的 RNG 类(随机数生成器)生成符合高斯分布的随机噪声,将其填充到 image_noise 中。这个随机噪声具有指定的均值 i 和标准差 j。将原图像 image 与生成的高斯噪声图像 image_noise 相加,从而得到带有高斯噪声的图像。

效果图如下所示:

Blog_OpenCV_Learnl_116.png


posted @ 2025-08-19 17:04  fengMisaka  阅读(6)  评论(0)    收藏  举报