"""
Modulo che applica un disturbo di sfocatura dovuta al movimento o alla messa a fuoco, ad un'immagine codificata in RGB o scala di grigi sfruttando openCV2.
"""
import cv2
import numpy as np
[documenti]
def apply_motion_blur(image: cv2.typing.MatLike, ksize: int = 15, angle: float = 45.0) -> cv2.typing.MatLike:
"""
Questo metodo simula un defocus dovuto al movimento.
Args:
image: l'immagine a cui applicare il rumore sotto forma di matrice.
ksize: controlla la quantità di movimento, deve essere dispari e maggiore di 0.
angle: controlla la direzione del movimento.
Raises:
ValueError: se la dimensione del kernel non è maggiore di 0 e non è dispari, Il messaggio a schermo chiarirà il motivo.
Returns:
l'immagine a cui è stato applicato il motion blur.
"""
if ksize <= 0:
raise ValueError("ksize deve essere maggiore di 0")
if ksize % 2 == 0:
raise ValueError("il kernel deve avere dimensione dispari")
kernel = np.zeros((ksize, ksize))
kernel[ksize // 2, :] = np.ones(ksize)
kernel = kernel / ksize
if angle != 0:
center = (ksize // 2, ksize // 2)
m = cv2.getRotationMatrix2D(center, angle, 1.0)
kernel = cv2.warpAffine(kernel, m, (ksize, ksize)) # Ruota il kernel data la matrice di rotazione
return cv2.filter2D(image, -1, kernel)
[documenti]
def apply_focus_blur(image: cv2.typing.MatLike, blur_kernel: tuple[int, int] = (31, 31),
sigma: float = 0.0) -> cv2.typing.MatLike:
"""
Questo metodo che simula un mancato focus dello scatto.
Args:
image: l'immagine a cui applicare il rumore sotto forma di matrice.
blur_kernel: tupla che contiene due numeri dispari, controlla la grandezza del filtro gaussiano.
sigma: numero che definisce la forza del defocus, deve essere maggiore di 0.
Raises:
ValueError: se il blur kernel non è bidimensionale o non contiene valori dispari. L'errore può essere causato anche da una sigma negativa. Il messaggio a schermo chiarirà il motivo.
Returns:
una matrice numpy che rappresenta l'immagine a cui è stato aggiunto il focus blur.
"""
if len(blur_kernel) != 2:
raise ValueError("Il blur_kernel può essere solamente bidimensionale.")
if (blur_kernel[0] % 2) == 0 or (blur_kernel[1] % 2) == 0:
raise ValueError("Il blur_kernel deve essere definito mediante una tupla che contiene interi dispari dispari.")
if sigma <= 0.e-12:
raise ValueError("sigma deve essere un numero maggiore o uguale di 0.")
blurred = cv2.GaussianBlur(image, blur_kernel, sigma)
return blurred