Я продемонстрировал, как можно читать изображение с cv2
и применять к нему различные уровни шума. Добавление шума не изменяет исходное изображение. Как писал @Michael MacAskill в своих комментариях, вы можете применить шум к изображению с помощью одной векторной операции. В своем ответе я создаю гауссиан со средним значением 1 и той же формой, что и изображение, и умножаю его на изображение. Уровень шума можно увеличить, увеличив стандартное отклонение гауссовского распределения шума.
import cv2
import matplotlib.pyplot as plt
import numpy as np
def apply_noise(image, scale):
"""Return image with noise.
Parameters
----------
image : ndarray, image to which noise is applied.
scale : positive float, standard deviation of Gaussian
noise distribution.
"""
image = np.asarray(image)
# Create a Gaussian noise array.
noise = np.random.normal(loc=1.0, scale=scale, size=image.shape)
# Apply the noise array.
noisy = image * noise
# Tranform to integer type.
noisy = noisy.astype(np.int32)
# Clip the values to RGB bounds.
noisy = noisy.clip(0, 255)
return noisy
Я скачал образец изображения, используя
wget -qO "astronaut.jpg" https://live.staticflickr.com/8674/16504233985_9f1060624e_q_d.jpg
, и вот примеры результатов. Исходное изображение:
img = cv2.imread("astronaut.jpg")
# Transform from BGR to RGB
img = img[..., ::-1]
plt.imshow(img)
Изображение с некоторым шумом:
img_a = apply_noise(image=img, scale=0.1)
plt.imshow(img_a)
plt.title("Gaussian std. dev. = 0.1")
Изображение с большим шумом:
img_b = apply_noise(image=img, scale=0.5)
plt.imshow(img_b)
plt.title("Gaussian std. dev. = 0.5")