Sei sulla pagina 1di 5

Elaborazione di Segnali Multimediali

a.a. 2011/2012

Rappresentazione delle immagini


L.Verdoliva

In questa prima lezione vedremo come si rappresentano diversi tipi immagini digitali in Matlab.

1 Immagini su scala di grigio


Unimmagine digitale (monocromatica) pu`o essere rappresentata in Matlab come una matrice bidimensionale
il cui generico campione x(m, n) (pixel) varia nel range [0, K 1]. Le immagini sono quindi rappresentate
con K livelli di grigio, e ogni pixel `e codicato con log2 K bit. Scriviamo i comandi Matlab per leggere da le
unimmagine in formato JPEG, e che ci consentono perci`o di memorizzarne i valori in una matrice:

x = imread(nome_file.jpg); % leggiamo il file


[M,N] = size(x); % memorizziamo le dimensioni in M e N
whos; % cosa abbiamo adesso in memoria?

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:

fid = fopen(house.y,r); % apertura del file in lettura


x = fread(fid,[512 512],uint8); % lettura dei dati
x = x; % immagine trasposta
fclose(fid); % rilascio del file
whos x; % quali sono le caratteristiche di X?

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:

figure(1); % apre la figura 1


image(x); % visualizza largomento come immagine

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:

figure; imagesc(x); colormap(gray(256)); axis image;

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

Rappresentazione delle immagini a.a. 2011-2012


Immagini a colori 3

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:

x = uint8(x); % tipo di dato supportato da JPEG


imwrite(x,immagine.jpg,JPEG,Quality,70);

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:

fid = fopen(immagine.y,wb); % apertura del file in scrittura


fwrite(fid,x,double); % scrittura dei dati
fclose(fid); % rilascio del file

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.

Rappresentazione delle immagini a.a. 2011-2012


Immagini a colori 4

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:

z = cat(4,x1,x2,x3,x4,x5); % creazione array multiframe


figure(1); % mostra la terza immagine a video
imshow(z(:,:,:,3));
figure(2); % mostra due immagini affiancate
subplot(1,2,1); imshow(z(:,:,:,1));
subplot(1,2,2); imshow(z(:,:,:,2));
figure(3); % mostra tutte le immagini
montage(z);

2.1 Esercizi proposti


1. Lettura e visualizzazione di unimmagine. Provate a scrivere una funzione in grado di visualizzare le im-
magini sia in formato JPEG che in formato grezzo. Il prototipo delle funzioni deve essere rispettivamente:
function x=vediJPG(nomefile) e function x=vediRAW(nomefile,nRighe,nColonne,tipo).

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

Rappresentazione delle immagini a.a. 2011-2012


Immagini a colori 5

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:

L = [0:1/255:1]; % definizione di K livelli di luminanza


r=1; g=1; b=1; % pesi da assegnare a R, G e B
colormap([r*L g*L b*L]); % creazione della palette

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).

Rappresentazione delle immagini a.a. 2011-2012