Che tu sia un neofita nella fotografia o un professionista, ti sarà sicuramente capitato di imbatterti in un Istogramma. Questo grafico è forse lo strumento primario per un fotografo. Pensa alla foto che hai appena scattato come ad un oceano, e a te come un navigante. Ecco, l’istogramma è quella bussola che ti permette di navigare, orientandosi verso il risultato che vuoi raggiungere, perchè:
- Ti fornisce un’idea chiara sulla luminosità globale dell’immagine;
- Ti aiuta a monitorare lo stato di luminosità dell’immagine durante il tuo editing fotografico.
Quando scattiamo una foto, dobbiamo assicurarci di riprendere il nostro soggetto cercando di minimizzare la perdita di informazioni. La nostra macchia fotografica o il nostro smartphone in quanto strumenti digitali discretizzare le informazioni e sono in grado di catturare solo una parziale raffigurazione della realtà che ci circonda. Di questo subset che acquisiamo, dobbiamo assicurarci di aver portato a casa il massimo possibile. In questo caso, l’istogramma ci fornisce subito un’informazione di saturazione delle luci o delle ombre. Se una foto possiede zone troppo sovraesposte o, al contrario,sottoesposte. diventerà difficile o talvolta impossibile riuscire a recuperare quelle informazioni. Quando questo accade, si dice che quelle porzioni delle immagini che presentano luci o ombre sono bruciate.
In questo articolo voglio addentrarmi con te dentro questo grafico, e ti mostrerò i passaggi con i quali viene generato affinché tu possa comprendere fino in fondo la natura di questo potente strumento.
A cosa serve l’Istogramma in fotografia?
Partiamo con il rispondere alla domanda fondamentale:
Che cos’è un istogramma?
Un istogramma è un grafico a barre che viene utilizzato in matematica e statistica per rappresentare in maniera semplice e chiara una distribuzione di dati. Prendiamo ad esempio un gruppo di persone delle quali vogliamo comprendere la distribuzione di altezze. Per far questo, dobbiamo andare a misurare l’altezza di ogni componente del gruppo e raggruppare fra loro coloro che hanno la stessa altezza.

Ecco che quindi con un numero sufficiente ampio di individui (una popolazione) potremo trovare gruppi composti da n persone, dove n è diverso da gruppo a gruppo, con la stessa altezza. Ora prendiamo un grafico e sull’asse x indichiamo le diverse altezze che registriamo, in ordine crescente. Sull’asse y invece andiamo ad indicare per ogni valore di altezza il numero di individui della nostra popolazione che hanno proprio quell’altezza. Quello che ne otteniamo è un istogramma, che ci fornirà come l’altezza è distribuita nel gruppo che stiamo andando a calcolare.

Ok va bene, ma che c’entra l’altezza con la fotografia?
Pensa ad ogni immagine, ogni fotografia che hai scattato come ad una popolazione di pixels. Ogni immagine ha una dimensione di mxn pixels, che sono considerati le unità fondamentali di un’immagine. Quando guardi un’immagine è come se vedessi dall’alto un’immensa città di edifici attaccati fra loro, ciascuno con la propria altezza. Se comprendi questo concetto, allora hai già compreso la natura dell’istogramma in campo fotografico.Ogni pixel infatti è composto a sua volta da 3 componenti (filtri). Avrai sentito sicuramente parlare in gergo di RGB. RGB è l’acronimo di Red Green Blue, ovvero i tre filtri di cui è composto il singolo pixels.
Regolando l’intensità di ogni singolo colore, che andremo a chiamare Canale, potremo ottenere i colori che vediamo a schermo.
Prendendo quindi a riferimento un istogramma prodotto a partire da un’immagine a colori, si riportano in asse delle ascisse (asse x) i valori di luminosità per ogni canale dai più bassi ai più alti, e in ordinata (asse y) la quantità di pixel con la stessa luminosità. Così facendo viene creata la distribuzione di luminosità per i canali del Rosso, Verde e Blu. Quando invece si ragiona su scala di Grigi, l’istogramma viene creato andando a rappresentare la distribuzione non dei singoli valori per i canali RGB, ma della loro media pesata che prende il nome di Luminanza.
Che cos’è la Luminanza?
La luminanza è la luminosità riportata come equivalenza di scala di grigi. Sebbene esistano diverse formulazioni per la Luminanza, può essere presa a riferimento quella derivante dalla specifica emessa dal National Television System Commitee nel 1957:
L = 0,3*R + 0,59*G + 0,11*B
Come puoi notare da questa formula, il peso maggiore è dato dal canale Verde che influisce per un 60% sul valore totale di Luminanza.
Nota bene: ogni canale RGB viene codificato in all’interno di un byte di informazione. Il numero di valori che può rappresentare un byte (a sua volta composto da 8 bit, quindi 8 valori 0 e 1) è dato dalla combinazione dei bit che lo compongono. Il numero di combinazioni seguendo base due è quindi 2^8 =256. Quindi i valori che possono essere assunti sono da 0 a 255. Potrai notare inoltrare che la somma dei pesi per il calcolo della luminanza è uguale a 1, quindi anche la luminanza potrà assumere valori compresi nell’intervallo tra 0 e 255.
Istogramma: costruiamolo insieme
Ora che conosciamo la formula, possiamo andare a costruire il nostro istogramma. Se siete interessati al codice per ottenere l’istogramma della foto, vi rimando al fondo di questo articolo dove potrai trovare direttamente il codice Python da copiare ed integrare direttamente nel tuo programma. Se invece non sei pratico di programmazione, ti invito a seguire gli step logici che ti porteranno ad una pratica comprensione della formazione di un istogramma.
- Carichiamo la nostra immagine
Primo passaggio è quello di andare a caricare nel nostro script l’immagine di cui vogliamo andare a creare l’istogramma. Il linguaggio di programmazione a oggetti Python si appoggia di diverse librerie per snellire i compiti di chi scrive codice. Nel nostro caso, ci avvarremo delle seguenti librerie:- PIL (Python Image Library) per l’apertura e la manipolazione efficace della nostra immagine sorgente;
- numpy per la creazione dell’array dei valori di luminanza;
- mathplotlib per la creazione per la rappresentazione del grafico una volta generato;
- Una volta caricata la nostra immagine, dobbiamo andare a contare il numero di pixels che possiede. Tramite il metodo size possiamo ottenere larghezza e altezza dell’immagine. Il numero di pixels totali sarà quindi il prodotto della larghezza per l’altezza;
- Creiamo il nostro vettore per andare a ospitare le misure della luminanza dei vari pixels. Dal momento che abbiamo detto che la Luminanza ha un valore da 0 a 255, andiamo a creare una “fila” (array) di caselle tutte con valore 0, perchè al momento la nostra misurazione non è ancora iniziata;

- Leggiamo ogni pixel della nostra immagine. Partendo da primo pixel in alto a sinistra, scorriamo uno ad uno tutti i pixels della prima riga, e poi ricominciamo da sinistra per la riga successiva, fino a completare il nostro rilevamento. Questo può essere fatto andando a creare due cicli for annidati per il conteggio delle coordinate i e j per righe e colonne;

- Ogni volta che “passiamo sopra un pixel”, registriamo i valori dei suoi canali RGB;
- Calcoliamo il valore di luminanza applicando la formula spiegata in precedenza nell’articolo, e andiamo nel nostro array dei valori di luminanza, e alla posizione uguale a quella del valore di luminanza aggiorniamo il contatore aggiungendo un’unità (+1);

Vi riporto sotto il codice completo che ho sviluppato per poter aprire l’immagine in evidenza del mio ultimo articolo e determinarne l’istogramma. Di seguito il codice:
#IMPORTO LIBRERIE PIL, NUMPY E MATPLOTLIB
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
#CARICO L'IMMAGINE SORGENTE
source = Image.open("Titolo Immagine")
source_rgb = source.convert('RGB')
#CALCOLO LARGHEZZA ED ALTEZZA DELL'IMMAGINE
width, height = source_rgb.size
#CREO L'ARRAY PER L'ISTOGRAMMA
histogram = np.zeros(256, dtype=int)
#PASSO IN RASSEGNA TUTTI I PIXELS DELL'IMMAGINE
for i in range(height):
for j in range(width):
r, g, b = source_rgb.getpixel((j, i))
#CALCOLO LA LUMINANZA PER IL PIXEL IN COORDINATE (i,j)
gray = int(0.3 * r + 0.59 * g + 0.11 * b)
gray = min(gray, 255)
histogram[gray] += 1
#CREO L'ISTOGRAMMA
plt.figure(figsize=(12, 6))
plt.bar(range(256), histogram, color='gray', width=1.0)
plt.xlabel("Intensità di grigio (0-255)")
plt.ylabel("Frequenza")
plt.title("Istogramma completo dei livelli di grigio")
plt.grid(axis='y', linestyle='--', alpha=0.5)
plt.tight_layout()
plt.show()
Sotto invece il risultato finale con l’istogramma che mostra la distribuzione di luminanza:

Adesso tocca a te
Adesso che hai capito come viene generato un istogramma in fotografia, è il momento di cominciare a sperimentare con i concetti che hai acquisito!
Se sei interessato a questo e ad altri approfondimenti, ti consiglio di iscriversi alla newsletter del blog per rimanere informato sulle prossime pubblicazioni.
Buona Luce