1.理论知识
先看伟大的高斯分布(Gaussian Distribution)的概率密度函数(probability density function):
Gaussian Distribution(Normal Distribution)其图形特点为中间高,两头低,是钟形曲线(bell-shaped curve)。在高斯分布中,以数学期望μ表示钟型的中心位置(也即曲线的位置),而标准差(standard deviation)σ表征曲线的离散程度。
随机变量X服从数学期望为μ、方差为σ^2的正态分布,记为:
X = N ( μ, σ^2 )
当数学期望为0,方差为1时,该分布为标准正态分布(standard normal distribution)。
高斯分布曲线的特征:
关于μ对称;总面积为1;在μ加减σ处为拐点(先内翻后外翻。
此外,我们通过公式可以看出,σ越大,x位置的概率值就越小,说明曲线越平缓(矮小);而如果σ小,x的概率就大,说明曲线是瘦高的,概率分布比较集中。
如上图所示,红,蓝,橘黄色曲线的数学期望在0点,但蓝色的方差为0.2,所以其最为陡峭,而橘红色曲线的方差为5.0,证明其分布很广,由于曲线的概率总和为1,所以若其分布广,则高度必然会较低。绿色曲线由于其数学期望为-2,所以,在其他三条曲线的左侧。
对应于numpy中:
numpy.random.normal(loc=0.0, scale=1.0, size=None)
参数的意义为:
loc:float
此概率分布的均值(对应着整个分布的中心centre)
scale:float
此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints
输出的shape,默认为None,只输出一个值
我们更经常会用到的np.random.randn(size)所谓标准正态分布(μ=0,σ=1),对应于np.random.normal(loc=0, scale=1, size)。
2.利用高斯模糊可以实现毛玻璃的特效
import cv2 as cv
import numpy as np
def clamp(pv):
if pv > 255:
return 255
if pv < 0:
return 0
else:
return pv
def gaussian_noise(image):
h, w, c = image.shape
for row in range(h):
for col in range(w):
#获取3通道的随机数
s = np.random.normal(0, 20, 3)
#获取3通道的原始值
b = image[row, col, 0] # blue
g = image[row, col, 1] # green
r = image[row, col, 2] # red
#通过随机数,更新3通道的原始值
image[row, col, 0] = clamp(b + s[0])
image[row, col, 1] = clamp(g + s[1])
image[row, col, 2] = clamp(r + s[2])
cv.imshow("noise image", image)
print("--------- Hello Python ---------")
src = cv.imread("D:/vcprojects/images/example.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
t1 = cv.getTickCount()
#gaussian_noise(src)
t2 = cv.getTickCount()
time = (t2 - t1)/cv.getTickFrequency()
print("time consume : %s"%(time*1000))
dst = cv.GaussianBlur(src, (0, 0), 15)
cv.imshow("Gaussian Blur", dst)
cv.waitKey(0)
cv.destroyAllWindows()
3.效果展示