opencv-1.为图片生成uniform噪声

今天学习了noise model的基础。图像中的噪声的来源很多,很广,比如是拍照片时的相机因素,或者环境因素(布朗运动也可能),还有比如可能是CCD、CMOS,或者是图像存储在了错误的位置也可能(放到了内存中错误位置)。噪声会干扰我们正确的获取图片信息,所以,去噪很重要。为了便于去噪,我们就需要对不同来源的噪声很了解,所以有了各种的noise model来帮助我们分析noise。  

常见的noise model有Gaussian Noise 、White Noise、Brownian Noise (Fractal Noise)、Impulse Valued Noise (Salt and Pepper Noise)、Quantization noise(Uniform noise)等。更多详细信息请google :noise model.  

下面是为一张图片生成uniform noise的代码,其主要思想是:先读入目标图片,然后让获取的每一个像素值加上一个随机数,得到新的像素值,然后修改原像素为新像素即可。代码如下:

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

#include "cv.h"
#include 

#include 
#include 

//returns a uniformly distributed random number
double uniform()
{
	//rand()是一个标准函数,它返回0-32767(0X7FFF)之间的数。
	//控制返回值在 -0.5 ~ +0.5之间
	return ( rand() / (float) 0x7fff) - 0.5;
}
//生成噪声函数
//amount默认是255
IplImage* GenerateNoise(IplImage* img , float amount = 255)
{
	CvSize imgSize = cvGetSize(img);
	IplImage* imgTemp = cvCloneImage(img);
	for (int y = 0; y < imgSize.height; y++)
	{
		for (int x = 0; x < imgSize.width; x++)
		{
			int randomValue = (int)( (uniform()) * amount);
			//获得的像素值+随机数得到新的像素值
			int pixelValue = cvGetReal2D(imgTemp,y,x) + randomValue;
			//应用这个新的像素值到图像上
			cvSetReal2D(imgTemp,y,x,pixelValue);
		}		
	}
	return imgTemp;
}

int main()
{
	//load the image with no noise
	//以灰度图的方式载入,所以载入完成后只有黑白色
	IplImage* img = cvLoadImage("1.jpg",0);
	IplImage* imgTemp;
	//设置一个滑动条来控制噪声的数量
	//控制条初始位置20
	int trackPos = 20;
	cvNamedWindow("Image");
	//生成一个滑动条控制噪声数量
	cvCreateTrackbar("amount","Image",&trackPos,255,NULL);

	while(1)
	{
		imgTemp = GenerateNoise(img,trackPos);
		//display it all
		cvShowImage("Image",imgTemp);
		cvReleaseImage(&imgTemp);
		char keyPress = cvWaitKey(10);
		if (keyPress == 27)//退出
		{
			break;
		}
	}
	cvReleaseImage(&img);
	return 0;
}
效果图:

图一:

opencv-1.为图片生成uniform噪声_第1张图片

图二:

opencv-1.为图片生成uniform噪声_第2张图片

你可能感兴趣的:(OpenCV)