Un istogramma, in ambito di image processing, è un grafico che mostra quanti pixel di un’immagine hanno una certa intensità di colore. Prendiamo ad esempio un’immagine con 256 colori, si va dal nero ( valore 0 ) al bianco ( valore 255 ), in questo caso per costruire un istogramma occorre una sola passata dei valori. In pratica si prende ogni pixel dell’immagine e lo si mette in un array di valori, un algoritmo in C/C++ potrebbe essere questo:
int istog[255]; for (int i = 0; i < 256; i++) isto[i] = 0; for (int x = 0; x < img.width; x++) { for (int y = 0; y < img.height; y++) { clr = img[x][y]; isto[clr]++; } }
Al termine del doppio ciclo l’array istog conterrà un valore indicante quanti pixel dell’immagine hanno il colore n. Un istogramma fornisce quindi delle informazioni sul grado di nitidezza di un’immagine, in quanto a seconda della dimensione del picco centrale avremo degli sbalzi di colore ridotto rispetto ad un grafico con un picco molto più ampio.
L’idea di fondo dell’histogram equalization è quindi quella di modificare l’istogramma dell’immagine rendendolo più ampio possibile in modo da renderlo equi-distribuito. Sono presenti tre fasi distinte in questo algoritmo:
- Costruzione dell’istogramma dall’immagine di partenza
- Modifica dell’istogramma
- Applicazione dell’istogramma all’immagine
La prima fase è stata già descritta in precedenza, la seconda non è complicata ed in pratica avviene in questo modo: dato un singolo colore i, il suo nuovo valore è dato dalla somma dei precedenti valori, moltiplicato per una certa quantità N = 256 / W * H.
nuovo valore i = ( istog[0] + … + istog[i] ) * N
La terza fase serve per ottenere la nuova immagine ed è molto semplice, infatti basta scandagliare il nuovo array istog_new ed assegnare ad ogni pixel il nuovo valore di colore.
L’histogram equalization è un semplice, ma efficace algoritmo che consente di migliorare il contrasto delle immagini. Ovviamente in questa sede ho spiegato soltanto la base di questo algoritmo, esistono anche delle note varianti e ci sono altri algoritmi molto conosciuti che si basano proprio su questo.