IMC!


Contenuti


Foto

 







Curiosando...
Novita  Novità Link  Link Blog  Blog English  Español 
Regolazione automatica del colore nelle foto

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:
  1. Risorsa immagine: una risorsa immagine della libreria GD, creata ad esempio con imagecreatefromjpeg().
  2. Metodo (facoltativo): indica il metodo di normalizzazione da seguire (vedi sotto per ulteriori dettagli). Può valere 1 o 2. Di default è 2.
  3. 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_img2254);
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:
  1. 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.
  2. 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.
  3. 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:
  1. 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).
  2. 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!







Commenti

1 - AnonimoGio 20 Ott 2016 - 02:22:07  

Meraviglia.


Scrivi un commento

Pui scrivere quì sotto un commento all'articolo che hai appena letto. Non sono abilitate smile, immagini e link. La lunghezza massima del commento è 4000 caratteri. La buona educazione è benvenuta, tutti i commenti offensivi saranno cancellati.

Your comment (lascia bianco!):
Utente (max 25 caratteri, obbligatorio)
Sito web (max 255 caratteri, facoltativo)
e-Mail (max 255 caratteri, facoltativa, non sarà pubblicata) Your opinion (lascia bianco!):
Commento (max 4000 caratteri, obbligatorio):





Valid HTML 4.01 Transitional
E-Mail - 89.23 ms

Valid HTML 4.01 Transitional