#include "cv.h"
#include "highgui.h"
using namespace cv;
#define PI 3.1415926
double GetGS(double sigma)
{
double d=(double)(rand()%255-127);
double sigmaPI2=sqrt((double)(2*PI*sigma));
return (double)(exp(-d/(2*sigma*sigma))/sigmaPI2);
}
int main()
{
//读取图像
Mat image;
image=imread("line.jpg",CV_LOAD_IMAGE_GRAYSCALE);
int M=image.rows;
int N=image.cols;
//图像加噪——椒盐噪声
double SNR=0.98;
int count=(int)(M*N*(1-SNR));
for(int i=0;i<count;i++)
{
int x=rand()%M;
int y=rand()%N;
uchar* p=image.ptr<uchar>(x);
p[y]=255;
}
//高斯噪声 即以信号幅值为横轴,以出现的频率为纵轴。因此,从概率密度角度来说,高斯白噪声的幅度分布服从高斯分布
double sigma=2,xMeans=0;
double inMax=0,outMax=0;
for(int i=0;i<M;i++)
{
uchar* p=image.ptr<uchar>(i);
for(int j=0;j<N;j++)
{
if(inMax<p[j]) inMax=p[j];
p[j]=(int)(p[j]+GetGS(sigma)+xMeans);
if(outMax<p[j]) outMax=p[j];
}
}
for(int i=0;i<M;i++)
{
uchar* p=image.ptr<uchar>(i);
for(int j=0;j<N;j++)
{
p[j]=(int)((double)p[j]*inMax/outMax);
}
}
cvNamedWindow("test",CV_WINDOW_AUTOSIZE);
imshow("test",image);
waitKey(0);
return 0;
}