eLocal Group Centro Soluzioni
Conversione da BN a HSV






In questa soluzione convertiamo un' immagine in pixel bianchi e neri in un' immagine a colori assegnando ai pixel più scuri un colore freddo (blu) e ai pixel più luminosi un colore caldo (rosso).

Il primo passo è generare l'immagine in bianco e nero da convertire, costruiamo un caso semplice con un'immagine 100x100 in cui coloriamo i pixel più vicini al centro di bianco mentre quelli più lontani di nero sfumando con una funzione gaussiana. La funzione gaussiana sarà centrata nel centro dell'immagine e avrà come variabili la x e la y del punto sulla figura.

La funzione gaussiana, in questo caso bidimensionale è definita in una classe Gaussiana2D che avrà come parametri: la x e la y in cui è centrata, memorizzati nell'array _mu = [x , y]; le deviazioni standard _sx per x e _sy per y, memorizzate in _sigma = [_sx , _sy] (le teniamo separate perché in generale potrebbero essere diverse); l'ultimo parametro è la normalizzazione della funzione, cioè il valore che assume nel suo punto massimo.
La funzione dovrà avere anche un metodo Eval con in input il punto [x ,y] in cui essere valutata e in output il valore calcolato secondo i parametri definiti sopra.

Costruiamo l'immagine inizializzando una matrice "foglio" bidimensionale 100x100 di zeri, questa è infatti un'immagine totalmente nera.
Inizializziamo la nostra funzione "mia_gaussiana" specificando che ha come punto centrale il centro dell'immagine e che sfuma con una deviazione standard pari a un quinto del lato dell'immagine.

Per marcare i pixel secondo la nostra funzione gaussiana incapsuliamo due cicli for, uno che cicla sulla x e l'altro sulla y, e assegnamo all'elemento foglio[x , y] il valore calcolato dal metodo Gaussiana2D.Eval() della funzione.

Il risultato è una specie di macchia in bianco e nero al centro dell'immagine come in figura.

Per convertire l'immagine in colori secondo uno spettro che spazia dal blu al rosso dobbiamo definire una nuova funzione GeneraMappaColori, la funzione deve prendere in input l'immagine in bianco e nero e restituire un' immagine a colori.

Il processo di conversione deve essere effettuato in due passaggi, nel primo facciamo corrispondere alla scala bianco e nero dell'immagine una scala su uno spettro a colori blu-rosso secondo la codifica HSV, nel secondo passiamo dalla codifica HSV alla RGB (rosso, verde, blu) che viene utilizzata normalmente dalle altre funzioni di stampa dell'immagine.
Per passare dal bianco e nero ai colori HSV all'interno della funzione GeneraMappaColori inizializziamo una matrice "foglio_hsv" 100x100x3 in cui l'ultima dimensione 3 rappresenta i tre parametri H (Hue), S (saturation) e V (value); a noi interessa solo H perché è quello che descrive il colore.

L'assegnazione è effettuata definendo una corrispondenza lineare tra bianco/nero e blu/rosso secondo la formula H = conv_bn_to_hsv*b_n, in cui "conv_bn_to_hsv" è una costante che descrive la proporzionalità, b_n è il valore del pixel in bianco e nero (da 0 = nero a 255 = bianco) e H è il colore in HSV (0 = blu, 120 = rosso), la costante è scelta conv_bn_to_hs =120/255 in modo che H possa assumere valori da 0 a 120 per b_n che assume valori da 0 a 255.

Il calcolo della conversione per ciascun pixel avviene ciclando ancora con due for sulle x e sulle y e assegnando al canale corrispondente ad H, cioè lo [x , y , 0] per x e y fissati, il valore calcolato dalla relazione lineare foglio_hsv[x , y , 0] = conv_bn_to_hsv*foglio[x,y].
Lasciamo gli altri due canali [x , y , 1] e [x , y , 2] corrispondenti ad S e V a valori costanti.

Al termine dei due cicli for abbiamo l'immagine in HSV, per passare ad un immagine RGB utilizziamo la funzione cv2.cvtColor() in cui come input viene indicata un'immagine da convertire e la conversione cercata (per noi cv2.COLOR_HSV2RGB che converte HSV in RGB) e restituisce in output l'immagine convertita.

Alla fine di tutto ciò avremo la nostra immagine colorata con colori freddi all'esterno e colori caldi all'interno.




Torna alle soluzioni