Teoria delle ondicelle 2/ Compressione di segnali e immagini a.a. 2006/2007 JPEG.

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

I tipi Strutturati.
INFORMATICA Altre Istruzioni di I/O
Metodi numerici in Matlab
Elaborazione numerica del suono
CODIFICA DELLE INFORMAZIONI
Tecniche di compressione dei dati
MATLAB.
MATLAB.
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Dipartimento di Matematica
3 a lezione - laboratorio a.a Corso di Laurea Ingegneria MECCANICA.
PROGETTINI DI FINE CORSO
Esercitazione MATLAB (13/5)
Linguaggio MATLAB: costrutti tipici (IF,WHILE…)
Codifica dell’ Informazione non numerica
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab m-file m-file script script Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali.
MATLAB.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali Indipendenza lineare,
MATLAB.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali Esercizi vari Esercizi.
Metodi iterativi G. Puppo.
Metodi iterativi semplici G. Puppo. Riassunto Problema del fill-in Memorizzazione di matrici sparse Metodo di Jacobi.
Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo.
Metodi TVD ad alta risoluzione
Metodi FEM in 2D G. Puppo.
Metodi numerici per equazioni lineari iperboliche Gabriella Puppo.
Metodi conservativi per equazioni iperboliche
Uso dei cicli y t =c+ty t-1 +e Un uso dei cicli può essere quello di creare una serie storica per cui y t =c+ty t-1 +e dove poniamo c e t scalari ed e~N(0,1).
Trimr Gauss, tra le altre, fornisce una preziosissima funzione che risulta di estrema utilità nell’ambito matriciale. Questa funzione, chiamata trimr(x,t,b),
Creazione di matrici Delimititatore di riga Delimititatore di matrice
Introduzione all’algebra lineare
1 Implementazione di Linguaggi 2 Implementazione di Linguaggi 2 Federico Bernardi Type checking 2° parte Type checking 2° parte - Equivalenza di type expressions.
Marco Panella MATLAB Marco Panella
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
Algebra matriciale e linguaggio matriciale in MATLAB
Strutture di controllo in C -- Flow Chart --
Esercizi di riepilogo sul linguaggio C: file, puntatori, liste
Esercitazione 2 – Generazione di variabili Matlab.
Proposte di tesina Mario Toma.
Image Compression Gaussian Noise 14/04/2010 Francesca Pizzorni Ferraese.
INTRODUZIONE A MATLAB.
Biologia Computazionale - Algoritmi
MATRICI classe 3 A inf (a.s ).
Strutture periodiche discrete: introduzione del vincolo di periodicità e studio della ricostruzione da due proiezioni. A. Del Lungo, A. Frosini, M.Nivat,
Passo 3: calcolo del costo minimo
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 8 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Strutture di controllo Marco D. Santambrogio – Ver. aggiornata al 16 Dicembre 2013.
ESERCIZI.
Codifica dei dati in un elaboratore elettronico
DIGITALIAZZAZIONE Di Alessio.
- prof. V. Riboldi - SOTTOPROGRAMMI IN TPASCAL METODO TOP DOWN.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 7 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
1 Informatica Generale Alessandra Di Pierro Ricevimento: Giovedì ore presso Dipartimento di Informatica, Via Buonarroti,
Operatori di incremento e decremento
INTRODUZIONE A MATLAB LEZIONE 2 Sara Poltronieri.
Codici prefissi Un codice prefisso è un codice in cui nessuna parola codice è prefisso (parte iniziale) di un’altra Ogni codice a lunghezza fissa è ovviamente.
Copyright © Istituto Italiano Edizioni Atlas
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 6 – Info B Marco D. Santambrogio – Matteo Ferroni –
Sistemi di equazioni lineari. Sistemi di primo grado di due equazioni a due incognite Risolvere un sistema significa trovare la coppia di valori x e y.
SOMMARIO La Digitalizzazione La Compressione LA DIGITALIZZAZIONE La digitalizzazione consiste nella trasformazione di un oggetto in una sequenza di numeri,
Di Matteo Arenga Manuela Bonaccorso Giulia Diprossimo.
Tabelle Pivot Foglio elettronico. Introduzione Creazione di una tabella Pivot Vediamo come si deve operare per ottenere dalla nostra tabella un report.
Cenni di Crittografia Luigi Vetrano TechnoLabs S.p.A. L’Aquila, Aprile 2011.
INTRODUZIONE A MATLAB Corso di Segnali e Sistemi a.a. 2010/2011.
Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi Complessità e Trasportabilità Lezione n°3.
Parte 5 Sommario Uso routine di calcolo predefinite di Matlab –Risoluzione equazioni non lineariRisoluzione equazioni non lineari –Ricerca minimo di una.
La Matematica del web: compressione di immagini Nancy Castro Claudia Mungo Edoardo Decaro.
Prof. Cerulli – Dott. Carrabs
Transcript della presentazione:

Teoria delle ondicelle 2/ Compressione di segnali e immagini a.a. 2006/2007 JPEG

function y = im2jpeg(x,quality) % y = im2jpeg(x,quality) comprime una immagine x usando lo schema % di JPEG: dct 8x8, quantizzazione, codifica di Huffman. % quality è uno scalare con il quale si modifica la tabella di % quantizzazione rispetto alla qualità con cui si vuole codificare % y è una variabile di tipo struct con i seguenti campi % y.size = dimensione di x % y.numblocks = numero di blocchi 8*8 % y.quality = fattore di qualità (in percentuale) % y.huffman = output della funzione mat2huff error(nargchk(1,2,nargin)); % controllo delle variabili di input if ndims(x)~= 2 | ~isreal(x) | ~isnumeric(x) | ~isa(x,'uint8') error('la variabile di input deve essere una immagine uint8 ') end if nargin < 2, quality = 1;, end

% tabella di quantizzazione m = [ ; ; ; ; ; ; ; ] * quality; % tabella per l'ordinamento a zig zag order = [ ];

[xm,xn] = size(x); % determina la dimensione della immagine di input x = double(x) - 128; % sottrae 128 ai valori della immagine di input t = dctmtx(8); % determina la matrice 8x8 per il calcolo della DCT y = blkproc(x,[8 8],'P1*x*P2',t,t'); % calcolo della DCT di x su blocchi % Bi di dimensione 8x8 usando la % seguente formula t*Bi*t' y = blkproc(y,[8 8],'round(x./P1)',m); % quantizza i coefficienti della % DCT di ogni blocco secondo % la tabella m y = im2col(y,[8 8],'distinct'); % trasforma ogni blocco 8x8 in un vettore % colonna, y è ora una matrice di % dimensione 64*numero_di_blocchi xb = size(y,2); % calcola il numero dei blocchi y = y(order,:); % ordina gli elementi di ogni blocco secondo % lo schema a zig zag in order

eob = max(x(:)) + 1; % definisce il simbolo di fine blocco r = zeros(numel(y)+size(y,2),1); count = 0; for j = 1:xb % per ogni blocco: i = max(find(y(:,j))); % trova l'ultimo elemento diverso da zero if isempty(i) i = 0; end p = count + 1; % tronca la sequenza eliminando gli zeri e % la aggiunge al vettore di output insieme q = p + i; % al simbolo di fine blocco r(p:q) = [y(1:i,j);eob]; count = count + i + 1; end r(count+1:end) = []; % elimina gli elementi di r non usati

% definisce la variabile di output y.size = uint16([xm xn]); y.numblocks = uint16(xb); y.quality = uint16(quality*100); y.huffman = mat2huff(r);

function x = jpeg2im(y) % x = jpeg2im(y) decodifica un' immagine codificata con la funzione % im2jpeg.m % % y è una variabile di tipo struct generata dalla funzione im2jpeg % x è una matrice corrispondente alla approssimazione della immagine % codificata in y error(nargchk(1,1,nargin)); % controllo della variabile di input

% tabella di quantizzazione m = [ ; ; ; ; ; ; ; ]; % tabella per l'ordinamento a zig zag order = [ ];

rev = order; % calcola l'ordinamento inverso % (da zig zag a lessicografico) for k = 1:length(order) rev(k) = find(order == k); end m = double(y.quality)/ 100 * m; % ricostruisce la tabella di % quantizzazione rispetto alla qualità % con cui si è effettuata la codifica xb = double(y.numblocks); % legge il numero di blocchi sz = double(y.size); % legge la dimensione della immagine da % decodificare xn = sz(2); % numero di colonne xm = sz(1); % numero di righe x = huff2mat1(y.huffman); % decodifica con l'algoritmo di Huffman eob = max(x(:)); % estrae il simbolo di fine blocco

z = zeros(64,xb); % definisce una matrice di zeri in cui ogni colonna % ha la dimensione di un blocco 8x8 stirato k = 1; % legge il vettore x e conserva gli elementi diversi % da zero in ogni colonna di z. for j = 1:xb % Ogni volta che trova un eob cambia blocco, % ovvero colonna di z for i = 1:64 if x(k) == eob k = k + 1; break; else z(i,j) = x(k); k = k + 1; end

z = z(rev,:); % ordina gli elementi di ogni colonna di z % secondo l'ordinamento lessicografico di % una matrice 8x8 x = col2im(z,[8 8],[xm xn],'distinct'); % genera una matrice di % dimensione xm*xn come % composizione di blocchi di % dimensione 8x8 i cui % elementi corrispondono ad % una colonna di z x = blkproc(x,[8 8],'x.*P1',m); % operazione inversa della % quantizzazione t = dctmtx(8); % determina la matrice 8x8 per % il calcolo della DCT x = blkproc(x,[8 8],'P1*x*P2',t',t); % per ogni blocco calcola la dct % inversa con l'operazione t'*Bi*t x = uint8(x + 128); % aggiunge 128 e trasforma in una % variabile uint8

% esempio di codifica e decodifica di una immagine usando le funzione % im2jpeg e jpeg2im I = zeros(16)+2; % immagine da codificare I(5:12,4:13) = 200; I = uint8(I); C1 = im2jpeg_ese(I); % codifica con im2jpeg Id = jpeg2im(C1); % decodifica con jpeg2im CR = imratio(I,C1); % calcola il rapporto di compressione disp('RAPPORTO DI COMPRESSIONE'), disp(CR), pause bpp = 8/CR % calcola il bpp % calcola il PSNR psnr = 10*log10(255^2/(mean2(abs(double(I)-double(Id)).^2))) figure, imshow(I,[]), title('immagine originale') figure, imshow(Id,[]), title('immagine decodificata')

function CR = imratio(I1,I2) % calcolo del rapporto di compressione CR = bytes(I1)/bytes(I2); % function b = bytes(I) % legge il numero di bytes della variabile b. Se b è di tipo struct, legge % i bytes occupati da ogni campo if ischar(I) % caso in cui I è il nome di un file info = dir(I);, b = info.bytes; elseif isstruct(I) % se I è una variabile di tipo struct, richiama ricorsivamente se stessa b = 0;, fields = fieldnames(I); for k = 1:length(fields) b = b + bytes(getfield(I,char(fields(k)))); end else % I non è una variabile di tipo struct info = whos('I');, b = info.bytes; end

% esempio di codifica e decodifica di una immagine usando le funzione % im2jpeg e jpeg2im I = imread('cameraman.tif'); % legge l'immagine da codificare C1 = im2jpeg(I); % codifica con im2jpeg Id = jpeg2im(C1); % decodifica con jpeg2im CR = imratio(I,C1); % calcola il rapporto di compressione disp('RAPPORTO DI COMPRESSIONE') disp(CR), pause bpp = 8/CR % calcola il bpp % calcola il PSNR psnr = 10*log10(255^2/(mean2(abs(double(I)-double(Id)).^2))) figure, imshow(I,[]), title('immagine originale') figure, imshow(Id,[]), title('immagine decodificata')

function [bpp,psnr] = curvaRDjpeg(nameim) % disegna la curva Rate Distortion per l'immagine nameim I = imread(nameim); % legge l'immagine da codificare for q = 1:15 C1 = im2jpeg(I,q); % codifica con im2jpeg Id = jpeg2im(C1); % decodifica con jpeg2im CR(q) = imratio(I,C1); % calcola il rapporto di compressione disp('qualita'), disp(q) disp('RAPPORTO DI COMPRESSIONE'), disp(CR(q)) bpp(q) = 8/CR(q) % calcola il bpp psnr(q) = 10*log10(255^2/(mean2(abs(double(I)-double(Id)).^2))) %PSNR pause figure, imshow(I,[]), title('immagine originale') figure, imshow(Id,[]), title(['immagine decodificata, qualita ',num2str(q)]) pause end figure, plot(bpp,psnr), title('Curva RD')