Imaging Digitale a.a. 2014/2015 Silvia Corchs
Operazioni sulle immagini Lettura variabile=imread(nomefile) Scrittura imwrite(variabile,nomefile,parametri) Informazioni imfinfo(nomefile,parametri) Visualizzazione imshow(variabile) imagesc(variabile) imageview(variabile)
q=5 q=10 q=30 q=50
Le immagini sono viste come matrici di uint8 Immagini a colori sono matrici MxNx3 Immagini a livelli di grigio sono matrici MxN La maggior parte delle operazioni su matrici in MATLAB sono definite su double Necessario trasformare uint8 in double im2double trasforma tutte le matrici in double (tra 0 e 1). im2uint8 trasforma tutte le matrici (double) in uint8 (tra 0 e 255). Esistono diverse funzioni specifiche per le immagini imhist, imadd, imsubtract, imrotate, imresize,
>> R=im(:,:,1); Canale Red >> G=im(:,:,2); Canale Green im >> B=im(:,:,3); Canale Blue >> whos Name Size Bytes Class B 512x768 393216 uint8 G 512x768 393216 uint8 R 512x768 393216 uint8 im 512x768x3 1179648 uint8 Canale R Canale G Canale B
out(:,:,1)=g; out(:,:,2)=b; out(:,:,3)=r; % canale Red % canale Green % canale Blue originale out
im1 im2 gray=rgb2gray(im1) gray=rgb2gray(im2) 8
imadd(im,im2) imsubtract(im,im2) imlincomb(0.2,im1,0.8,im2); imlincomb(0.7,im1,0.3,im2); 9
Ridimensionamento delle immagini: imresize diverse modalità di scaling possibili: Nearest Il valore di destinazione è quello del pixel più vicino Bilineare Il valore di destinazione è determinato da una media pesata dei 4 più vicini Bicubico Il valore di destinazione è determinato da una media pesata dei 16 più vicini
>> out = imresize(immagine,m,metodo) L immagine di output ha dimensioni (n*m,m*m) Metodo= nearest, bilinear o bicubic >> out = imresize(immagine,[righe COLONNE],metodo) L immagine di output ha dimensioni (righe,colonne) Se le nuove dimensioni hanno rapporto diverso da quelle originali, l immagine è distorta Quando viene fatto un downscaling con i metodo bilinear o bicubic, viene prima eseguito di default un filtro di anti-aliasing di dimensione NxN >> out = imresize(immagine,[righe COLONNE],metodo,N) N=0 nessun filtro anti-aliasing
Sottocampionamento 128x128, M=1/4 64x64, M=1/8 out=imresize(im,m, nearest )
Ricampionamento a 512x512 dalla 256x256 Originale 512x512 512x512 512x512 im512=imresize(im256, nearest ) 512x512 im512=imresize(im256, bilinear ) Francesca Gasparini
Ricampionamento a 512x512 dalla 128x128 Originale 512x512 512x512 512x512 512x512 im512=imresize(im128, nearest ) im512=imresize(im128, bilinear ) Francesca Gasparini
Ricampionamento a 512x512 dalla 64x64 Originale 512x512 512x512 512x512 512x512 im512=imresize(im64, nearest ) im512=imresize(im64, bilinear ) Francesca Gasparini
Inversione scala di grigio: s L 1 r 0 r L 1 im gray=rgb2gray(im) neg = 255-gray Sogliatura >> out=gray; >> out(gray>100)=255; >> out(gray<100)=0; >> figure, imshow(out) 16
Istogramma: imhist Visualizza l istogramma di una immagine intensità imshow(rgb2gray(immagine)) imhist(rgb2gray(immagine))
Immagine ben contrastata
Immagini poco contrastate
Gamma correction: out c. input c 0, 0 1 250 0.04 espansione della dinamica per bassi valori di r, compressione della dinamica per alti valori di r. 200 0.1 0.2 0.4 150 1 espansione della dinamica per alti valori di r, compressione della dinamica per bassi valori di r. 100 50 1 2.5 5 10 0 0 50 100 150 200 250
>> gray=rgb2gray(immagine); >> graynorm=im2double(gray); % è in [0,1] >> graynew=im2uint8(graynorm.^0.5); 0.5
>> gray=rgb2gray(immagine); >> graynorm=im2double(gray); % è in [0,1] >> graynew=im2uint8(graynorm.^1.7); 1.7
Applicare la gamma su tutti i canali di una immagine RGB function [out]=applygamma(in,gamma) %supponiamo di avere in input immagini a 3 canali c1=im2double(in(:,:,1)); c2=im2double(in(:,:,2)); c3=im2double(in(:,:,3)); c1=c1.^gamma; c2=c2.^gamma; c3=c3.^gamma; >> applygamma(im,1.7) out(:,:,1)=im2uint8(c1); out(:,:,2)=im2uint8(c2); out(:,:,3)=im2uint8(c3);
Equalizzazione dell istogramma: idealmente produce una immagine con istogramma piatto, cioè con livelli di grigio uniformemente distribuiti sui pixel. dark bright Low-contrast High contrast
Contrast enhancement >> J=histeq(im); >> figure, subplot(2,2,1) imshow(im); >> hold on >> subplot(2,2,2), imhist(im); >> subplot(2,2,3), imshow(j); >> subplot(2,2,4), imhist(j); im 1500 imhist(im) 1000 500 0 0 50 100 150 200 250 J=histeq(im) 2000 1500 imhist(j) 1000 500 0 0 50 100 150 200 250
Contrast stretching J = imadjust(im) >> J = imadjust(im); l'1% dei dati è saturato alle basse ed alte intensità. >> J = imadjust(im,[low_in; high_in],[low_out; high_out],gamma); [low_in; high_in]: range dei livelli di grigio dell immagine in ingresso [low_out; high_out]: range dei livelli di grigio immagine di uscita. Valori di default: sono [0 1]. gamma descrive la curva di saturazione. Default: gamma = 1
Contrast stretching Per le immagini a colori, low_in e high_in sono vettori di tre elementi: >> J = imadjust (im, [0.2 0.3 0; 0.6 0.7 1], []);
Filtraggio Image Processing Toolbox Elaborazioni locali: coinvolge i vicini di un pixel. Vengono utilizzati i filtri spaziali o le maschere di convoluzione. Maschera lineare: R è il valore calcolato rispetto al pixel centrale z5. Coinvolge gli otto vicini rispetto ai parametri di maschera w1,w9. R w z w z 1 1 2 2... z 1 z 2 z 3 z 4 z 5 z 6 z 7 z 8 z 9 w 9 z 9 9 i 1 w i z i maschera w 1 w 2 w 3 w 4 w 5 w 6 Esempio di maschere non lineare: w 7 w 8 w 9 R1=max{zk k=1,2,.,9} R2=min{zk k=1,2,.,9}
Creare filtri lineari: fspecial: h = fspecial (tipo, parametri); 'average': filtro medio; 'disk': filtro medio circolare; 'gaussian': filtro passa-basso gaussiano; 'laplacian': approssimazione dell'operatore Laplaciano; 'log': Laplaciano del filtro gaussiano; 'motion': approsimazione di un movimento della fotocamera; 'prewitt': Prewitt horizontal edge-emphasizing filter 'sobel': Sobel horizontal edge-emphasizing filter 'unsharp': filtro per l'enhancement del contrasto.
Dopo avere creato una maschera di filtraggio spaziale con la funzione fspecial si filtra l immagine con questa maschera, utilizando la funzione imfilter: >> h = fspecial( tipo ); >> out = imfilter(im,h); im >> h=fspecial('average',[5 5]) h = 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 0.0400 out >> out=imfilter(im,h);
Filtro Gaussiano Image Processing Toolbox h = fspecial('gaussian',hsize,sigma) returns a rotationally symmetric Gaussian lowpass filter of size HSIZE with standard deviation SIGMA (positive). HSIZE can be a vector specifying the number of rows and columns in H or a scalar, in which case H is a square matrix. The default HSIZE is [3 3], the default SIGMA is 0.5. N=2*fix(2.5*sigma)+1 2*fix(2.5*0.5)+1 2*fix(1.25)+1=3 H = 0.0113 0.0838 0.0113 0.0838 0.6193 0.0838 0.0113 0.0838 0.0113 sum(h(:))=1
>> h1= fspecial('gaussian,[5 5],1); >> out1=imfilter(im,h1); >> h2 = fspecial('gaussian', [15 15], 3); >> out2=imfilter(im,h2); out1 im out2
Sharpening: Image Processing Toolbox >> f=fspecial('unsharp') f = -0.1667-0.6667-0.1667-0.6667 4.3333-0.6667-0.1667-0.6667-0.1667 0.5 1 1.5 2 2.5 4 3.5 3 2.5 2 1.5 1 >> imagesc(f); >> colorbar; >> out=imfilter(im,f); im 3 3.5 0.5 1 1.5 2 2.5 3 3.5 out 0.5 0-0.5
>> f=fspecial('laplacian') f = 0.1667 0.6667 0.1667 0.6667-3.3333 0.6667 0.1667 0.6667 0.1667 >> out=imfilter(im,f); >> figure, imshow(out) im out
Filtri speciali: Edge >> out=edge(rgb2gray(im),'sobel'); Canny Laplacian of Gaussian
Filtri non lineari: Image Processing Toolbox medfilt2 Filtro mediano ordfilt2 Filtro ad ordinamento statistico ordfilt2(im,5,ones(3,3)) Filtro mediano (su 3x3) ordfilt2(im,1,ones(3,3)) Filtro di minimo (su 3x3) ordfilt2(im,9,ones(3,3)) Filtro di massimo (su 3x3) Il filtro mediano per ciascuna finestra di dimensione nxn dell immagine, ordina i pixel in essa contenuti e ne seleziona il valore mediano, che viene sostituito alla posizione corrente.
im mediano differenza
ordfilt2(im,9,ones(3,3)) im max ordfilt2(im,1,ones(3,3)) min
Esercizio 4 Creare una funzione showhist che data una immagine a livelli di grigio, la visualizza in un finestra con il suo istogramma. imshow, subplot, imhist, bar/plot Introduzione a MATLAB - Image Processing Toolbox 39
Esercizio 5 Caricate l immagine aerial.jpg, trasformatela a livelli di grigio e visualizzatene l istogramma con la funzione creata showhist.m Osservate e commentate l istogramma Modificate il contrasto dell immagine usando la funzione imadjust. Questa funzione rimappa linearmente il range di valori dell immagine in un nuovo range Guardando l istogramma dell immagine originale scegliete opportunamente gli intervalli di valori da rimappare per incrementare i dettagli osservabili. Introduzione a MATLAB - Image Processing Toolbox 40
Esercizio 6 Modificate il contrasto dell immagine usando la funzione histeq di MATLAB. Questa funzione rimappa i valori dell immagine tramite equalizzazione dell istogramma Visualizzate l istogramma dell immagine equalizzata Osservate e commentate l istogramma Confrontate tra loro gli istogrammi delle due immagine modificate Introduzione a MATLAB - Image Processing Toolbox 41
Esercizio 7 Modificate il contrasto dell immagine usando il metodo della gamma correction Ricordate che l immagine deve avere valori compresi tra 0 e 1. Determinate un valore opportuno di e correggete l immagine Visualizzate l istogramma dell immagine corretta Osservate e commentate l istogramma Confrontate tra loro gli istogrammi delle tre immagine modificate Introduzione a MATLAB - Image Processing Toolbox 42
Esercizio 8 Recuperate i comandi dell esercizio precedente e metteteli in un file di script. Eseguite l esercizio precedente per le seguenti immagini: pyramids.jpg, isola.jpg mercpulci.jpg Quale delle 3 metodologie di correzione del contrasto funziona meglio per ciascune delle tre immagini? Perche? Introduzione a MATLAB - Image Processing Toolbox 43
Esercizio 9 Aiutandovi con l help, create dei filtri spaziali con fspecial Testate l effetto di alcuni dei filtri creati caricando delle immagini a scelta Quale filtro è più indicato per elaborare le seguenti immagini? - Castle.gif - Castle2.gif - Casaneve.jpg Introduzione a MATLAB - Image Processing Toolbox 44
Esercizio 10 Un esempio di filtro non lineare è il filtro mediano medfilt2 Testate il filtro mediano sulle seguenti due immagini: Tree1.tif Tree2.tif In quale delle due immagini il filtro funziona meglio? Provate ad aplicare più volte un filtro mediano 3x3. Che considerazioni potete fare sul risultato?
Esercizio 11 Usare la funzione edge che applica diverse metodologie per creare un immagine binaria degli edge (vedere help) 1. Sobel 2. Prewitt 3. Roberts 4. Log 5. Canny Testate alcune metodologie sull immagine rat.jpg confrontando i resultati