"""
Questa classe permette di creare un oggetto che contiene i disturbi (gaussian, salt_pepper, lightness, focus_blur,
motion_blur, geometric) da applicare all'immagine e i relativi parametri. In fase di implementazione sono state
prese alcune scelte che evitano l'impostazione di tutti i parametri visti nel modulo library, per avere maggiori
informazioni fare riferimento alla relazione.
"""
[documenti]
class NoiseData:
noise_list = ['gaussian', "salt_pepper", "lightness", "focus_blur", "motion_blur", "geometric"]
__types = ""
__values = []
__prior = 0
def __init__(self, types: str, values: list, p: int):
"""
Permette la costruzione di un oggetto della classe NoiseData.
Args:
types: una stringa che indica la tipologia del rumore da introdurre, quest'ultimo dovrà essere presente nella noise_list.
values: una lista che contiene i valori che possono essere impostati all'interno dei metodi che applicano i disturbi. Sfruttando questa classe non sarà possibile modificare tutti i parametri.
p: un valore intero che indica una priorità.
"""
self.__types = types
self.__values = values
self.__prior = p
# Getter
@property
def typology(self):
"""
Questo metodo permette di ottenere la lista associata al tipo di rumore da applicare.
Returns:
stringa con la tipologia del rumore.
"""
return self.__types
# Setter
@typology.setter
def typology(self, t: str):
"""
Questo metodo permette di impostare la tipologia di rumore che dovrà essere applicato
Args:
t: la stringa che contiene la tipologia di rumore, deve essere in noise_list.
Raises:
ValueError: se la tipologia del rumore, t, non è presente all'interno di ['gaussian', "salt_pepper", "lightness", "focus_blur", "motion_blur", "geometric"]
Returns:
"""
t = t.lower()
if t not in self.noise_list:
raise ValueError("typology deve essere ", self.noise_list)
self.__types = t
# Getter
@property
def values(self):
"""
Questo metodo permette di ottenere i parametri da impostare all'interno dei metodi che implementano i disturbi.
Returns:
una lista che contiene tutti i valori da impostare.
"""
return self.__values
# Setter
@values.setter
def values(self, values: list):
"""
Questo metodo permette di impostare i valori che verranno passati ai parametri dei metodi che implementano i
disturbi.
Args:
values: una lista con tutti i parametri da impostare.
Raises:
TypeError: se values non è una lista.
ValueError: se qualche parametro presente all'interno di values non è corretto o permesso, infatti, non i parametri modificabili all'interno dei metodi che applicano i disturbi sono stati sfruttati. Le scelte che hanno portato a questa decisione sono descritte nella documentazione. Il messaggio a schermo quando verrà sollevata l'eccezione spiega a che tipologia di disturbo si riferisce l'errore.
Returns:
"""
if not isinstance(values, list):
raise TypeError("values deve essere una lista")
elif self.__types == "lightness":
if len(values) != 2:
raise ValueError("La lightness deve avere values = [out_min, out_max].")
elif self.__types == 'motion_blur':
if len(values) != 1 or not isinstance(values[0], int):
raise ValueError("Il motion_blur deve avere values = [ksize].")
elif self.__types == 'focus_blur':
if len(values) != 1 or not isinstance(values[0], float):
raise ValueError("Il focus_blur deve avere values = [sigma]")
if self.__types == "gaussian":
if len(values) != 1 or not isinstance(values[0], (int, float)):
raise ValueError("Il rumore gaussiano deve avere values = [std_dev] e "
"questo valore deve essere int o float")
elif self.__types == "salt_pepper":
if len(values) != 1 or not (0 <= values[0] <= 1):
raise ValueError("Il rumore salt & pepper deve avere values = [amount] e "
"questo valore deve essere compreso tra 0 e 1.")
elif self.__types == "geometry":
if len(values) != 1:
raise ValueError("La lightness deve avere values = [angle].")
self.__values = values
@property
def priority(self):
"""
Questo metodo permette di ottenere il livello di priorità associato a ciascun disturbo.
Returns:
il livello di priorità del disturbo.
"""
return self.__prior
@priority.setter
def priority(self, p: int):
"""
Questo metodo permette di impostare il livello di priorità associato a un disturbo.
Args:
p: il valore di priorità da impostare.
Raises:
TypeError: se il parametro p non è un intero.
ValueError: se la priorità specificata dal parametro p non è maggiore di 0.
Returns:
"""
if isinstance(p, int):
if p > 0:
self.__prior = p
else:
raise ValueError("priority deve essere un valore maggiore di 0.")
else:
raise TypeError("priority deve essere un int.")