Elaborazione di Immagini Luigi Cinque [email protected] Elaborazione delle Immagini Introduzione Libri di testo Possono essere consultati: Rafael C. Gonzalez, Richard E. Woods: Digital Image Processing, 2nd, Prentice Hall, 2004. Robert M. Haralick, Linda G. Shapiro: Computer amd Robot Vision, Vol I, Addiso Wesley, 1994. Elaborazione delle Immagini Introduzione 2 Le immagini Elaborazione delle Immagini Introduzione 3 Una immagine è una rappresentazione spaziale di un oggetto o di una scena bidimensionale o tridimensionale Nel campo dell’elaborazione di immagini per immagine generalmente si intende la rappresentazione della scena stessa dopo il processo di digitalizzazione Dal punto di vista di un programmatore una immagine è una matrice bidimensionale di valori omogenei Sistema di acquisizione Componenti di un sistema di acquisizione Elaborazione delle Immagini Introduzione 4 La telecamera (in generale un sensore elettronico) Memoria immagine (frame grabber) Monitor Calcolatore Database Attuatore Sistema di acquisizione Monitor comandi di controllo A/D Memoria D/A Immagine Database Immagini Elaborazione delle Immagini risultati numerici Introduzione comandi di controllo 5 A/D: convertitore analogico/digitale D/A: convertitore digitale/analogico Il processo di acquisizione Scena Segnale elettrico di una singola linea di scansione Telecamera Segnale elettrico analogico 20 30 22 28 40 27 28 27 Elaborazione delle Immagini Introduzione 6 Segnale campionato Matrice risultante Il processo di digitalizzazione Elaborazione delle Immagini Introduzione 7 Il segnale acquisito da una telecamera è tipicamente un segnale continuo che descrive l’intensità del segnale luminoso secondo una scansione per linee La digitalizzazione trasforma un segnale continuo discretizzandolo sia nella dimensione spaziale, che in quella dei livelli di grigio (convertitore A/D) Il segnale convertito viene memorizzato in una memoria immagine che funge da interfaccia tra l’elaboratore, il monitor e l’elemento di acquisizione Tra la memoria immagine ed il monitor vi è un convertitore D/A Risoluzione spaziale La risoluzione spaziale è la più piccola dimensione dell’oggetto osservato che può essere discriminata La cella di risoluzione è la più piccola area elementare associata ad un valore in una immagine digitale Generalmente la cella elementare è un quadrato ma si possono anche avere celle rettangolari o esagonali Elaborazione delle Immagini Introduzione 8 Risoluzione spaziale Pixel (picture element) è descritto dalla posizione spaziale di una cella elementare (riga, colonna) e dal valore ad essa associato Dimensioni comuni per immagini digitali sono 256x256, 1024x1024, 640x480 Elaborazione delle Immagini Introduzione 9 Risoluzione spaziale Elaborazione delle Immagini Introduzione 10 Risoluzione nella scala di grigi Una immagine binaria è una immagine in cui ogni pixel può assumere solo due valori: (0,1), (vero, falso), (oggetto, sfondo) una immagine binaria utilizza solo un bit per pixel Una immagine a toni di grigio è una immagine in cui ogni pixel assume valori in un intervallo più ampio valori tipici sono [0, 63], [0, 255], [0, 1023], rispettivamente 6, 8, 10 bit per pixel Elaborazione delle Immagini Introduzione 11 Un osservatore umano percepisce una scala continua di grigi osservando immagini memorizzate con 8 bit Risoluzione nella scala dei grigi Elaborazione delle Immagini Introduzione 12 Immagini a colori Le immagini a colori nella loro forma più semplice sono costituiti da pixel che memorizzano 3 valori distinti (uno per la componente rossa, uno per la componente verde, il terzo per il blu) Normalmente per ogni colore si utilizza un byte per cui sono rappresentabili 256x256x256 colori diversi (circa 16 milioni) Elaborazione delle Immagini Introduzione 13 Immagini a colori Spesso per limitare l’occupazione di memoria si utilizzano un numero limitato di colori, riuscendo quindi a memorizzare l’immagine con un minore numero di pixel (8, 4, 1) In questo caso però l’immagine deve memorizzare anche la LUT dei colori Elaborazione delle Immagini Introduzione 14 LUT dei colori LUT valore pixel Elaborazione delle Immagini Introduzione 15 R1 G1 B1 R2 G2 B2 R3 G3 B3 R4 G4 B4 Valore effettivamente visualizzato R5 G5 B5 (R5, G5, B5) R6 G6 B6 R7 G6 B7 Immagini a colori Immagine originale Immagine a 256 colori Immagine a Immagine a 16 colori 8 colori Elaborazione delle Immagini Introduzione 16 Immagini a colori Immagine originale Immagine dei verdi Elaborazione delle Immagini Introduzione 17 Immagine dei rossi Immagine dei blu Modelli di colore I modelli di colore sono in genere relativi all’applicazione RGB - monitor CMYK – cyan, magenta, yellow, black – stampanti Elaborazione delle Immagini Introduzione 18 Modelli di colore YIQ – luminance, inphase, quadrature – tv color HIS – hue, saturation, intensity HSV - hue, saturation, value Elaborazione delle Immagini Introduzione 19 Altri modelli per il colore YUV YIQ Elaborazione delle Immagini Introduzione 20 0.587 0.114 R Y 0.299 U 0.147 0.289 0.436 G V 0.615 0.515 0.1002 B 0.114 R Y 0.299 0.587 I 0.596 0.274 0.322 G Q 0.211 0.523 0.312 B Altri modelli per il colore HSV H è il colore dominante - 0° rosso, 120° verde, 240° blu S (saturazione – cioè intensità di colore) - 0 è un tono di grigio V Max (R, G, B) Elaborazione delle Immagini Introduzione 21 0.5R - G R - B B G acos R G 2 R B G B H 0.5R - G R - B B G - acos 2 R G R B G B max R, G, B min R, G, B S max R, G, B HSV Verde V 0°: 255, 0, 0 Giallo 60°: 255, 255, 0 Ciano Bianco Blu Rosso 120°: 0, 255, 0 180°: 0, 255, 255 Magenta 240°: 0, 0, 255 Elaborazione delle Immagini Introduzione 22 H 300°: 255, 0, 255 S Bianco: H indefinito, 255, 255, 255 Altri modelli per il colore rgb r = R/(R+G+B) g = G/(R+G+B) b = B/(R+G+B) È una rappresentazione normalizzata rispetto all’intensità luminosa (r+g+b=1) Elaborazione delle Immagini Introduzione 23 Immagini bitmap (bmp) Elaborazione delle Immagini Introduzione 24 typedef struct { short magic; /* "BM" */ long file_dim; /* dimensione file */ long l0; /* 0 */ long header_dim; /* dimensione header */ long l40; /* 40 */ long xsize; /* numero colonne */ long ysize; /* numero righe */ short nchan; /* 1 */ short zsize; /* 1-4-8-24 */ long compression; /* 0 -> non compresso */ long data_dim; /* dimensione dati */ long xppi; long yppi; long colors; /* dimensione lut */ long colors1; } bmp_header; Struttura del file: intestazione, lut dei colori utilizzati dati dell’immagine per righe (le righe devono essere di dimensione multipla di 4 byte) Immagini portable gray map (pgm) Struttura del file: Elaborazione delle Immagini Introduzione 25 prima riga “P5” un numero arbitrario (anche 0) di righe di commento che iniziano con “#” una riga contenente numero di colonne e numero di righe un numero arbitrario (anche 0) di righe di commento che iniziano con “#” una riga contenente il valore massimo del range (normalmente 255) i dati dell’immagine (1 byte per pixel) Immagini portable pixel map (ppm) Struttura del file: Elaborazione delle Immagini Introduzione 26 prima riga “P6” un numero arbitrario (anche 0) di righe di commento che iniziano con “#” una riga contenente numero di colonne e numero di righe un numero arbitrario (anche 0) di righe di commento che iniziano con “#” una riga contenente il valore massimo del range (normalmente 255) i dati dell’immagine (3 byte per pixel, terne RGB: valore per il colore rosso, verde, blu) Immagini gif Elaborazione delle Immagini Introduzione 27 Permettono di memorizzare immagini con al più 256 colori diversi Iniziano con “GIF89a” Segue un header con le informazioni sulla struttura dell’immagine (righe, colonne, numero di colori, …) Una tabella di lut con le terne corrispondenti ai colori utilizzati i dati dell’immagine (logicamente 1 byte per pixel) in formato compresso Immagini gif Immagine “ppm” circa 290 Kb Immagine “gif” circa 53 Kb N.B. a partire dalla “gif” è possibile riottenere l’immagine “ppm” di partenza Non si ha perdita di informazione Elaborazione delle Immagini Introduzione 28 Immagini jpg Si scompone l’immagine a colori in blocchi di 16x16 pixel, si fa una analisi in frequenza del blocco e si eliminano le alte frequenze (che l’occhio umano non percepisce bene) Se le immagini devono essere utilizzate da un osservatore umano il risultato è generalmente ottimo: buon aspetto e pochi dati da trasmettere/memorizzare Elaborazione delle Immagini Introduzione 29 Immagini jpg Immagine “ppm” circa 290 Kb Immagine “jpg” circa 25 Kb N.B. a partire dalla “jpg” non è possibile riottenere l’immagine “ppm” di partenza Si ha perdita di informazione Elaborazione delle Immagini Introduzione 30 Il grado di compressione (ma quindi anche la perdita di informazione) è un parametro del processo di trasformazione Immagini a colori e Java Java normalmente utilizza un int per trattare immagini: il byte meno significativo per la componente blu, poi la verde, quindi la rossa Il byte più significativo (componente alfa) è il grado di trasparenza del pixel (255 pixel opaco, 0 pixel trasparente cioè invisibile) Elaborazione delle Immagini Introduzione 31 Immagini a colori e Java Dato il valore (V) di un pixel per ottenere le singole componenti normalmente si procede: R = (V >> 16) & 255;// R = (V/0x10000) & 255 G = (V >> 8) & 255; B = (V) & 255; In modo analogo l’operazione inversa Elaborazione delle Immagini Introduzione 32 V = (R<<16) | (G<<8) | (B) | 0xff000000; L’ultimo termine è necessario per avere un pixel opaco ovviamente si deve avere: 0 R,G,B 255) Immagini a toni di grigio Un immagine a toni di grigio è una immagine in cui le tre componenti sono uguali Un metodo intuitivo per operare la trasformazione grigio è Elaborazione delle Immagini Introduzione 33 G = (R+G+B)/3 Dato che l’occhio ha una sensibilità diversa per I diversi colori si preferisce una media pesata Una scelta frequente è G = 0.299*R + 0.587*G + 0.114*B Istogramma La prima elaborazione che vediamo è l’istogramma L’operazione di calcolo dell’istogramma è il conteggio del numero di volte che ogni valore è presente nell’immagine Il risultato è perciò un vettore di interi Dal punto di vista della programmazione significa scandire l’intera immagine e per ogni pixel incrementare un elemento opportuno del vettore - Istogramma[ immagine[i][j] ]++ Elaborazione delle Immagini Introduzione 34 Istogramma Elaborazione delle Immagini Introduzione 35 Un primo programma import java.awt.*; import java.awt.image.*; import java.applet.Applet; public class IstogrammaApplet extends Applet { private Image image; private ImageCanvas imageCanvas; private Panel panel; private TextArea text; public void init() { String image_file = getParameter("IMAGEFILE"); image = getImage(getDocumentBase(), image_file); while(image.getWidth(this)<0); Dimension imageSize = new Dimension( image.getWidth(this), image.getHeight(this)); imageCanvas = new ImageCanvas(image, imageSize); int[] pixels = ImageCanvas.grabImage(image, imageSize); panel = new Panel(new GridLayout(1,2,10,10)); text = new TextArea(20,5); panel.add(imageCanvas); panel.add(text); add(panel); text.setText((new Istogramma(pixels)).toString()); } Elaborazione delle Immagini Introduzione 36 } Un primo programma class Istogramma { private int histo[] = new int[256]; public String toString() { String text = ""; for(int i=0; i<256; i++) { text += i+" "+histo[i]+'\n'; } return text; } public Istogramma(int[] rgb) { for(int i=0; i<rgb.length; i++) { int tmp = (int) ( (((rgb[i] & 0xff0000)>>16) * 0.299) + (((rgb[i] & 0x00ff00)>>8 ) * 0.587) + (((rgb[i] & 0x0000ff) ) * 0.114) ); histo[tmp]++; } } public int getValueAt(int index) { return histo[index]; } Elaborazione delle Immagini Introduzione 37 } Un primo programma public class ImageCanvas extends Canvas { static final int MIN_WIDTH = 64; static final int MIN_HEIGHT = 64; private Image image; private Dimension size; Elaborazione delle Immagini Introduzione 38 public ImageCanvas(Image img, Dimension dim) { super(); image = img; size = dim; } public Dimension getMinimumSize() { return new Dimension(MIN_WIDTH, MIN_HEIGHT); } public Dimension getPreferredSize() { return new Dimension(size); } public void paint(Graphics g) { g.drawImage(image, 0, 0, getBackground(), this); } Un primo programma static public int[] grabImage(Image image, Dimension size) { int[] data = new int[size.width * size.height]; PixelGrabber pg = new PixelGrabber( image, 0, 0, size.width, size.height, data, 0, size.width); try { pg.grabPixels(); } catch (InterruptedException e) { System.err.println( "ImageSampler: interrupted while grabbing pixels"); return null; } if ((pg.status() & ImageObserver.ABORT) != 0) { System.err.println( "ImageSampler: pixel grab aborted or errored"); return null; } return data; Elaborazione delle Immagini Introduzione 39 } } Un primo programma Elaborazione delle Immagini Introduzione 40 <html> <head><title>Istogramma</title></head> <body> <H1>Istogramma</H1> <applet name="IstogrammaApplet" code="IstogrammaApplet.class" width="800" height="500" alt="If you had a java-enabled browser, you would see an applet here." > <param name="IMAGEFILE" value="sail.gif"> </applet> </body> </html> Un primo programma Elaborazione delle Immagini Introduzione 41