Codice sorgente per disturbs.noise

"""
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