OpenCV-Python图像添加(高斯/椒盐/泊松/斑点)噪声

xiaohai 2023-07-08 08:03:20 2763人围观 标签: Opencv 
简介图像添加(高斯/椒盐/泊松/斑点)噪声
一、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()

图片alt
图片分别含有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()

图片alt