数学之路-python计算实战(7)-机器视觉-图像产生加性零均值高斯噪声

图像产生加性零均值高斯噪声,在灰度图上加上噪声,加上噪声的方式是每个点的灰度值加上一个噪声值,噪声值的产生方式为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:[email protected]
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()


数学之路-python计算实战(7)-机器视觉-图像产生加性零均值高斯噪声_第1张图片

本博客所有内容是原创,如果转载请注明来源

http://blog.csdn.net/myhaspl/

下面部分代码为彩色图像的高斯噪声产生  

# -*- coding: utf-8 -*- 
#加性零均值高斯噪声
#code:[email protected]
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()

数学之路-python计算实战(7)-机器视觉-图像产生加性零均值高斯噪声_第2张图片



你可能感兴趣的:(数学之路-python计算实战(7)-机器视觉-图像产生加性零均值高斯噪声)