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

来源:互联网 发布:高通软件 编辑:程序博客网 时间:2024/06/06 07:37

今天学习了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 <stdio.h>#include <math.h>#include <float.h>//returns a uniformly distributed random numberdouble uniform(){//rand()是一个标准函数,它返回0-32767(0X7FFF)之间的数。//控制返回值在 -0.5 ~ +0.5之间return ( rand() / (float) 0x7fff) - 0.5;}//生成噪声函数//amount默认是255IplImage* 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;//设置一个滑动条来控制噪声的数量//控制条初始位置20int trackPos = 20;cvNamedWindow("Image");//生成一个滑动条控制噪声数量cvCreateTrackbar("amount","Image",&trackPos,255,NULL);while(1){imgTemp = GenerateNoise(img,trackPos);//display it allcvShowImage("Image",imgTemp);cvReleaseImage(&imgTemp);char keyPress = cvWaitKey(10);if (keyPress == 27)//退出{break;}}cvReleaseImage(&img);return 0;}
效果图:

图一:


图二:


0 0
原创粉丝点击