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!






Fatal error: Call to undefined function sqlite_open() in /membri/giacobbe85/include/commenti.inc.php on line 324