给图像添加高斯噪声 附源码

 

 

 

 

 

 

复制代码
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <cv/cv_tools.h>
#include <picture/cv_picture.h>
using namespace cv;
using namespace std;

double generateGaussianNoise(double mu, double sigma)
{
    static double V1, V2, S;
    static int phase = 0;
    double X;
    double U1, U2;
    if (phase == 0) {
        do {
            U1 = (double)rand() / RAND_MAX;
            U2 = (double)rand() / RAND_MAX;

            V1 = 2 * U1 - 1;
            V2 = 2 * U2 - 1;
            S = V1 * V1 + V2 * V2;
        } while (S >= 1 || S == 0);

        X = V1 * sqrt(-2 * log(S) / S);
    }
    else {
        X = V2 * sqrt(-2 * log(S) / S);
    }
    phase = 1 - phase;
    return mu + sigma*X;
}


void addNoise(uint8_t * data, int w, int h,int stride,  double mu, double sigma, int k) {

    for (int i = 0; i<h; i++) {
        for (int j = 0; j<w; j++) {
            int of = i*stride + j;
            float temp = (int)data[of] + k*generateGaussianNoise(mu, sigma);
            temp = temp>255 ? 255: (temp<0?0 :temp);
            data[of] = (int)temp;
        }
    }
}


int main()
{
    cv::Mat src = imread("D:/pic/wu.jpg",0);
    cv::Mat n1=src.clone();
    cv::Mat n2 = src.clone();
    cv::Mat n3 = src.clone();

    int w = src.cols;
    int h = src.rows;

    addNoise(n1.data, w,h,w,0, 0, 1);
    addNoise(n2.data, w, h, w, 0, 5, 1);
    addNoise(n3.data, w, h, w, 0, 10, 1);

    myShow(n1);
    myShow(n2);
    myShow(n3);

    cv::waitKey();
}
复制代码

 

posted @   洛笔达  阅读(1300)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示