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.5R - G   R - B 

 B  G acos
 R  G 2  R  B G  B  



H 

0.5R - 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