Vous êtes sur la page 1sur 11

Corso di

Elaborazione ed Interpretazione delle


Immagini Digitali
A.A. 2014/2015

N1:
Contrast Enhancement

Autore:

Valerio Colamatteo

Sommario:
Lesercitazione N 1 richiede lapplicazione dei primi rudimenti teorici appresi
dal corso afferente per la realizzazione, in ambiente di programmazione
C++/OpenCV, di alcune delle tecniche, al momento note, di trasformazione
puntuale dei valori di intensit dei pixel delle immagini.
Lambito di manovra dunque il dominio spaziale e il target operativo
dellesercitazione la manipolazione del contrasto (contrast enahncement)
dellimmagine fornita come riferimento iniziale.

Descrizione dellesercitazione
Lattivit di miglioramento (enhancement) dellimmagine trova pieno accoglimento unicamente se
relazionata alla specificit funzionale che muove lanalisi primordiale della stessa e, di riflesso, la
necessit di operare tali manipolazioni. Per quanto detto, le procedure qui applicate non vogliono e
non possono allora considerarsi come universalmente replicabili per altre tipologie di immagini. In
ragione di ci si comunque scelto di affidare allutente la scelta dei parametri coinvolti nelle
trasformazioni matematiche 1 affrontate nellesercitazione.
In tale prospettiva si intuisce immediatamente la valenza espressiva, nonch analitica, dello
strumento statistico dellistogramma. Lunge ovviamente dai presupposti redazionali di tale
elaborato unanalisi attenta delle propriet descrittive degli istogrammi nonch delle connessioni
teoriche di cui godono con la teoria della probabilit.
A motivare la scelta della visualizzazione dellistogramma come immediatamente successiva a
quella dellimmagine stessa da cui deriva, nonch come mezzo di comparazione dei risultati ottenuti
successivamente allapplicazione dellenhancement, basti dunque sapere quanto di seguito
brevemente argomentato.
Si intuisce, di fatto, sin da ora come questo lavoro sia interamente basato, in primo luogo,
sullanalisi degli istogrammi. Ci trova ragionevole causalit nelle constatazioni, di unanime
condivisione, appena formulate. La difficolt interpretativa intrinsecamente connessa ad una
valutazione oggettiva delle immagini post-trasformazione, trova per sostanziale moderazione
proprio nellanalisi degli istogrammi.
Sostanzialmente, unimmagine i cui valori di intensit dei rispettivi pixel tendano ad occupare in
maniera approssimativamente uniforme lintera gamma dei valori dellistogramma, pu essere
considerata come dotata di un elevato contrasto e dunque capace di mostrare una gamma diffusa di
tonalit di grigio 2.
Nota limmagine di partenza iniziale 3, listogramma della stessa appare immediatamente
comprensibile anche prima della sua visualizzazione. Limmagine di riferimento in scala di grigio
e presenta 256 livelli di intensit (8 bit). Dalla stessa si evincono per immediatamente due aree
cromatiche fortemente contrapposte:
-

Unarea di sfondo di intensit costante (zero);


Limmagine in primo piano del seno femminile ripreso attraverso una mammografia di
intensit non perfettamente costante ma comunque prossima allintensit massima (256).

Da tale situazione, listogramma derivante non pu dunque che presentare due picchi in
corrispondenza, rispettivamente, dei suddetti valori di intensit minima (0) e in un intorno di quello
di intensit massima (256). Si ad ogni modo deciso di escludere il valore zero 4 dalla
rappresentazione descrittiva dellistogramma, onde riuscire ad avere, per lo stesso, una maggiore
valenza qualitativa 5.

Banalmente, una valida definizione funzione di trasformazione, in questo contesto, da ritenersi sicuramente la
seguente:
(, ) = [(, )] , con: , , , 2 , 2 2

Il riferimento alle immagini gray_scaded di cui ci si occupata in questa prima esercitazione.


Della stessa non si riporter alcuna raffigurazione in quanto fornita direttamente tra le specifiche implementative
dellesercitazione e dunque, in tal senso, da intendersi come nota a priori.
4
Per i dettagli circa le modifiche apportate al codice si consultino il file sorgente dellesercitazione e la terza sezione di
questa relazione, dedicata agli aspetti implementativi pi di basso livello.
5
Allinterno della cartella contenete i file dellesercitazione si inserito anche limmagine originale dellistogramma
dellimmagine di partenza. Essa risulta rubricata con la dicitura: Original histo.png
3

La prima tecnica di trasformazione sperimentata la cosiddetta PowerLaw Transformation.


Anche qui, dati i vincoli dimensionali alla base di tale lavoro, per motivare la scelta di operare tale
trasformazione piuttosto che la logarithmic Transformation basti sapere che, allorch in
determinate situazioni, ambedue forniscono risultanze visive di uguale apprezzabilit, la soluzione
adottata, agendo opportunamente sui parametri in ingresso, consente indubbiamente di ottenere una
maggiore versatilit data dal pi ampio range di curve ottenibili al variare, come si vedr, dei valori
di alfa e gamma. In particolare, facile constatare come, sperimentalmente, dallimmagine di
partenza a parit di alfa, valori frazionari di gamma correggano i valori di intensit minore in
altrettanti valori di accresciuta intensit , rivelando, qualora ce ne fossero, dettagli prima invisibili.
Discorso perfettamente duale nel caso di gamma > 1. In caso di gamma e alfa unitari si ottiene
invece lidentit.
La seconda tecnica di enhancement dellimmagine implementa basata anchessa, sullanalisi
dellistogramma e in particolare su una sua equalizzazione. Questa, delle soluzioni proposte,
certamente quella di maggiore spessore teorico, la cui strutturazione cio, differentemente dalle
altre, deriva da considerazioni di ordine statistico che, allorch di primaria notoriet, risultano
ugualmente di improba esplicazione per le finalit espositive ivi dovute. Operando dunque una
estrema sintesi circa le architetture concettuali della materia in questione, basti sapere che, stante
landamento funzionale discreto di un istogramma, si pu giungere allequalizzazione
dellimmagine attraverso la seguente formulazione:

=0

=0

( 1)
= ( ) = ( 1) ==

: = 0, , 1

(1.0)

Dove, ed rappresentano genericamente il k-esimo livello di intensit prima e dopo la


trasformazione ( ), il numero di pixel di intensit pari a , e il numero totale di pixel,
rispettivamente, per riga e colonna, il valore massimo di intensit e, in ultimo, ( ) rappresenta
invece la probabilit di incontrare nellimmagine un valore di intensit pari a 6 . La sommatoria
nelle frequenze coincide con listogramma comulativo dellimmagine 7.
P

Lultima trasformazione ad essere implementata quella del Contrast-Stretching. Lintento


quello di allungare la gamma dei livelli di intensit dellimmagine attraverso lapplicazione di un
apposita funzione lineare a tratti (monotona non decrescente), univocamente determinata da due
punti (1 ed 1 nel file sorgente), i cui valori vengono ancora una volta inseriti dallutente al runtime del programma. Tale funzione permette di scindere limmagine tre aree focali differenti che
saranno trattate differentemente in base ai valori di pendenza della funzione dichiarata nel tratto di
relativa competenza 8.
Lalgoritmo implementato nella determinazione delle 3 semirette adiacenti muove da semplici
considerazioni geometriche attinenti la determinazione della retta geometrica nel piano cartesiano 9.

Un istogramma a valori normalizzati sarebbe dunque proprio corrispondente alla rappresentazione funzionale di
( ) rispetto a .
7
Nella sezione terza di questa relazione si trova uno specifico approfondimento sullalgoritmo determinativo
dellistogramma comulativo.
8
Allutente, ancora una volta, dunque affidato il compito di individuare, secondo una personale analisi, le coordinate
dei punti della funzione di trasformazione.
9
In particolare si implementata la formulazione implicita della retta: = + dove m il coefficiente angolare
della retta e q rappresenta il valore dellintercetta per x=0.

Per maggiori dettagli implementativi si rimanda alla sezione 3 di questa relazione e al codice
sorgente in allegato.

Descrizione dei risultati


In questa seconda sezione si dibatter dei risultati effettivamente ottenuti con le trasformazioni di
cui sopra applicate allimmagine campione.
Gi detto dellistogramma originale (Original_Histo e Histo_Original), passiamo allanalisi
descrittiva degli altri risultati.

1) PowerLaw Transformation

Limmagine contrastata in questo caso quella denominata Powered_Image.png. Il relativo


istogramma invece etichettato come Power_Contrasted_ImageHisto.png.
Le immagini si riferiscono a valori di input iniziali (a e b) 10 pari, rispettivamente, a 1 e 25.

Dal confronto con gli originali emergono subito delle evidenti differenze cromatiche. In
particolare una pi gamma di livelli di grigio in grado di mettere in evidenza alcune parti del
seno ex-ante completamente celati dal bianco intenso ed uniforme che contraddistingueva quella
sezione dellimmagine. Quanto gi intuitivamente evidenziabile gi alla prima occhiata diviene
invece una constatazione di fatto, rigorosa e fondata, gi anche ad una prima analisi superficiale
dellistogramma prodotto dalla trasformazione di potenza. Questultimo, infatti, a differenza
delloriginale, mostra una maggiore dispersione dei valori e un picco modale nella zona centrale
del dominio di appartenenza dei valori. Quindi il risultato sembra confermare in pieno le attese
illustrate nella sezione precedente.

2) Equalization

Limmagine contrastata in questo caso quella denominata Equalized_Image.png. Il relativo


istogramma invece etichettato come equalizedHisto.png.

Lequalizzazione mostra in maniera evidente risultati inferiori a quelli ottenuti con la


trasformazione precedente. In particolare nellimmagine contrastata si ravvisa una componente
eccessiva, a mio modo di vedere, di valori di intensit elevati. In particolare la componente di
sfondo risulta essere passata da un intensit pari a zero (nero prefetto) a 168. Ci in realt
avrebbe consentito la rilevazione di oggetti di sottofondo nascosti ma, trattandosi di
unimmagine medica, lunica parte effettivamente rilevante ai fini della corretta visualizzazione
esclusivamente larea oggetto di indagine diagnostica. Ci anzi induce chi di interesse a
trascurare tutta la parte di sfondo dellimmagine. Anche concentrandosi solo sul seno invece, si
riscontra probabilmente una eccessiva trasparenza dei colori.
Impressioni confermate, queste ultime, dallanalisi dellistogramma che risulta distribuito in
maniera
certamente
molto
meno
uniforme
rispetto
al
precedente
(Power_Contrasted_ImageHisto.png). A supporto dellequalizzazione va per in questo caso
specifico considerata una ulteriore variabile di incertezza, probabilmente decisiva ai fini
dellavvallamento o meno delle considerazioni esposte pocanzi. Va infatti considerata che chi di
dovere, il medico/radiologo di circostanza o chi per esso, osserva tali immagini per degli scopi
10

Nella dicitura originale del codice sono C e Beta.

ben precisi, che ovviamente rifuggono da quelli che possono essere considerati i canoni estetici
e dunque dalle metriche di valutazione visiva propri di unimmagine tradizionale 11. Ci rimanda
allora, inevitabilmente, alla questione interpretativa che ha costituito il prologo concettuale di
tale relazione. C di fatto da considerare leventualit che le maggiori trasparenze
dellimmagine equalizzata, giudicate eccessive ad unanalisi prettamente estetica, siano in realt
fortemente funzionali allindividuazione di eventuali corpi estranei nel seno femminile,
motivo costituente unico e imprescindibile, questultimo, dellesistenza stessa dellimmagine in
questione.

3) Contrast - Stretching

Limmagine contrastata in questo caso quella denominata Image_Stretched.png. Il relativo


istogramma invece etichettato come ImageStretchedHisto.png.
Le immagini si riferiscono a valori di input iniziali (coordinate dei punti 1 e 1 ) pari,
rispettivamente, a (235,255) e (254,0) 12.
In diretta continuazione con quanto detto circa le (in alcuni casi) contrapposte esigenze
funzionali ed estetiche dellimmagine, la trasformazione in questione appare certamente di
rilevante impatto visivo ma, probabilmente, portatrice a chi di dovere di una ridotta funzionalit
diagnostica rispetto allimmagine equalizzata. Ci detto, questultima immagine contrastata si fa
preferire nettamente rispetto a tutte le altre sotto il profilo prettamente estetico. A dimostrazione
di ci basti osservare il relativo istogramma, molto ben uniformato e simmetrico attorno al
valore mediano.

11

Ossia non pensata e ideata unicamente per scopi medico-diagnostici.


Lidea quella comunque di manipolare il contrasto visivo dellimmagine nelle parti di maggiore densit dei valori
dellistogramma, nello specifico confinati nella coda destra dello stesso (Original_Histo oppure Histo_Original).
12

Listati dei programmi


(qui vanno inseriti i listati commentati dei programmi scritti per le sperimentazioni del
progetto)
In questa ultima sezione si porr lattenzione su alcune specifiche parti di codice 13.
Listato numero 1: funzioni MyEntry() e myQuit(). 14
#include <conio.h>
void MyEntry(){
printf( "Premi un tasto per iniziare l'esercitazione:\n" );
_getch();
}

Lintento era semplicemente quello di sostituire la pi classica system-call system(Pause) la


quale permette di porre in pausa il programma in esecuzione fino allavvenuta pressione di un tasto,
ma con la ritenuta pecca di visualizzare inevitabilmente la stringa Premere un tasto per
continuare. Ci stato possibile utilizzando la funzione _getch(), inclusa nella libreria C
conio.h, la quale sospende lesecuzione del programma fino alla lettura di un char da standard input
ritornando lo stesso in uscita in caso di utilizzo come left-value di un espressione ma senza
stamparlo a video.
Listato numero 2: funzione equalizerHist().

cv::Mat eiid::p1::equalizerHist(const cv::Mat & image ) throw (failure){


// copia matrice
cv::Mat result;
image.copyTo(result);
printf("\n\n\n");
printf("
printf("
printf("
printf("\n\n\n");

******************************************************\n");
Procedura di equalizzazione dell'immagine avviata.\n");
******************************************************\n\n");

cv::Mat sumhisto(1, 256, CV_32F, cv::Scalar(0));


float sum=0.0;

13

Le parti analizzate in questa sezione saranno semplicemente quelle parti di codice per cui si ritiene necessario fornire
un supplemento di spiegazione circa la loro fattiva implementazione. Non verranno ovviamente dibattute quelle aree di
codice ritenute di immediato recepimento funzionale per chiunque, di buon grado, posa mai voler porre attenzione su
questo lavoro per finalit e intenti che non siano ovviamente quelli direttamente riconducibili alla supervisione della
didattica.
14
Il listato delle due funzioni analogo. Lutilizzo delle stesse verr presumibilmente reiterato nelle esercitazioni a
venire, senza che per esse venga allegato alcun nuovo supplemento di notazione.

////comulative_histogram///////////////////////////////////////////////////////////////////
for ( int i=0; i < histo3.cols; i++ )
{

sum += histo3.at<float>(i);
sumhisto.at<float>(0,i) = sum;

cv::Mat imageComulativeHisto=sumhisto;
cv::Mat Image_Cum_Histo=eiid::p1::ComulativeHistogramImage(imageComulativeHisto);
eiid::imshow("Comulative Istogram",Image_Cum_Histo);
cv::imwrite("C:/Users/Valerio/Desktop/Dropbox/2014EIID/data/mammograms/Hologic/mcs/presegmentate/Image_Cum_Histo.png",Image_Cum_Histo);
//////////////////////////////////////////////////////////////////////////////////////////
for ( int i = 0; i < image.rows; i++ )
{
for ( int j = 0; j < image.cols; j++ )
{

result.at<uint8>(i,j) =
sumhisto.at<float>(image.at<uint8>(i,j)) * 255/MxN;

}
return result;
}

La funzione in questione intende realizzare il miglioramento del contrasto attraverso


lequalizzazione dellistogramma originale dellimmagine campione.
Dopo le varie stampe a video si affronta il problema della determinazione dellistogramma
comulativo. La questione in realt abbastanza semplice e viene risolta in pochissime linee di
codice. Ci che si fa scorrere le colonne del vettore (1x256) dellistogramma incrementando ad
ogni ciclo la variabile sum e trasferendo conseguentemente il valore della stessa nel nuovo array
sumhisto appositamente creato per ospitare i dati relativi allistogramma comulativo che viene poi
stampato e memorizzato in memoria secondaria.
Infine si applica la trasformazione dovuta allistogramma appena ottenuto secondo quanto asserito
nella formula (1.0).
Va fatto notare, inoltre, che per disegnare listogramma comulativo si utilizza unapposita funzione
cv::Mat eiid::p1::ComulativeHistogramImage(const cv::Mat &hist) throw (failure)
{
// Get min and max bin values
double maxVal=0;
double minVal=0;
cv::minMaxLoc(hist, &minVal, &maxVal, 0, 0);
// Image on which to display histogram
cv::Mat histImg(256, 256, CV_8U,cv::Scalar(255));

// set highest point at 90% of nbins


int hpt = static_cast<int>(0.9*256);
// Draw a vertical line for each bin
for( int h = 0; h < 256; h++ )
{
float binVal = hist.at<float>(h);
int intensity = static_cast<int>(binVal*hpt/maxVal);

// This function draws a line between 2 points


cv::line(histImg,cv::Point(h, 256),
cv::Point(h, 256-intensity),
cv::Scalar::all(0));

return histImg;

Lunica differenza rispetto alla funzione nativamente implementata nel file p0.cpp
(histogramImage()) riguarda la prima riga di codice in cui la funzione originale richiama la
funzione histogram() per la determinazione dello stesso. Nella circostanza attuale invece
listogramma di ingresso gi presente e viene fornito direttamente come parametro in ingresso
della funzione.

Listato numero 3: funzione computeOutput().


int eiid::p1::computeOutput(eiid::uint8 x, int r1, int s1, int r2, int s2)throw (failure)
{
float result;
if(0 <= x && x <= r1)
result = s1/r1 * x;
else if(r1 < x && x <= r2)
result = ((s2 - s1)/(r2 - r1)) * (x - r1) + s1;
else if(r2 < x && x <= 255)
result = ((255 - s2)/(255 - r2)) * (x - r2) + s2;

return (int)result;
}

lalgoritmo per limplementazione della funzione di contrast-stretching allistogramma originale


dellimmagine campione. Banalmente, si tratta della trasposizione in codice C++ dellequazione
implicita della retta nel piano cartesiano ( = + ).
Il coefficiente angolare della retta (m) corrisponde al rapporto tra le coordinate y e x di 2 punti
qualsivoglia della retta (che per definizione mantiene costante la propria inclinazione). Solo nella

prima semiretta esso risulta avere intercetta q nulla, in quanto essa ha sempre la coordinata x del
punto iniziale pari a zero. Le altre e due semirette hanno invece il parametro in questione q pari,
rispettivamente, allordinata del loro punto iniziale (s1) per la semiretta numero 2 e al punto finale
della stessa per la semiretta numero 3.
Tali considerazioni risultano (probabilmente) pi facilmente derivabili una volta operate le
immediate considerazioni geometriche del caso.
La funzione computeOutput() viene richiamata allinterno della procedura di Contrast-Stretching per
ogni valore dellistogramma dellimmagine campione.
Il listato completo della funzione in questione il seguente e con esso si chiude questa mia prima
relazione.
cv::Mat eiid::p1::ContrastStretching(const cv::Mat & image) throw (failure)
{
cv::Mat image_copy;
image.copyTo(image_copy);
std::cout<<"Inserire parametro r1.x: "<<std::endl; std::cin>>r1.x;
std::cout<<"Inserire parametro r1.y: "<<std::endl; std::cin>>r1.y;
std::cout<<"Inserire parametro s1.x: "<<std::endl; std::cin>>s1.x;
std::cout<<"Inserire parametro s1.y: "<<std::endl; std::cin>>s1.y;
// scorro i pixel dell'immagine e applico la trasformazione punto per punto,
riconducendo ogni valore dei pixel
// ad un valore specifico relativo alla semiretta di appartenenza
for(int y = 0; y < image.rows; y++){
for(int x = 0; x < image.cols; x++){
int output = computeOutput(image_copy.at<uint8>(y,x), r1.x,
s1.x, r1.y, s1.y);
image_copy.at<uint8>(y,x)= (output);
}
}
return image_copy;
}

Vous aimerez peut-être aussi