"""
Modulo per applicare rumore Gaussiano o Salt & Pepper ad immagini codificate in RGB o scala di grigi
utilizzando OpenCV2.
"""
from typing import Union
import cv2
import numpy as np
import random
[documenti]
def add_gaussian_noise(image: cv2.typing.MatLike, mean: Union[int, float] = 0,
std_dev: Union[int, float] = 25) -> cv2.typing.MatLike:
"""
Questo metodo permette di aggiunge rumore Gaussiano ad un'immagine codificata in RGB o scala di grigi.
Args:
image: l'immagine a cui applicare il rumore.
mean: la media della distribuzione normale.
std_dev: la deviazione standard della distribuzione normale.
Raises:
ValueError: se la deviazione standard è minore o uguale a zero.
Returns:
l'immagine con il rumore gaussiano.
"""
if std_dev <= 0:
raise ValueError("la deviazione standard deve essere maggiore di 0")
image = image.astype(np.float32) / 255.0
gaussian_noise = np.random.normal(mean, std_dev / 255.0, image.shape)
noisy_image = image + gaussian_noise
noisy_image = np.clip(noisy_image, 0, 1)
noisy_image = (noisy_image * 255).astype(np.uint8)
return noisy_image
[documenti]
def add_salt_and_pepper_noise(image: cv2.typing.MatLike, amount: float = 0.4) -> cv2.typing.MatLike:
"""
Questo metodo permette di aggiungere il rumore Salt & Pepper ad un'immagine codificata in RGB o scala di grigi.
Args:
image: l'immagine a cui applicare il rumore, sotto forma di matrice.
amount: la percentuale di pixel da alterare con rumore Salt & Pepper. Il valore atteso è una percentuale (es. 0.4 = 0.004%).
Returns:
l'immagine con il rumore Salt & Pepper aggiunto.
"""
amount = amount / 100
noisy_image = np.copy(image)
num_noise = np.ceil(amount * image.size * 0.5).astype(int)
for _ in range(num_noise):
i = random.randint(0, image.shape[0] - 1)
j = random.randint(0, image.shape[1] - 1)
if image.ndim == 3:
noisy_image[i, j, :] = 255
else:
noisy_image[i, j] = 255
for _ in range(num_noise):
i = random.randint(0, image.shape[0] - 1)
j = random.randint(0, image.shape[1] - 1)
if image.ndim == 3:
noisy_image[i, j, :] = 0
else:
noisy_image[i, j] = 0
return noisy_image