Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
a.a. 2011/2012
In questa prima lezione vedremo come si rappresentano diversi tipi immagini digitali in Matlab.
Attraverso il comando imread `e possibile leggere immagini con formato standard come jpeg, ti, gif, bmp
ed altri. Con il comando help imread potete vericare esattamente quali sono i formati supportati dalla
versione di Matlab che state utilizzando. Se limmagine invece `e in formato grezzo (cio`e il le non ha un
header, per cui lestensione pu`o essere qualsiasi) `e necessario conoscerne le dimensioni e il formato. Per
esempio, se limmagine `e 512 512 e il tipo di dato `e intero senza segno su 8 bit, la lettura avviene con i
seguenti comandi:
Matlab legge per colonne quindi limmagine va trasposta per una corretta visualizzazione. Fate attenzione al
fatto che le immagini che volete leggere devono trovarsi nella directory corrente o nel path; in alternativa potete
dare il percorso completo. Notate (con whos) come il comando imread memorizzi i valori come interi senza
segno su 8 bit, mentre fread li converta in double (64 bit). Quando si usa imread conviene poi eettuare
una conversione in double, perche molte operazioni in matlab non sono denite sul tipo uint8. La conversione
si ottiene facilmente col comando x=double(x).
1
Immagini su scala di grigio 2
Una volta in memoria limmagine pu`o essere visualizzata nel modo seguente:
Se x(m, n) = k, il comando image disegna nel punto (m, n) un pixel col k-esimo colore disponibile. I colori
sono deniti assegnando le corrispondenti quantit`a di rosso, verde e blu (RGB) nella palette, tramite il comando
colormap. Per denire una palette con K toni di grigio si pu`o usare il comando gray; ad esempio, attraverso
il comando colormap(gray(256)) si denisce una tavolozza di colori su livelli di grigio, tale da associare
pixel scuri a valori piccoli (0, 1...) e pixel chiari a valori grandi (...254, 255). Tramite il comando colorbar
potete aggiungere alla gura una barra che visualizza lassociazione tra colori e valori dei pixel. Per default,
il comando image produce unimmagine il cui rapporto daspetto (larghezza diviso altezza) non corrisponde a
quello originale, creando quindi unimmagine distorta. Per superare il problema usate il comando axis equal
(se limmagine `e quadrata) oppure pi` u in generale axis image. Proviamo a visualizzare limmagine pout.tif
(gi`a presente nella libreria di immagini del matlab) con i seguenti comandi:
x = imread(pout.tif);
figure; image(x); colormap(gray(256)); axis image;
Confrontate adesso questa immagine con quella che otterreste usando il comando di visualizzazione imagesc:
Noterete che la seconda immagine `e pi` u nitida, questo perche il comando imagesc eettua un automatico
riscalamento dei dati, in modo da usare al meglio la colormap (denita nel nostro caso su 256 livelli di grigio)
e avere una migliore visualizzazione.
In matlab esiste il toolbox images in cui sono denite numerose funzioni utili per limage processing, cos`
come quelle mostrate di seguito. Assegnato un le con uno specico formato (jpeg, tif, png, ...) `e possibile
avere una serie di informazioni sui dati memorizzati con il comando:
imfinfo pout.tif
Per la visualizzazione `e possibile usare la funzione imshow(x), che si comporta come il comando image,
con piccole dierenze sui formati. Se x `e double, 0 viene visualizzato come nero, 1 come bianco e tutti i
valori intermedi come grigi su 256 possibili valori (di default). Se, invece, x `e uint8 (uint16), 255 (65535) `e
visualizzato come bianco. E possibile poi specicare la dinamica dei dati [low high], che potrebbe non essere
quella convenzionale, nel seguente modo:
imshow(x,[low high]);
Se non si forniscono indicazioni sul valore minimo e massimo (imshow(x,[ ])), allora i dati vengono scalati
settando low e high al minimo e massimo valore presenti, cos` come fa imagesc. Se limmagine ha dimensioni
molto grandi e se la si vuole analizzare con dettaglio avendo una serie di informazioni sui valori dei pixel si
pu`o usare il comando imtool(x) oppure imtool(pout.tif); ovviamente in questultimo caso limmagine
non sar`a memorizzata nel workspace di matlab. Noterete come si sono aperte due nestre:
Overview window. Mostra limmagine allinterno di un rettangolo, le cui dimensioni possono essere
modicate per stabilire quali parti dellimmagine si vogliono visualizzare nella nestra principale;
Image Information window. Permette di avere molte informazioni sullimmagine: facendo scorrere il
mouse sullimmagine si conosce la posizione e il valore di ogni pixel, inoltre `e possibile esaminare i valori
dei pixel in speciche regioni cliccando il secondo pulsante della nestra.
Esplorate i diversi pulsanti disponibili e cercate di comprendere cosa fanno. Tenete presente che imtool
mostra limmagine al 100 %, cio`e ad ogni pixel dellimmagine corrisponde un pixel dello schermo. Ricordate
che per chiudere le immagini aperte con il comando imtool `e necessario digitare imtool close all e non
semplicemente close all.
In matlab dopo aver elaborato unimmagine e possibile salvarla in un le con un ben determinato formato
con il comando imwrite. Nellipotesi in cui i valori da scrivere su le siano memorizzati nella variabile x:
In questo modo si sta anche eettuando automaticamente una compressione JPEG con fattore di qualit`a 70
(tale parametro varia da 0 (qualit`a peggiore) a 100 (qualit`a migliore)). Provate a salvare unimmagine di
prova a diversi fattori di qualit`a e visualizzatela.
Se per`o limmagine che volete salvare `e double e non volete perdere informazione la cosa migliore `e salvare
i dati con fwrite senza un header, nel seguente modo:
Attenti al fatto che se volete avere coerenza nella lettura dei dati, in questultimo caso va eettuata uno-
perazione di trasposizione prima di salvare limmagine. Un altro modo di salvare i dati in matlab `e quello di
usare il comando save, molto utile qualora si vogliano per esempio salvare tutte le variabili che si trovano nel
workspace:
save dati.mat
Ovviamente se volete salvarne solo alcune di variabili, basta elencarle dopo il nome del le (il comando load
vi permette di caricarle nuovamente nel workspace).
2 Immagini a colori
Unimmagine a colori in formato standard (JPG, BMP, TIF . . . ) pu`o facilmente essere importata in Matlab
con il comando imread. In questo modo si crea una variabile che `e una matrice di dimensioni M N 3,
le cui componenti coincidono con le componenti di rosso, verde e blu dellimmagine (spazio RGB). Le tre
immagini possono essere visualizzate singolarmente su scala di grigi e deniscono le quantit`a di rosso, verde e
blu da mescolare per ottenere il pixel a colori sullo schermo.
x = imread(fragole.jpg);
figure; image(x); axis image; whos
figure; R = x(:,:,1); image(R); colormap(gray(256)); axis image;
figure; G = x(:,:,2); image(G); colormap(gray(256)); axis image;
figure; B = x(:,:,3); image(B); colormap(gray(256)); axis image;
Il comando image visualizza unimmagine a colori, operando in modo diverso se i dati sono di tipo uint8 oppure
double. Nel primo caso i valori della variabile devono essere compresi tra 0 e 255 (il che si verica ad esempio
usando imread). Nel secondo, invece, devono essere normalizzati tra 0 e 1. Notate che quando si visualizza
unimmagine a colori, non ha senso specicare una colormap. Estraendo poi le tre immagini da x `e possibile
visualizzare le componenti RGB (Red, Green, Blue): i valori pi` u luminosi si ottengono in corrispondenza delle
componenti di colore che sono presenti maggiormente nellimmagine. Facciamo un esperimento annullando la
prima componente (R) e poi ricostruiamo limmagine:
M = size(x,1); N = size(x,2);
R = zeros(M,N);
y = cat(3,R,G,B);
figure; image(y); axis image;
Provate ad annullare singolarmente anche le altre due componenti e visualizzate limmagine ricostruita.
Nel caso in cui si voglia costruire una struttura multidimensionale costituita da diverse immagini a colori
`e possibile farlo nel seguente modo:
2. Uso della colormap. Fate degli esperimenti con limmagine pout.tif e granelli.tif, al variare del numero
di livelli di grigio usati nella colormap (2,4,8,...,256), usando sia il comando image che imagesc. Quale
operazione vi permette di mostrare unimmagine con una risoluzione sui livelli di grigio piu bassa?
Perch`e a volte limmagine si vede tutta bianca?
3. Creazione di palette. Il comando colormap produce in uscita una matrice che ha esattamente tre colonne
e un numero di righe pari a K: ogni riga viene interpretata come un colore, rappresentato da tre valori
compresi tra 0 e 1, il primo dei quali specica lintensit`a del rosso, il secondo quella del verde e il terzo
quella del blu. Quindi se vogliamo creare una palette di livelli di grigio (cos` come fa automaticamente
il comando colormap(gray(256)), dobbiamo digitare i seguenti comandi:
Modicando i pesi r,g e b limmagine viene visualizzata nei toni dei vari colori dellarcobaleno. Create
una palette in toni di rosso invece che in toni di grigio, ed utilizzatela per visualizzare unimmagine.
Ripetete lesercizio usando una palette in toni di giallo.
4. Rappresentazione in falsi colori. La rappresentazione in pseudocolori (o falsi colori) consiste nel vi-
sualizzare a colori unimmagine monocromatica. Lobiettivo `e quello di migliorare linterpretazione di
unimmagine su livelli di grigio o semplicemente visualizzarla pi` u facilmente. Infatti, locchio umano `e
in grado di discriminare migliaia di variazioni di colore rispetto a qualche decina di livelli di grigio.
Un esempio di rappresentazione in falsi colori riguarda le immagini multispettrali. Queste sono un insieme
di immagini, ognuna delle quali `e stata rilevata dal satellite in una diversa banda spettrale. Considerate
le 4 immagini telerilevate di Washington, in cui `e presente una regione con il ume Potomac. Le prime
tre immagini sono state rilevate nelle tre bande del visibile, mentre la quarta `e nel vicino infrarosso.
Provate a visualizzare le prime tre immagini come immagine a colori e poi sostituite alla componente R,
la quarta immagine, quindi confrontate le due gure. Noterete come nella seconda immagine il ume
(vegetazione) `e pi`
u facilmente discriminabile dalla citt`a. Infatti il vicino infrarosso `e molto sensibile
alle parti di una scena contenenti biomasse, e limmagine mostra eettivamente in maniera chiara le
dierenze tra le componenti naturali (in rosso) e le costruzioni, composte principalmemte da asfalto e
cemento (tendenti al blu).