OpenCV-Python图像添加(高斯/椒盐/泊松/斑点)噪声
简介图像添加(高斯/椒盐/泊松/斑点)噪声
一、np.random.randint()、np.random.normal()
1.1、np.random.randint()函数:
numpy.random.randint(low, high=None, size=None, dtype='l')
low (inclusive) to high (exclusive)的随机整数。如果默认high=None,则取[0, low)
- low:从分布中提取的最小的整数
- high:分布中提取的最大值
- size::输出形态,例如(m,n,k),默认为None,表示给出单值
- dtype:获得的数据类型
返回值:int or ndarray of ints。size-shaped array
示例:
>>> import numpy as np
>>> np.random.randint(2,size=10)
array([1, 1, 0, 0, 0, 0, 0, 0, 1, 0])
>>> np.random.randint(3,size=10)
array([0, 1, 1, 1, 2, 2, 2, 0, 1, 0])
>>> np.random.randint(1,size=10)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
>>> np.random.randint(1,10,size=10)
array([6, 7, 3, 9, 6, 2, 1, 3, 4, 3])
>>> np.random.randint(1,10,size=(2,4))
array([[1, 5, 8, 7],
[6, 7, 9, 1]])
>>> np.random.randint(1,10,size=(3,4))
array([[8, 5, 4, 5],
[4, 4, 8, 8],
[6, 3, 1, 5]])
1.2、np.random.normal()
np.random.normal(loc,scale,size)
- loc:float 此概率分布的均值(对应着整个分布的中心),loc=0说明这一个以Y轴为对称轴的正态分布
- scale:float 此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
- size:为一个二元元组,如(2,1), 为返回的矩阵的size
该函数用于生成一个指定形状的符合高斯分布的随机数,并将生成的结果通过值返回。第1个参数对应整个高斯分布的中心。第2个参数对应高斯分布的宽度。scale 值越大,分布越扁平;反之,分布越高耸。第3个参数为可选参数,可根据需求进行输出尺寸的设置,若未指定,则仅输出单个值。当参数loc设置为0,scale 设置为1时,即代表标准正态分布。
>>> np.random.normal(0,1,10)
array([ 0.10776615, 0.81299827, 2.44066159, -1.81348872, -0.23403644,
0.14650539, 1.68715879, -1.98638548, 0.28942458, -1.76158585])
>>> np.random.normal(0,10,10)
array([ 2.63533538, 9.18777582, -12.83312121, -14.07350625,
-10.00886325, -4.65037186, -4.06965115, 8.36519733,
13.62806091, -2.51405138])
>>> np.random.normal(0,10,(2,3))
array([[-0.90608174, 2.86926449, 13.36532391],
[-5.24681199, -6.45934608, 8.4775034 ]])
>>> np.random.normal(2,10,(2,3))
array([[-23.850593 , 1.08538345, 4.57825469],
[ 0.02448953, 23.20805639, -0.51318159]])
二、椒盐噪声
椒盐噪声又称脉冲噪声,噪点是非黑即白。椒指的是黑色的噪点(0,0,0),盐指的是白色的噪点(255,255,255)。噪点在图像上随机生成,可以通过控制噪声的比例,设置图像损坏的程度。下面是一个增加椒盐噪声的例子。
OpenCV中没有提供专门为图像添加椒盐噪声的函数,需要使用者根据自己需求编写生成椒盐噪声的程序。考虑到椒盐噪声会随机产生在图像中的任何一个位置,因此要生成椒盐噪声,我们需要用到随机数生成函数。由于NumPy在数据处理中的优异表现,对于随机数的生成,我们可以使用np.random.randint()函数。
import cv2
import numpy as np
def add_salt_pepper_noise(src, rate):
src_copy = src.copy()
height, width = src_copy.shape[0:2]
print(height,width)
noise_count = int(rate * height * width / 2)
x = np.random.randint(width, size=noise_count)
y = np.random.randint(height, size=noise_count)
src_copy[y, x] = 255
x = np.random.randint(width, size=noise_count)
y = np.random.randint(height, size=noise_count)
src_copy[y, x] = 0
return src_copy
img = cv2.imread("1-1.jpg", cv2.IMREAD_UNCHANGED)
cv2.imshow("scr", img)
cv2.imshow("noise- 1%", add_salt_pepper_noise(img, 0.01))
cv2.imshow("noise- 5%", add_salt_pepper_noise(img, 0.05))
cv2.imshow("noise- 10%", add_salt_pepper_noise(img, 0.1))
cv2.waitKey(0)
cv2.destroyAllWindows()
图片分别含有1%,5%和10%椒盐噪声。明显可以看出噪声比例越高,图像越不清晰。
三、高斯噪声
高斯噪声就是噪声密度函数服从高斯分布的一类噪声,可以通过调节标准差(sigma), 来控制噪声的程度。NumPy中提供了可以产生符合高斯分布(正态分布)的随机数的 np.random.normal()函数。
下面是一个增加高斯噪声的例子。
import cv2
import numpy as np
def add_gauss_noise(src, sigma):
mean = 0
size = src.shape
gauss = np.random.normal(mean, sigma, size)
noisy_img = np.uint8(src + gauss)
return noisy_img
img = cv2.imread("1-1.jpg", cv2.IMREAD_UNCHANGED)
cv2.imshow("scr", img)
cv2.imshow("noise- sigma=5", add_gauss_noise(img, 5))
cv2.imshow("noise- sigma=10", add_gauss_noise(img, 10))
cv2.imshow("noise- sigma=20", add_gauss_noise(img, 20))
cv2.waitKey(0)
cv2.destroyAllWindows()