Elaborazione delle Immagini Introduzione Elaborazione di Immagini Luigi Cinque
Elaborazione delle Immagini Introduzione 2 Libri di testo Possono essere consultati: Rafael C. Gonzalez, Richard E. Woods: Digital Image Processing, 2nd, Prentice Hall, Robert M. Haralick, Linda G. Shapiro: Computer amd Robot Vision, Vol I, Addiso Wesley, 1994.
Elaborazione delle Immagini Introduzione 3 Le immagini 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
Elaborazione delle Immagini Introduzione 4 Sistema di acquisizione La telecamera (in generale un sensore elettronico) Memoria immagine (frame grabber) Monitor Calcolatore Database Attuatore Componenti di un sistema di acquisizione
Elaborazione delle Immagini Introduzione 5 A/D Memoria Immagine D/A Monitor Sistema di acquisizione Database Immagini risultati numerici comandi di controllo A/D: convertitore analogico/digitale D/A: convertitore digitale/analogico comandi di controllo
Elaborazione delle Immagini Introduzione 6 Il processo di acquisizione Scena Telecamera Segnale elettrico di una singola linea di scansione Segnale campionato Matrice risultante Segnale elettrico analogico
Elaborazione delle Immagini Introduzione 7 Il processo di digitalizzazione 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
Elaborazione delle Immagini Introduzione 8 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 9 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 10 Risoluzione spaziale
Elaborazione delle Immagini Introduzione 11 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 Un osservatore umano percepisce una scala continua di grigi osservando immagini memorizzate con 8 bit
Elaborazione delle Immagini Introduzione 12 Risoluzione nella scala dei grigi
Elaborazione delle Immagini Introduzione 13 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 14 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 15 LUT dei colori valore pixel LUT R1G1B1 R2G2B2 R3G3B3 R4G4B4 R5G5B5 R6G6B6 R7G6B7 (R5, G5, B5) Valore effettivamente visualizzato
Elaborazione delle Immagini Introduzione 16 Immagini a colori Immagine originale Immagine a 256 colori Immagine a 16 colori Immagine a 8 colori
Elaborazione delle Immagini Introduzione 17 Immagini a colori Immagine originale Immagine dei rossi Immagine dei verdi Immagine dei blu
Elaborazione delle Immagini Introduzione 18 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 19 Modelli di colore YIQ – luminance, inphase, quadrature – tv color HIS – hue, saturation, intensity HSV - hue, saturation, value
Elaborazione delle Immagini Introduzione 20 Altri modelli per il colore YUV YIQ
Elaborazione delle Immagini Introduzione 21 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
Elaborazione delle Immagini Introduzione 22 HSV H S V Rosso Giallo Verde Ciano BluMagenta 0°: 255, 0, 0 60°: 255, 255, 0 120°: 0, 255, 0 180°: 0, 255, °: 0, 0, °: 255, 0, 255 Bianco Bianco: H indefinito, 255, 255, 255
Elaborazione delle Immagini Introduzione 23 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 24 Immagini bitmap (bmp) 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; /* */ 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)
Elaborazione delle Immagini Introduzione 25 Immagini portable gray map (pgm) Struttura del file: 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)
Elaborazione delle Immagini Introduzione 26 Immagini portable pixel map (ppm) Struttura del file: 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)
Elaborazione delle Immagini Introduzione 27 Immagini gif 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
Elaborazione delle Immagini Introduzione 28 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 29 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 30 Immagini jpg Immagine “ppm” circa 290 Kb Immagine “jpg” circa 25 Kb non N.B. a partire dalla “jpg” non è possibile riottenere l’immagine “ppm” di partenza Si ha perdita di informazione Il grado di compressione (ma quindi anche la perdita di informazione) è un parametro del processo di trasformazione
Elaborazione delle Immagini Introduzione 31 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 32 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 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)
Elaborazione delle Immagini Introduzione 33 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 è 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 *G *B
Elaborazione delle Immagini Introduzione 34 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 35 Istogramma
Elaborazione delle Immagini Introduzione 36 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 37 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 38 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; 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); }
Elaborazione delle Immagini Introduzione 39 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 40 Un primo programma Istogramma Istogramma <applet name="IstogrammaApplet" code="IstogrammaApplet.class" width="800" height="500" alt="If you had a java-enabled browser, you would see an applet here." >
Elaborazione delle Immagini Introduzione 41 Un primo programma