% COMPRESSIONE DI IMMAGINI CON LA DCT-2 % comando dct2 (dove il 2 ? riferito al n. di dimensioni - immagine - e non al tipo di DCT, che ? comunque una DCT-2) % Il programma è strutturato in 2 parti: % nella prima parte si trasforma-comprime-antitrasforma una intera immagine % nella seconda parte si lavora per blocchi, con il comando "blkproc" clear all; % PARTE I % IMMAGINE A COLORI INDICIZZATA % load trees; % carica l'immagine nella matrice "X" e la mappa colore in "map" % im1= ind2gray(X,map); % converte in scala di grigi % OPPURE % IMMAGINE IN SCALA DI GRIGI % lettura immagine (pout.tif ? di libreria Matlab) % im1Gray= imread('pout.tif'); % im1 ? una matrice (immagine B/N) % im1= double(im1Gray); % converte in numeri "double precision" anziché a 8 bit % vedere 'help imread' x formati immagine supportati e sintassi x immagini a colori % OPPURE % IMMAGINE RGB im1RGB = imread('autumn.tif'); % immagine RGB, convertita in SCALA DI GRIGI im1Gray = rgb2gray(im1RGB); im1= double(im1Gray); % converte in numeri "double precision" anziché a 8 bit % display dell'immagine figure(1); clf; imshow(im1,[]); % con [] scala i livelli di grigio ai valori min e max della matrice immagine % calcolo e visualizzazione della DCT, in scala log, con intensit? di colori im1dct = dct2(im1); figure(2); clf; imshow(log10(abs(im1dct)),[]); title('Energia concentrata nei coefficienti di ordine basso'); colormap(jet(64)); colorbar; % azzeriamo i valori della DCT, mostrando i coefficienti im1dctT= im1dct; lim= 10; % limite per giudicare un coefficiente trascurabile IndCoeffPiccoli= find(abs(im1dct) < lim); % trova gli indici dei coefficienti DCT compresi in [-lim lim] im1dctT(IndCoeffPiccoli) = 0; % e li pone a zero NumCoeffTroncati= sum(sum( im1dctT==0 )); [h,w]= size(im1); % dimensioni immagine sprintf('Sono stati azzerati %d coefficienti su %d , pari al %2.0f %%',NumCoeffTroncati,h*w,100*NumCoeffTroncati/(h*w)) figure(3); clf; imshow(log10(abs(im1dctT)),[]); title('Coefficienti piccoli annullati'); colormap(jet(64)); colorbar; % DCT inversa im1rico = idct2(im1dctT); figure(4); clf; imshow(im1rico,[]); % Attenzione: se qui si usa "imshow(im1rico);", allora bisogna % dividere i valori di im1rico per un valore tale da compensare l'energia % persa nell'azzeramento dei coefficienti della DCT % PARTE II % Metodo usato in "dctdemo": elaborazione per blocchi % lettura e visualizzazione im2Gray = imread('cameraman.tif'); im2= double(im2Gray); % converte in numeri "double precision" anziché a 8 bit figure(100); clf; imshow(im2,[]); % trasformata DCT-2 per blocchi dimblk= 16; % dimensione dei blocchi fun = @dct2; % "function handle" im2dct = blkproc(im2,[dimblk dimblk],fun); % l'ultimo è un "parametro funzione" figure(101); clf; imshow(log10(abs(im2dct)),[]); title('Coefficienti DCT-2 per blocchi'); colormap(jet(64)); colorbar; % azzeriamo i valori trascurabili della DCT, mostrando i coefficienti in una figura im2dctT= im2dct; lim2= 10; % limite per giudicare un coefficiente trascurabile IndCoeffPiccoli2= find(abs(im2dct) < lim2); % trova gli indici dei coefficienti DCT compresi in [-lim lim] im2dctT(IndCoeffPiccoli2) = 0; % e li pone a zero NumCoeffTroncati2= sum(sum( im2dctT==0 )); [h2,w2]= size(im2); % dimensioni immagine sprintf('Sono stati azzerati %d coefficienti su %d , pari al %2.0f %%',NumCoeffTroncati2,h2*w2,100*NumCoeffTroncati2/(h2*w2)) figure(102); clf; imshow(log10(abs(im2dctT)),[]); title('Coefficienti piccoli annullati'); colormap(jet(64)); colorbar; ifun= @idct2; % "function handle" im2rico = blkproc(im2dctT,[dimblk dimblk],ifun); % l'ultimo è un "parametro funzione" figure(103); clf; imshow(im2rico,[]);