Interpolazione di immagini Data un immagine in formato png (o jpeg o altro) di m n pixel, la si vuole portare ad una dimensione maggiore (ad esempio 2m 2n pixel). c Paola Gervasio - Calcolo Scientifico - 2014/15 1
Formato RGB di memorizzazione di una immagine Una immagine di m n pixel è memorizzata in un array a 3 indici A=(n,m,3) o equivalentemente in 3 matrici R, G, B di dimensione (n,m). R=red; G=green; B=blue. m= numero pixel lungo la x = numero di colonne di A n= numero pixel lungo la y = numero di righe di A I valori numerici assunti dagli elementi di queste matrici sono numeri interi in [0,255]. La combinazione dell intensità dei tre colori base nella posizione (i,j) delle tre matrici fornisce il colore finale del pixel (i,j). Per leggere un immagine.png da disco: A=imread ( nomefile, formato ) A=imread( scia, png ); c Paola Gervasio - Calcolo Scientifico - 2014/15 2
Per visualizzare l immagine in una finestra grafica: image(a) Per vedere l occupazione di memoria: >> whos Name Size Bytes Class A 141x181x3 76563 uint8 Quindi n=141 e m=181. Gli elementi di A sono numeri interi che occupano 1Byte (invece degli 8 Byte dei numeri floating point). Una volta salvata l immagine in A, conviene salvare in due variabili il numero n di pixel lungo la direzione y ed il numero m di pixel lungo la direzione x e scomporre A in 3 matrici distinte con i 3 colori. [n,m,dim]=size(a); R=A(:,:,1); G=A(:,:,2); B=A(:,:,3); c Paola Gervasio - Calcolo Scientifico - 2014/15 3
A questo punto stabiliamo un fattore di ingrandimento (per esempio fattore=2;) ed ingrandiamo l immagine con la ricostruzione dei pixel intermedi: 1. con semplice moltiplicazione dei pixel, 2. con una interpolazione bilineare composita, 3. con spline cubiche. c Paola Gervasio - Calcolo Scientifico - 2014/15 4
1. Duplicazione dei pixel a=b=e=f=a; c=d=g=h=b; i=l=o=p=c; m=n=q=r=d; Per realizzare la duplicazione delle informazioni in modo semplice, basta sfruttare il prodotto di Kronecker fra matrici, implementato nel comando kron di Matlab. M=ones(2,2); % la dimensione di M e pari % al numero di ripetizioni per ogni pixel R1=kron(double(R),M); G1=kron(double(G),M); B1=kron(double(B),M) N.B. Il comando kron lavora solo su dati di tipo double, allora bisogna convertire R, G, B da uint8 a double. c Paola Gervasio - Calcolo Scientifico - 2014/15 5
Ora dobbiamo ricostruire l immagine completa, assemblando R1, G1, B1 [n1,m1]=size(r1); A1=uint8(zeros(n1,m1,3)); A1(:,:,1)=uint8(R1); A1(:,:,2)=uint8(G1); A1(:,:,3)=uint8(B1); figure(2); image(a1) e salvare l immagine su disco: imwrite(a1, scia1.png, png ) c Paola Gervasio - Calcolo Scientifico - 2014/15 6
Ingrandimento con duplicazione dei pixel. c Paola Gervasio - Calcolo Scientifico - 2014/15 7
2. Interpolazione bi-lineare Poniamo a=a, c=b, b=ricostruzione del colore a partire dai colori A e B, ad esempio: a=a; b=(a+b)/2; c=b; d=(a+c)/2; e=(a+b)/2+(c+d)/2; f=(b+d)/2;... Questa è interpolazione bilineare composita in 2D realizzabile con la function interp2 di MATLAB. c Paola Gervasio - Calcolo Scientifico - 2014/15 8
interp2 di Matlab La forma più generica per richiamare interp2 è: z1=interp2(x,y,z,x1,y1); per interpolazione bi-lineare composita z1=interp2(x,y,z,x1,y1, spline ); per le spline, - x e y, ascisse e ordinate corrispondenti alle quote z, - z è la matrice dei dati da interpolare. Nel nostro caso x=(1:m), y=(1:n), con m=numero di pixel in orizzontale e n= numero di pixel in verticale. - x1, y1 sono vettori riga contenenti i nuovi punti (risp. lungo le direzioni x e y) in cui si vuole valutare l interpolato, z1 è la nuova matrice, contenente i valori del polinomio interpolatore composito (o spline) nei punti di coordinate (x1,y1). c Paola Gervasio - Calcolo Scientifico - 2014/15 9
N.B. interp2 lavora solo su dati double. Bisogna fare una conversione da uint8 a double e poi i risultato deve essere riconvertito in uint8 per disegnare l immagine. 1. Costruire i vettori x1 e y1, che rappresentano le coordinate dei pixel nella nuova figura, h=1/2; x1=(1:h:m); y1=(1:h:n) ; è come se si introducessero dei pixel tra quelli esistenti. 2. interpolare facendo tutti i cambi di dati opportuni: z=double(r); R1=uint8(interp2(x,y,z,x1,y1)); z=double(g); G1=uint8(interp2(x,y,z,x1,y1)); z=double(b); B1=uint8(interp2(x,y,z,x1,y1)); A questo punto: ricostruire l immagine, disegnarla e salvarla su disco. [n2,m2]=size(r2); A2=uint8(zeros(n2,m2,3));... c Paola Gervasio - Calcolo Scientifico - 2014/15 10
Ingrandimento con interpolazione bi-lineare a tratti. c Paola Gervasio - Calcolo Scientifico - 2014/15 11
3. Interpolazione con spline cubiche in 2D Per costruire un interpolazione con spline, si procede come con l interpolazione bi-lineare composita sostituendo le chiamate ad interp2 con: R1=uint8(interp2(x,y,double(R),x1,y1, spline )); G1=uint8(interp2(x,y,double(G),x1,y1, spline )); B1=uint8(interp2(x,y,double(B),x1,y1, spline )); c Paola Gervasio - Calcolo Scientifico - 2014/15 12
Ingrandimento con interpolazione spline in 2D. c Paola Gervasio - Calcolo Scientifico - 2014/15 13
duplicazione bilineare spline c Paola Gervasio - Calcolo Scientifico - 2014/15 14
Ingrandimento con interpolazione duplicazione dei pixel. c Paola Gervasio - Calcolo Scientifico - 2014/15 15
Ingrandimento con interpolazione bi-lineare a tratti. c Paola Gervasio - Calcolo Scientifico - 2014/15 16
Ingrandimento con interpolazione spline in 2D. c Paola Gervasio - Calcolo Scientifico - 2014/15 17