本文使用python实现
本文的文字说明全在代码的注解里面,不要担心代码看不懂
高斯函数和图像
代码
import cv2 as cv
import numpy as np
def clamp(pv):
if pv > 255:
return 255
elif pv < 0:
return 0
else:
return pv
def gaussian_noise(image): # 高斯噪声
h, w, c = image.shape # image.shape[0], 图片垂直尺寸;image.shape[1], 图片水平尺寸;image.shape[2], 图片通道数
for row in range(h):
for col in range(w):
s = np.random.normal(0, 20, 3) # 产生一个正态分布
'''
numpy.random.normal(loc=0,scale=1.0,size=shape)
参数loc(float):正态分布的均值,对应着这个分布的中心。loc=0说明这一个以Y轴为对称轴的正态分布
参数scale(float):正态分布的标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦
参数size(int 或者整数元组):输出的shape,默认为None,这里设置为3,表示输出3个值
'''
b = image[row, col, 0] # blue;row高度,col宽度,0表示通道0,蓝色
g = image[row, col, 1] # green;1表示通道1,绿色
r = image[row, col, 2] # red
image[row, col, 0] = clamp(b + s[0]) # 在通道0上加上一个高斯噪声
image[row, col, 1] = clamp(g + s[1]) # 在通道1上加上一个高斯噪声
image[row, col, 2] = clamp(r + s[2]) # 在通道2上加上一个高斯噪声
cv.imshow("gaussian_noise image", image)
src = cv.imread("C:/Users/admin/Desktop/1.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
t1 = cv.getTickCount()
gaussian_noise(src) # 让图片产生高斯噪声
time = (cv.getTickCount()-t1)/cv.getTickFrequency() # 获取前后时间差
print("time:{}".format(time))
dst = cv.GaussianBlur(src, (5, 5), 0) # opencv的高斯模糊API
'''
def GaussianBlur(src: Any, ksize: Any, sigmaX: Any, dst: Any = None, sigmaY: Any = None, borderType: Any = None)
src: 输入图片,可以使是任意通道数,该函数对通道是独立处理的
ksize: 高斯内核大小。ksize.width和ksize.height允许不相同但他们必须是正奇数。或者等于0,由参数sigma决定。
sigmaX: 高斯内核在X方向的标准偏差。
sigmaY: 高斯内核在Y方向的标准偏差。如果sigmaY为0,他将和sigmaX的值相同,如果他们都为0,那么他们由ksize.width和ksize.height计算得出。
borderType:用于判断图像边界的模式。
'''
cv.imshow("Gaussian Blur", dst)
cv.waitKey(0)
cv.destroyAllWindows()
结果