Sei sulla pagina 1di 6

Elaborazione di Segnali Multimediali a.a.

2010/2011

Rappresentazione delle immagini


L.Verdoliva
In questa prima lezione vedremo come si rappresentano le immagini digitali in Matlab, inoltre le caratterizzeremo tramite media e varianza e ne valuteremo listogramma.

Immagini su scala di grigio

Unimmagine digitale (monocromatica) pu` essere rappresentata in Matlab come una matrice bidimensionale o 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 ` codicato con log2 K bit. Scriviamo i comandi Matlab per leggere da le e unimmagine in formato JPEG, e che ci consentono perci` di memorizzarne i valori in una matrice: o

x = imread(nome_file.jpg); [M,N] = size(x); whos;

% leggiamo il file % memorizziamo le dimensioni in M e N % cosa abbiamo adesso in memoria?

Attraverso il comando imread ` possibile leggere immagini con formato standard come jpeg, ti, gif, bmp e 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 ` in formato grezzo (cio` il le non ha un e e header, per cui lestensione pu` essere qualsiasi) ` necessario conoscerne le dimensioni e il formato. Per o e esempio, se limmagine ` 512 512 e il tipo di dato ` intero senza segno su 8 bit, la lettura avviene con i e e seguenti comandi:

fid = fopen(house.y,r); x = fread(fid,[512 512],uint8); x = x; fclose(fid); whos x;

% % % % %

apertura del file in lettura lettura dei dati immagine trasposta rilascio del file 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, perch molte operazioni non sono denite sul tipo uint8. La conversione si ottiene e facilmente col comando x=double(x).

Immagini su scala di grigio

Una volta in memoria limmagine pu` essere visualizzata nel modo seguente: o

figure(1); image(x);

% apre la figura 1 % 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` di rosso, verde e blu (RGB) nella palette, tramite il comando a colormap. Per denire una palette con K toni di grigio si pu` usare il comando gray; ad esempio, attraverso o 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 ` quadrata) oppure pi` in generale axis image. Proviamo a visualizzare limmagine pout.tif e u (gi` presente nella libreria di immagini del matlab) con i seguenti comandi: a

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 ` pi` nitida, questo perche il comando imagesc eettua un automatico e u 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, ...) ` possibile e avere una serie di informazioni sui dati memorizzati con il comando: imfinfo pout.tif Per la visualizzazione ` possibile usare la funzione imshow(x), che si comporta come il comando image, e con piccole dierenze sui formati. Se x ` double, 0 viene visualizzato come nero, 1 come bianco e tutti i e valori intermedi come grigi su 256 possibili valori (di default). Se, invece, x ` uint8 (uint16), 255 (65535) ` e 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. 2010-2011

Immagini a colori

pu` usare il comando imtool(x) oppure imtool(pout.tif); ovviamente in questultimo caso limmagine o non sar` memorizzata nel workspace di matlab. Noterete come si sono aperte due nestre: a 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 ` possibile esaminare i valori e 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` ad ogni pixel dellimmagine corrisponde un pixel dello schermo. Ricordate e che per chiudere le immagini aperte con il comando imtool ` necessario digitare imtool close all e non e semplicemente close all.

Immagini a colori

Unimmagine a colori in formato standard (JPG, BMP, TIF . . . ) pu` facilmente essere importata in Matlab o con il comando imread. In questo modo si crea una variabile che ` una matrice di dimensioni M N 3, e 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` di rosso, verde e a blu da mescolare per ottenere il pixel a colori sullo schermo.

x = imread(Fig6.30(01).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 ` possibile e visualizzare le componenti RGB (Red, Green, Blue): i valori pi` luminosi si ottengono in corrispondenza delle u 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.

Rappresentazione delle immagini

a.a. 2010-2011

Caratteristiche delle immagini

2.1

Esercizi proposti

1. Lettura e visualizzazione di unimmagine. Provate a scrivere una funzione in grado di visualizzare le immagini 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, al variare del numero di livelli di grigio usati nella colormap (2,4,8,...,256), usando sia il comando image che imagesc. Per quale motivo in certi casi 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` del rosso, il secondo quella del verde e il terzo a 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]; r=1; g=1; b=1; colormap([r*L g*L b*L]);

% definizione di K livelli di luminanza % pesi da assegnare a R, G e B % 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 visualizzare a colori unimmagine monocromatica. Lobiettivo ` quello di migliorare linterpretazione di e unimmagine su livelli di grigio o semplicemente visualizzarla pi` facilmente. Infatti, locchio umano ` u 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 ` stata rilevata dal satellite in una diversa banda spettrale. Nelle e gure 6.27(a) no a (d) ci sono 4 immagini telerilevate di Washington, inclusa una regione con il ume Potomac. Le prime tre immagini sono state rilevate nelle tre bande del visibile, mentre la quarta ` nel e 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) ` pi` facilmente discriminabile dalla citt`. Infatti il vicino infrarosso ` e u a 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).

Caratteristiche delle immagini

Matlab fornisce diverse funzioni per determinare le caratteristiche di unimmagine. Per esempio, per calcolare il valore minimo e massimo: xmin = min(min(x)) xmax = max(max(x)) % minimo % massimo

E necessario chiamare due volte la funzione perch per matrici tali funzioni forniscono un vettore riga che e Rappresentazione delle immagini a.a. 2010-2011

Caratteristiche delle immagini

contiene il minimo (massimo) di ogni colonna, a meno che i dati non siano vettorizzati prima: xmin = min(x(:)) (xmax = max(x(:))). Per il calcolo della media e della deviazione standard:

xmed = mean(mean(x)) xstd = std(x(:),1) var = xstd^2;

% media % deviazione standard % varianza

Due osservazioni. La prima ` che la deviazione standard non pu` essere calcolata come std(std(x)), dato e o che non ` unoperazione lineare, ma va determinata vettorizzando prima i dati std(x(:)). Inoltre, poich di e e default la varianza ` calcolata normalizzando per N 1, dove N ` la lunghezza del vettore, ` conveniente e e e usare lopzione std(x(:),1) che invece divide eettivamente per N . Queste grandezze possono anche essere valutate localmente allimmagine. Scegliete unimmagine tra quelle disponibili e supponete di voler stimare limmagine delle medie locali, cio` limmagine che in ogni punto e presenta il valor medio calcolato in un vicinato 3 3 di ogni pixel. Il codice ` il seguente (N.B. per evitare il e problema ai bordi, lasciamo invariati i pixel nella cornice pi` esterna): u

MED=zeros(M-2,N-2); for i=1:M-2, for j=1:N-2, b = x(i:i+2,j:j+2); MED(i,j)=mean(b(:)); end; end; figure(1); image(MED); colormap(gray(256)); axis image; Un codice pi` eciente per realizzare questa stessa operazione ` il seguente: u e

MED=zeros(M-2,N-2); for i=-1:1, for j=-1:1, MED=MED+x(2+i:M-1+i,2+j:N-1+j); end; end; MED = MED/9; figure(1); image(MED); colormap(gray(256)); axis image; Digitate i comandi tic e toc, rispettivamente, allinizio e alla ne delle righe di codice per conoscere esattamente i tempi di calcolo, che verranno visualizzati a video, e confrontate le due soluzioni. La seconda ` molto e pi` rapida della prima perch piuttosto che calcolare il valor medio per ogni pixel del blocco (un numero di u e volte pari alle dimensioni dellimmagine), si calcolano le immagini che presentano in ogni posizione i valori dei pixel da sommare (un numero di volte pari adesso alle dimensioni del blocco). Questo signica, per esempio, che si sistemano in posizione (m0 , n0 ) per ognuna delle 9 immagini i valori della nestra 3 3 centrata in (m0 , n0 ) e poi si sommano le immagini. Il calcolo delle statistiche locali pu` essere realizzato anche usando la funzione nlfilter di matlab nel o seguente modo:

Rappresentazione delle immagini

a.a. 2010-2011

Caratteristiche delle immagini

y = nlfilter(x,[3 3],mean(x(:))) subplot(1,2,1); imshow(x,[]); subplot(1,2,2); imshow(y,[]); La funzione nlfilter realizza loperazione specicata attraverso una nestra scorrevole su tutta limmagine. Pu` risultare piuttosto lenta per cui se lelaborazione pu` anche essere realizzata sul blocco vettorizzato si pu` o o o usare la seguente soluzione:

y = colfilt(x,[3 3],sliding,@mean); Usando i comandi tic e toc, cronometrate il tempo di esecuzione delle due elaborazioni. Unanalisi pi` approfondita delle caratteristiche di unimmagine ` fornita dal suo istogramma, che rappreu e senta la frequenza di occorrenza di ogni livello di grigio:

n = hist(x(:), 0:255); figure; bar(n); axis([0 255 0 1.1*max(n)]);

% istogramma % grafico a barre % estremi per ascisse e ordinate

Il comando hist ha in ingresso il vettore x dei campioni di luminanza, e gli intervalli in cui viene suddiviso il range di tali valori; in uscita restituisce in n(i) il numero di volte che x(m, n) appartiene alli-esimo intervallo, in questo caso quindi il numero di volte in cui x(m, n) (i 1/2, i + 1/2). Provate a visualizzare gli istogrammi di alcune delle immagini che avete a disposizione. Il listato precedente ` equivalente al comando e hist(x,0:255) solo che questultimo produce solo la gura, e non il vettore delle occorrenze n. Provate poi a visualizzare listogramma usando i comandi stem e plot al posto di bar.

3.1

Esercizi proposti

1. Calcolo dellimmagine delle varianze. Scrivete il codice per calcolare e visualizzare limmagine delle varianze dellimmagine Fig3.24.jpg sempre usando blocchi 3 3. Che tipo di informazioni vi d` a sullimmagine? 2. Elaborazione per blocchi disgiunti. Provate adesso a calcolare media e varianza su blocchi dellimmagine disgiunti tra loro. Il toolbox Images di Matlab ore la funzione blockproc o blkproc che permette di eettuare rapidamente delle operazioni su tutti i blocchi in cui pu` essere divisa unimmagine. Dopo o aver letto lhelp di blockproc, create una funzione che calcola media, massimo e minimo su blocchi 8 8. Il prototipo `: function [medie massimi minimi] = blockStat(x). e 3. Istogramma. Il toolbox images vi fornisce il comando imhist, usate lhelp in linea per conoscerne le funzionalit` e provate ad utilizzarlo. a

Rappresentazione delle immagini

a.a. 2010-2011