OpenCV利用高斯模糊可以实现毛玻璃的特效

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)
scalefloat
    此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
sizeint 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.效果展示
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhuyong006/article/details/85631171