partire dai dati codificati e compressi, si può riavere l’originale senza alcun errore. Di
conseguenza queste tecniche sono anche chiamate reversibili.
Invece, una tecnica di compressione è lossy o irreversibile se i dati originali
non possono essere recuperati dai dati compressi, con una completa accuratezza pixel
per pixel nel caso delle immagini. Un metodo di compressione dati lossy è un
metodo di compressione dei dati che comporta perdita di qualità. Decomprimendo un
file compresso con un metodo lossy la copia ottenuta sarà peggiore dell'originale, in
relazione sia all’algoritmo scelto che al rapporto di compressione utilizzato. Ciò è
possibile poiché i metodi di compressione con perdita di qualità in genere tendono a
scartare le informazioni inutili, archiviando solo quelle essenziali. La compressione
dei dati con perdita di qualità è ampiamente usata in molti settori dell'informatica: su
Internet, nell'ambito dello streaming dei media, nella telefonia, per la compressione
di immagini o altri oggetti multimediali, ecc.
Nel caso delle immagini, il sistema visivo umano può tollerare differenze
numeriche significative o errori, nel senso che l’immagine degradata recuperata da
un’immagine compressa è percepita come essenzialmente uguale a quella originale.
Dal punto di vista delle immagini biomediche, se l’errore numerico presente
nell’immagine recuperata non causa variazioni nell’analisi diagnostica effettuata
sull’immagine degradata, possiamo avere una compressione numerica lossy alta pur
rimanendo “diagnosticamente lossless”.
Gli algoritmi di compressione con perdita, introducono nell’immagine
fastidiosi fenomeni chiamati artefatti. Un artefatto di compressione è il risultato di
uno schema di compressione dati aggressivo applicato ad una immagine, ad un file
audio, o video che rimuove alcuni dati meno importanti dal contenuto complessivo
ma che tuttavia risulta visibile e sgradevole all'utente. Tecnicamente parlando, un
artefatto di compressione è una classe particolare di errori sui dati che spesso è la
conseguenza della quantizzazione nella compressione dati con perdite.
L’artefatto più comune che si può riscontrare nelle immagini sottoposte a
compressione e successiva decompressione è il cosiddetto ‘blocking artifact’, cioè
artefatto da blocchettatura. La maggior parte degli algoritmi di compressione di tipo
adattativo e locale applica la codifica su sottoimmagini, cioè blocchi formati da un
ristretto numero di pixel. Uno degli inconvenienti di queste tecniche è che, quando
l’immagine viene decodificata, le discontinuità sui confini dei blocchi restano visibili
e creano proprio il fastidioso effetto della blocchettatura.
2
L’obiettivo è proprio quello di ridurre gli artefatti in modo da ottenere
un’immagine migliore e, nei limiti del possibile, simile a quella originale.
A tal fine esistono varie tecniche di filtraggio, di tipo lineare e non lineare. In
generale non esiste una tecnica migliore in assoluto rispetto alle altre, ma ogni
algoritmo di filtraggio si presta a fornire risultati accettabili o meno a seconda
soprattutto del tipo di immagine e del tipo di artefatto di cui è affetta.
Esamineremo, e applicheremo poi nelle nostre simulazioni, in particolare,
delle tecniche di filtraggio delle immagini che appartengono all’elaborazione
morfologica delle immagini. Si tratta di tecniche non lineari che, come la parola
stessa suggerisce, si basano sulla forma (morfologia) degli oggetti contenuti
nell’immagine.
In questa tesi parleremo nel prossimo capitolo dei più comuni algoritmi di
compressione dati, applicati in particolare alle immagini; nel capitolo 3 esamineremo
diversi tipi di tecniche di ricostruzione e filtraggio delle immagini degradate da
artefatti, sia di tipo lineare che non lineare; il capitolo 4 è poi dedicato a tecniche
particolari di filtraggio basate sull’elaborazione morfologica delle immagini; infine,
nell’ultimo capitolo verranno illustrati i risultati di simulazioni effettuate
all’elaboratore su quattro tipi di immagini biomediche, che sono state prima
compresse a vari rapporti di compressione, causando la comparsa degli artefatti, e
poi osserveremo gli effetti del filtraggio attraverso i quattro operatori morfologici su
queste immagini degradate.
3
2. Compressione delle immagini
biomediche
2.1 Generalità
Le immagini biomediche richiedono un’alta risoluzione e una quantizzazione
fine dei livelli di grigio. Per esempio una mammografia digitale è tipicamente
rappresentata in matrici di 4096x4096 pixels con 12b/pixel, così da avere
un’immagine da 32Mb.
Pazienti con complicazioni multiple hanno bisogno di varie investigazioni ed
esami così da creare, per ogni paziente, una collezione di diversi files di immagini.
Molte giurisdizioni sanitarie richiedono che i dati di ogni paziente, incluse le
immagini degli esami a cui è stato sottoposto, siano conservati in archivio per vari
anni. Per i bambini finché non diventano adulti.
Per migliorare l’archiviazione e l’accesso alle immagini di ogni paziente,
molti centri hanno adottato le tecniche digitali rispetto alle immagini impresse su
film (pellicola).
I maggiori vantaggi e svantaggi tra sistemi di archivio digitali e quelli basati
su film sono:
- i film si deteriorano nel tempo;
- i film possono essere smarriti nonostante gli indici di archiviazione esistenti;
- alle immagini digitali possono accedere diversi utenti contemporaneamente. Per i
film bisogna creare diverse copie che però poi creano problemi di archiviazione;
- immagini digitali possono essere viste e manipolate in vari posti attraverso un PC;
- i sistemi digitali richiedono un alto costo di investimento iniziale e di manutenzione
periodica, mentre i film richiedono un costo continuo e costante;
- i problemi di impatto ambientale dei film, legati anche ai problemi connessi al loro
smaltimento, non si hanno nel digitale;
4
- le immagini digitali possono essere compresse attraverso tecniche di codifica delle
stesse e di compressione dati, così da occupare minore spazio di archiviazione.
La compressione delle immagini è possibile grazie alle seguenti caratteristiche di
base:
- ridondanza del codice: tutte le parole di codice (i valori dei pixels) non
occorrono con la stessa probabilità;
- ridondanza spaziale: i valori dei pixels confinanti tendono a giacere dentro un
ristretto range dinamico, ed esibiscono un alto livello di correlazione;
- ridondanza psico-visiva: l’analisi umana può riconoscere le componenti e la
natura essenziale dell’immagine anche se proveniente da diverse riduzioni, e
non presta attenzione ai precisi valori numerici dei pixels.
In generale le tecniche di compressione possono essere suddivise in due
categorie: “Lossy” e “Lossless”. La compressione dati lossless è quella classe di
algoritmi di compressione che non comportano perdite di dati, che consentono quindi
di recuperare tutta l'informazione e ricostruire esattamente i dati originali partendo
dai dati compressi. Un esempio di questo tipo di compressione è dato dai formati zip,
gzip, bzip2, rar, 7z. I file per cui non è accettabile una perdita di informazione, come
i testi o i programmi, utilizzano questo metodo. Per le immagini fotografiche
generalmente non si usano algoritmi lossless in quanto sarebbero veramente poco
efficienti, ma per le immagini che contengono schemi o disegni realizzati al PC
spesso la compressione lossless non solo è applicabile, ma anche conveniente (GIF,
PNG, MNG, TIFF). In questo caso, a partire dall’immagine codificata e compressa,
si può riavere l’immagine originale senza alcun errore. Di conseguenza queste
tecniche sono anche chiamate reversibili.
Una tecnica di compressione è lossy o irreversibile se i dati originali non possono
essere recuperati dai dati compressi con una completa accuratezza pixel per pixel. Un
metodo di compressione dati lossy è un metodo di compressione dei dati che
comporta perdita di qualità. Decomprimendo un file compresso con un metodo
"lossy" la copia ottenuta sarà peggiore dell'originale, ma in genere abbastanza simile
da non comportare sostanziale perdita di informazione. Ciò è possibile poiché i
metodi di compressione con perdita di qualità in genere tendono a scartare le
informazioni inutili, archiviando solo quelle essenziali: per esempio comprimendo un
5
brano audio secondo la codifica dell'MP3 non vengono memorizzati i suoni non
udibili, consentendo di ridurre le dimensioni dei file senza compromettere in modo
sostanziale la qualità dell'informazione. La compressione dei dati con perdita di
qualità è ampiamente usata in molti settori dell'informatica: su Internet, nell'ambito
dello streaming dei media, nella telefonia, per la compressione di immagini o altri
oggetti multimediali, ecc. Gli algoritmi di compressione in questi casi vengono
chiamati codec.
Nel caso delle immagini, il sistema visivo umano può tollerare differenze
numeriche significative o errori, nel senso che l’immagine degradata recuperata da
un’immagine compressa è percepita come essenzialmente uguale a quella originale.
Le tecniche di compressione dati possono essere modellate opportunamente per
avere la più alta rappresentazione compressa, con alti livelli di perdita di accuratezza
numerica, rimanendo però percettivamente lossless.
Dal punto di vista delle immagini biomediche, se l’errore numerico presente
nell’immagine recuperata non causa variazioni nell’analisi diagnostica effettuata
sull’immagine degradata, possiamo avere una compressione numerica lossy alta pur
rimanendo “diagnosticamente lossless”.
2.2 Tecniche di compressione
2.2.1 Codifica diretta della sorgente
Le sorgenti reali non generano valori casuali e incorrelati in modo equo. Si
può quindi creare un’efficiente codifica modellata sulle particolari proprietà della
sorgente.
Il codice è applicato direttamente sui valori dei pixel generati dalla sorgente,
senza sottoporli ad ulteriori algoritmi che creano altre serie di valori. Perciò tali
tecniche sono classificate come procedure a codifica diretta della sorgente.
Ne esistono diverse tecniche, ognuna con propri pregi, limiti e campi di
applicazione.
6
Huffman
La tecnica di codifica di Huffman sfrutta l’occorrenza di valori di pixel a più
alta probabilità rispetto ad altri. L’idea di base è quella di codificare con parole di
codice brevi i valori dei pixel a più alta probabilità di occorrenza, e con parole di
codice più lunghe i valori dei pixel a più bassa probabilità di occorrenza. Questo
comporta un codice con parole a lunghezza variabile. Naturalmente si deve evitare
che le parole più brevi siano il prefisso di una delle parole più lunghe; cioè bisogna
garantire l’unicità del codice.
Huffman progettò uno schema di codifica che rispondesse a tali condizioni e
che creasse un codice con una lunghezza media inferiore a quella del codice a
lunghezza fissa.
La seguente procedura viene seguita per assegnare una determinata parola di
codice ad ogni simbolo (livello di grigio):
- si prepara una tabella contenente i vari simboli (livelli di grigio)
dell’immagine sorgente, disposti in ordine decrescente di probabilità di
occorrenza;
- si considerano le ultime due probabilità e si sommano. Si riordinano i valori
in ordine decrescente e si ottiene una lista contenente un valore in meno di
probabilità;
- si ripete il procedimento finché rimangono due soli valori di probabilità;
- si assegnano le cifre di codice 0 e 1 ai due valori della colonna finale;
- andando indietro nelle colonne, si assegnano le cifre binarie 0 e 1 alle due
probabilità che abbiamo combinato in ogni colonna;
- alla fine ogni simbolo potrà vedersi assegnata la propria parola di codice che
sarà formata dal susseguirsi delle cifre binarie che si incontrano partendo
dall’ultima colonna e andando indietro sino a giungere al simbolo stesso.
Per esempio supponiamo di avere un’immagine formata da pixel che assumono
in totale 5 diversi livelli di grigio. Ognuno di questi livelli ha una diversa frequenza
di occorrenza nell’immagine.
7
L1=0,30 L2=0,30 L3=0,20 L4=0,15 L5=0,05
Step 1 Step 2 Step 3 Step 4
L1(0,30) L1(0,30) L3+L4+L5(0,40) 1 L1+L2(0,60) 0
L2(0,30) L2(0,30) L1(0,30) 00 L3+L4+L5(0,40) 1
L3(0,20) L4+L5(0,20) 10 L2(0,30) 01
L4(0,15) 100 L3(0,20) 11
L5(0,05) 101
I cinque livelli di grigio assumeranno la seguente codifica binaria:
L1= 00; L2= 01; L3= 11; L4= 100; L5= 101;
possiamo vedere appunto che i livelli che presentano una minore frequenza di
occorrenza hanno una codifica con più cifre binarie, al contrario dei livelli che invece
hanno maggiore frequenza.
Il metodo di Huffman è ottimale solo per le sorgenti di cui è nota la PDF
(funzione densità di probabilità), poiché un cambiamento nella PDF della sorgente
potrebbe richiedere la progettazione di un’altra codifica più adatta. Uno svantaggio
di tale metodo di codifica è che produce parole di codice sempre più lunghe al
crescere dei diversi simboli componenti l’immagine. Quindi non è molto adatto ad
immagini che presentano pixel con una grande varietà di livelli di grigio.
Infine, le performance di tale codifica sono limitate quando è applicata
direttamente sui simboli della sorgente, mentre si ha un significativo vantaggio
quando è applicato sui dati decorrelati.
Run-length coding
Nelle immagini con alti livelli di correlazione, ci si aspetta di trovare stringhe
di occorrenze dello stesso livello di grigio ripetuto consecutivamente: tali stringhe
sono chiamate runs. Una compressione dei dati può essere conseguita codificando
ogni run.
8
Consideriamo la figura 2.1 che rappresenta un’immagine di 10x10 pixel e dove è
riportato il livello di grigio di ogni pixel. Proviamo a codificare per esempio le prime
tre righe:
Riga1: (1,6), (2,1), (3,1), (2,2);
Riga2: (0,1), (1,6), (2,2), (3,1);
Riga3: (1,1), (0,3), (1,4), (2,1).
In questa codifica, per ogni coppia di valori, il primo numero rappresenta il
livello di grigio e il secondo il numero di volte in cui tale livello si ripete
consecutivamente, cioè la lunghezza della run.
1 1 1 1 1 1 2 3 2 2
0 1 1 1 1 1 1 2 2 3
1 0 0 0 1 1 1 1 2 2
2 2 3 5 4 3 1 0 1 1
4 6 5 4 3 1 1 2 2 2
5 5 2 1 2 3 3 3 2 1
4 3 1 2 1 1 1 2 2 2
2 0 2 0 1 3 1 3 3 7
1 1 2 2 1 5 5 7 7 7
1 1 2 4 1 1 6 7 7 7
Figura 2.1 – Esempio di immagine in termini di livelli di toni di grigio
Se utilizziamo una codifica a 3 bit/pixel per rappresentare i vari livelli di
grigio, le prime tre righe, formate da 10x3=30 pixel, impiegano complessivamente
30x3=90 bit. Invece se impieghiamo la codifica basata sulle runs ed utilizziamo
sempre 3 bit per rappresentare i livelli di grigio e 4 bit per la lunghezza delle runs, le
prime tre righe impiegano complessivamente 12x7=84 bit, con una diminuzione
rispetto al caso di assenza di codifica.
Per evitare errori nell’immagine ricostruita dovuti ad errati posizionamenti
dei pixel all’interno dell’immagine, si adotta in questa codifica una sincronizzazione
alla fine di ogni riga che permette l’eliminazione di eventuali errori all’interno della
riga stessa.
9
Questo tipo di codifica è adatta soprattutto ad immagini con due, o comunque
pochi, livelli di grigio presenti e che quindi si ripetono consecutivamente. Immagini
con alti livelli di dettaglio, strutture intricate, e molti livelli di grigio utilizzati non
presentano runs di particolare lunghezza e tale codifica finirebbe per produrre un
codice più lungo e non una compressione.
Codifica aritmetica
Questo tipo di codifica, come quella di Huffman, sfrutta le probabilità di
occorrenza dei vari livelli di grigio, ma al contrario di questa non è limitata dal fatto
che ogni simbolo debba avere una parola di codice unica almeno lunga 1 bit.
Praticamente vengono prese in considerazione intere stringhe di pixel, che
possono anche corrispondere ad una riga, e codificate per intero così da avere due
valori che rappresentano univocamente l’intera stringa. Questi due valori sono il
punto di codice C
k
ed un intervallo A
k
, che ora andremo a definire. Ogni simbolo di
cui è composta l’immagine viene rappresentato da una probabilità individuale di
occorrenza p
l
e da una probabilità cumulativa P
l
che praticamente è uguale alla
somma delle probabilità individuali dei simboli di valore inferiore.
Per esempio, se consideriamo lo schema dell’immagine di figura 2.1,
otteniamo i valori di probabilità riportati in tabella 2.1.
simboli occorrenze p
l
P
l
0 7 0.07 0.00
1 37 0.37 0.07
2 24 0.24 0.44
3 12 0.12 0.68
4 5 0.05 0.80
5 6 0.06 0.85
6 2 0.02 0.91
7 7 0.07 0.93
Tabella 2.1 – Valori delle probabilità
Supponiamo di voler codificare la stringa [4,3,1] composta dai primi tre pixel
della settima riga. I valori iniziali di C
k
e A
k
sono posti a C
0
=0 e A
0
=1, e poi si
calcolano itarativamente secondo le seguenti espressioni:
10