图像产生加性零均值高斯噪声,在灰度图上加上噪声,加上噪声的方式是每个点的灰度值加上一个噪声值,噪声值的产生方式为Box-Muller算法生成高斯噪声。
在计算机模拟中,经常需要生成正态分布的数值。最基本的一个方法是使用标准的正态累积分布函数的反函数。除此之外还有其他更加高效的方法,Box-Muller变换就是其中之一。另一个更加快捷的方法是ziggurat算法。下面将介绍这两种方法。一个简单可行的并且容易编程的方法是:求12个在(0,1)上均匀分布的和,然后减6(12的一半)。这种方法可以用在很多应用中。这12个数的和是Irwin-Hall分布;选择一个方差12。这个随即推导的结果限制在(-6,6)之间,并且密度为12,是用11次多项式估计正态分布。
Box-Muller方法是以两组独立的随机数U和V,这两组数在(0,1]上均匀分布,用U和V生成两组独立的标准常态分布随机变量X和Y:
- 。
这个方程的提出是因为二*度的卡方分布很容易由指数随机变量(方程中的lnU)生成。因而通过随机变量V可以选择一个均匀环绕圆圈的角度,用指数分布选择半径然后变换成(正态分布的)x,y坐标。
Box-Muller 是产生随机数的一种方法。Box-Muller 算法隐含的原理非常深奥,但结果却是相当简单。它一般是要得到服从正态分布的随机数,基本思想是先得到服从均匀分布的随机数再将服从均匀分布的随机数转变为服从正态分布。
# -*- coding: utf-8 -*- #加性零均值高斯噪声 #code:myhaspl@myhaspl.com import cv2 import numpy as np fn="test2.jpg" myimg=cv2.imread(fn) img=cv2.cvtColor(myimg,cv2.COLOR_BGR2GRAY) param=30 #灰阶范围 grayscale=256 w=img.shape[1] h=img.shape[0] newimg=np.zeros((h,w),np.uint8) for x in xrange(0,h): for y in xrange(0,w,2): r1=np.random.random_sample() r2=np.random.random_sample() z1=param*np.cos(2*np.pi*r2)*np.sqrt((-2)*np.log(r1)) z2=param*np.sin(2*np.pi*r2)*np.sqrt((-2)*np.log(r1)) fxy=int(img[x,y]+z1) fxy1=int(img[x,y+1]+z2) #f(x,y) if fxy<0: fxy_val=0 elif fxy>grayscale-1: fxy_val=grayscale-1 else: fxy_val=fxy #f(x,y+1) if fxy1<0: fxy1_val=0 elif fxy1>grayscale-1: fxy1_val=grayscale-1 else: fxy1_val=fxy1 newimg[x,y]=fxy_val newimg[x,y+1]=fxy1_val cv2.imshow(‘preview‘,newimg) cv2.waitKey() cv2.destroyAllWindows()
本博客所有内容是原创,如果转载请注明来源
http://blog.csdn.net/myhaspl/
下面部分代码为彩色图像的高斯噪声产生# -*- coding: utf-8 -*- #加性零均值高斯噪声 #code:myhaspl@myhaspl.com import cv2 import numpy as np fn="test2.jpg" myimg=cv2.imread(fn) img=myimg param=30 #灰阶范围 grayscale=256 w=img.shape[1] h=img.shape[0] newimg=np.zeros((h,w,3),np.uint8) for x in xrange(0,h): for y in xrange(0,w,2): r1=np.random.random_sample() r2=np.random.random_sample() z1=param*np.cos(2*np.pi*r2)*np.sqrt((-2)*np.log(r1)) z2=param*np.sin(2*np.pi*r2)*np.sqrt((-2)*np.log(r1)) ......... ......... newimg[x,y,0]=fxy_val_0 newimg[x,y,1]=fxy_val_1 newimg[x,y,2]=fxy_val_2 newimg[x,y+1,0]=fxy1_val_0 newimg[x,y+1,1]=fxy1_val_1 newimg[x,y+1,2]=fxy1_val_2 cv2.imshow(‘preview‘,newimg) cv2.waitKey() cv2.destroyAllWindows()