Le foto che dobbiamo mettere on-line non sempre hanno i livelli di colore corretti. A volte sono troppo scure o chiare, oppure hanno un'errata esposizione, o ancora una tinta dominante sulle altre. Possono venirci in auito i programmi di modifica delle immagini, che, pur non facendo miracoli, possono per� migliorare decisamente la situazione.
Sono le funzioni di correzione automatica, come ad esempio
Auto Contrast (
Contrasto automatico) di
Photoshop, oppure
Auto adjust colors (
Regola automaticamente i colori) di
Irfanview, o
Equalizza ,
Bilanciamento del bianco,
Ampliamento contrasto,
Ampliamento HSV,
Aumento del colore,
Normalizza di
Gimp.
Ho cercato a lungo uno script in PHP per normalizzare i colori delle immagini, l'unico programma degno di nota � stato
PHPThumb, che per� � un pacchetto completo per la generazione di anteprime. Cos� ho deciso di scrivere un semplice script che implementa la regolazione automatica del colore, che riporto di seguito:
Codice di normalizza_img.php
<?PHP
function normalizza_img($immagine, $modo=2, $dinamica=254)
{
## Name: Normalizza_img
## Description: Script in PHP per normalizzare (regolare il colore) automaticamente una immagine.
## Utilizza la libreria GD.
## Copyright: Isacco Coccato - www.giacobbe85.altervista.org
## Version: 1.0
########################################################
### PARTE 1: Ricerca dei valori RGB minimi e massimi ###
########################################################
# Inizializza le variabili per la ricerca dei minimi e massimi RGB
$red_min=255; $green_min=255; $blue_min=255;
$red_max=0; $green_max=0; $blue_max=0;
# Scandisce ogni pixel dell'immagine per trovare i minimi e massimi RGB
for ($x=0; $x<imagesx($immagine); $x++)
{
for($y=0; $y<imagesy($immagine); $y++)
{
# Calcola RGB per il pixel corrente
$pixel_corrente=imagecolorat($immagine, $x,$y);
$red = ($pixel_corrente >> 16) & 255;
$green = ($pixel_corrente >> 8) & 255;
$blue = $pixel_corrente & 255;
# Cerca il minimo tra i valori RGB
if($red<$red_min) $red_min=$red;
if($green<$green_min) $green_min=$green;
if($blue<$blue_min) $blue_min=$blue;
#Cerca il massimo tra i valori RGB
if($red>$red_max) $red_max=$red;
if($green>$green_max) $green_max=$green;
if($blue>$blue_max) $blue_max=$blue;
}
}
#############################################
### PARTE 2: Algoritmo di normalizzazione ###
#############################################
# Normalizzazzione con metodo 2
$sposta_r = $red_min;
$sposta_g = $green_min;
$sposta_b = $blue_min;
if($red_max!=$sposta_r) $scala_r=$dinamica/($red_max-$sposta_r); else $scala_r=1;
if($green_max!=$sposta_g) $scala_g=$dinamica/($green_max-$sposta_g); else $scala_g=1;
if($blue_max!=$sposta_b) $scala_b=$dinamica/($blue_max-$sposta_b); else $scala_b=1;
# Normalizzazione con metodo 1
if($modo==1)
{
$sposta=min($sposta_r, $sposta_g, $sposta_b);
if(max($red_max, $green_max, $blue_max)!= $sposta) $scala=$dinamica/(max($red_max, $green_max, $blue_max) - $sposta); else $scala=1;
$sposta_r=$sposta; $sposta_g=$sposta; $sposta_b=$sposta;
$scala_r=$scala; $scala_g=$scala; $scala_b=$scala;
}
################################
### PARTE 3: Normalizzazione ###
################################
# Scandisce ogni pixel per normalizzarlo
for ($x=0; $x<imagesx($immagine); $x++)
{
for($y=0; $y<imagesy($immagine); $y++)
{
# Calcola RGB per il pixel corrente
$pixel_corrente=imagecolorat($immagine, $x,$y);
$red = ($pixel_corrente >> 16) & 255;
$green = ($pixel_corrente >> 8) & 255;
$blue = $pixel_corrente & 255;
# Calcola il pixel normalizzato e lo salva nell'immagine
$colore_pixel = imagecolorallocate($immagine, ($red-$sposta_r)*$scala_r, ($green-$sposta_g)*$scala_g, ($blue-$sposta_b)*$scala_b);
imagesetpixel($immagine, $x, $y,$colore_pixel);
}
}
return 1;
}
?>
La funzione lavora direttamente sull'immagine. Restitutisce 1 se l'operazione � andata a buon fine. Pu� essere usata in questo modo:
normalizza_img( risorsa immagine, metodo, dinamica)
Le variabili sono:
- Risorsa immagine: una risorsa immagine della libreria GD, creata ad esempio con imagecreatefromjpeg().
- Metodo (facoltativo): indica il metodo di normalizzazione da seguire (vedi sotto per ulteriori dettagli). Pu� valere 1 o 2. Di default � 2.
- Gamma (facoltativo): indica l'estensione di normalizzazione, cio� la distanza tra il pixel pi� chiaro e il pi� scuro. E' un valore compreso tra 0 e 254. Di defaul vale 254. Pi� questo valore � piccolo, pi� l'immagine sar� scura.
Un esempio di codice per usare la funzione �:
Codice di uso_funzione.php
<?PHP
$mia_img = imagecreatefromjpeg("pippo.jpeg");
normalizza_img($mia_img, 2, 254);
header("Content-Type: image/png"); imagepng($mia_img);
imagedestroy($mia_img);
?>
Funzionamento
Questa funzione utilizza le librerie GD, che devono quindi essere abilitate sul server. Non usa la programmazione a oggetti, e pu� essere divisa in tre parti:
- Lettura dell'immagine: vengono ricavati, per ciascun pixel dell'immagine, i valori RGB. Vengono poi cercati, tra i valori di tutti i pixel, i minimi e i massimi.
- Normalizzazione: attraverso l'uso di uno dei due algoritmi offerti, chiamati 1 e 2 e selezionabili dall'utente, vengono calcolati i parametri che saranno utilizzati per modificare ciascun pixel nella nuova immagine.
- Scrittura: i pixel vengono ricalcolati e scritti nella risorsa immagine GD. L'immagine viene cio� normalizzata.
Da notare che i dati relativi a ciascun pixel non sono salvati in un vettore (che occuperebbe molta RAM), ma letti sul momento. Non � tuttavia consigliabile usare tale script per immagini pi� grandi di 1000x1000, visto l'elevato uso di risorse.
Metodi di normalizzazione
In base alle necessit� e ai tipi di immagini, questa funzione offre due tipi di normalizzazione:
- Metodo 1: simile a Normalizza utilizzato in Gimp. Modifica i colori in modo da rendere il punto pi� chiaro dell'immagine il pi� chiaro possibile, e il punto pi� scuro il pi� scuro possibile. Il parametro dinamica indica quale deve essere la distanza finale tra il punto pi� chiaro e il punto pi� scuro dell'immagine. Questa funzione normalizza contemporaneamente i tre canali RGB, e quindi non altera la colorazione dell'immagine (cio�, per esempio: se l'immagine � rossastra e scura, diventer� pi� chiara, ma sempre rossastra).
- Metodo 2: simile a Ampliamento del contrasto in Gimp. Effettua le stesse operazioni del metodo 1 (normalizzazione), ma agisce separatamente sui tre canali RGB. Significa cio� che per ciascuno dei tre canali esisteranno nell'immagine un pixel bianco (0) e un pixel nero (255). La differenza, rispetto alla normalizzazione, � che tali minimi e massimi per i canali RGB non sono nello stesso pixel. Come risultato finale, in genere vengono eliminati gli eccessi di un colore. Cio�, per esempio: se l'immagine � rossastra e scura, diventer� pi� chiara e con i colori bilanciati.
I due metodi presentano pregi e difetti, e devono essere scelti in base alle situazioni. Vediamo il caso di una immagine di paesaggio, presa al tramonto con una webcam, e quindi con cattiva luminosit�:
|
Immagine Originale
Il file � stato salvato dalla webcam come Jpeg, e quindi contiene delle perdite. Si pu� notare come la foto sia sottoesposta, cio� sia scura. Il nostro obiettivo � migliorare nitidit� questa foto.
|
|
Metodo 1 (Normalizzazione)
Possiamo vedere come la foto sia diventata pi� nitida, ma conservi la tonalit� sul rosso dell'immagine originale: i rapporti tra i tre canali RGB non sono cambiati.
|
|
Metodo 2 (Aumento del contrasto)
Possiamo vedere come la foto sia diventata pi� nitida, e abbia perso la tonalit� sul rosso dell'originale: i rapporti tra i canali RGB sono cambiati. In questo caso la cancellazione dei toni rossi migliora l'immagine, ma non sempre pu� essere un effetto voluto. Pensiamo ad esempio alla foto della fiamma di un camino o di una candela: il rosso deve essere dominante, la sua cancellazione rende meno naturale l'immagine.
|
Buona normalizzazione!