opencv 高斯噪声和椒盐噪声

之前在使用matlab时,有库函数可以直接给图像添加椒盐、高斯噪声等,最近在学习opencv,发现库中并没有定义这种加噪函数(可能是我没有找到 `_` ),所以想要给图片加噪,就必须得自己写函数。

首先 , 通过查找课本以及博客中其他人的见解,得出如下理解:

1.椒盐噪声

椒盐噪声(salt-and-pepper noise)又称脉冲噪声,它随机改变一些像素值,在二值图像上表现为使一些像素点变白,一些像素点变黑。椒盐噪声是指两种噪声,一种是盐噪声(salt noise),另一种是胡椒噪声(pepper noise)。盐=白色,椒=黑色。前者是高灰度噪声,后者属于低灰度噪声。一般两种噪声同时出现,呈现在图像上就是黑白杂点。————引自百度百科

直白的说,椒盐噪声的出现点是随机的,噪声的数值是固定的,要么是 0 (黑色),要么是 255 (白色)。

函数程序如下:

//添加椒盐噪声
IplImage* addSaltNoise(IplImage* image, int n) {
IplImage* dst = cvCloneImage(image);
for(int k = 0 ; k < n ;k++)
{
//取随机值
int row = rand()%dst->height;
int col = rand() % dst->width;
//图像通道判断
if (dst->nChannels == 1) {
*(dst->imageData + row * dst->widthStep + col * dst->nChannels) = 255;
}
else
{
*(dst->imageData + row * dst->widthStep + col * dst->nChannels) = 255;
*(dst->imageData + row * dst->widthStep + col * dst->nChannels + 1) = 255;
*(dst->imageData + row * dst->widthStep + col * dst->nChannels + 2) = 255;
}
}
for (int k = 0; k < n; k++)
{
//取随机值
int i = rand() % dst->width;
int j = rand() % dst->height;
//图像通道判断
if (dst->nChannels == 1) {
*(dst->imageData + j * dst->widthStep + i * dst->nChannels) = 0;
}
else
{
*(dst->imageData + j * dst->widthStep + i * dst->nChannels) = 0;
*(dst->imageData + j * dst->widthStep + i * dst->nChannels + 1) = 0;
*(dst->imageData + j * dst->widthStep + i * dst->nChannels + 2) = 0;
}
}
return dst;

}

2.高斯噪声

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。常见的高斯噪声包括起伏噪声、宇宙噪声、热噪声和散粒噪声等等。除常用抑制噪声的方法外,对高斯噪声的抑制方法常常采用数理统计方法。

如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。高斯白噪声的二阶矩不相关,一阶矩为常数,是指先后信号在时间上的相关性。高斯白噪声包括热噪声和散粒噪声

                                                                                                                                                   ——————引自百度百科

高斯噪声出现在图像的每一个点上,而值的大小却是随机的。

   程序如下:

#include "stdafx.h"
#include "highgui.h"
#include "cv.h"

IplImage* AddGaussianNoise(IplImage* src)
{
IplImage* dst = cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
IplImage* noise = cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
CvRNG rng = cvRNG(-1);
cvRandArr(&rng, noise, CV_RAND_NORMAL, cvScalarAll(0), cvScalarAll(25));
cvAdd(src, noise, dst);
return dst;
}
int main()
{
IplImage* img = cvLoadImage("H:\\3.jpg",1);
IplImage* GauNoise = cvCreateImage(cvGetSize(img), img->depth, img->nChannels);
GauNoise = AddGaussianNoise(img);
cvShowImage("原图", img);
cvShowImage("添加高斯噪声", GauNoise);
while (1)
{
if (cvWaitKey(15) == 27)
break;
}
    return 0;
}


你可能感兴趣的:(opencv 高斯噪声和椒盐噪声)