• Non ci sono risultati.

Visilog 5.2: comandi e procedura per le lave etnee

7. ACQUISIZIONE ED ELABORAZIONE DELLE IMMAGINI

7.3. Elaborazione dell’immagine

7.3.1. Visilog 5.2: comandi e procedura per le lave etnee

In questo paragrafo affronteremo da vicino la macro utilizzata per segmentare le lave etnee. Questa procedura, visti i punti elencati in precedenza, è efficace per quanto concerne i pirosseni appartenenti ai campioni della colata del 1669, mentre per le restanti fasi mineralogiche e gli altri campioni delle colate del 1843 e del 1981, risulta inefficace. Sotto un altro punto di vista, questa macro (procedura) rappresenta un valido modello, a mio modo di vedere, per analizzare un’ampia gamma di immagini. Vedremo da vicino i vari passaggi da cui è costituita la procedura e di conseguenza accompagneremo il lettore nel mondo di Visilog 5.2 e VBA (Visual Basic Applications), nel modo più sintetico e concreto possibile. I passaggi principali saranno sottolineati, in corsivo ed indicati da frecce.

Prima di tutto è opportuno creare sul desktop del PC che stiamo adoperando, una cartella di lavoro (“Elaborazione”), in cui inseriremo l’immagine del campione che andremo ad esaminare. Dopodichè, la macro ci chiederà, attraverso una finestra di dialogo, il nome del campione e successivamente lo salverà nella cartella di lavoro sotto il nome di “lava”:

Sub Inizio()

Call Viewer.DeleteAllImg

Nome = InputBox("dai il nome del campione")

Err = Data.LoadData("C:\Documents and Settings\user\Desktop\Elaborazione\" & Nome & ".jpg", DataType, ImgName)

Viewer.DisplayImg (ImgName)

Call Viewer.Tile

Call Data.SaveSeqRange(False, False)

Err = Data.SaveData(eDATATYPE_IMG, Nome, "C:\Documents and Settings\user\Desktop\Elaborazione\Lava.im5")

Vista la parte iniziale, in cui viene caricata l’immagine del campione e salvata poi con il nome lava, inizia una seconda parte in cui applichiamo un “filtraggio”, per migliorare la qualità della scansione:

'sistema l'immagine con filtri morfologici e con lo smoothing

Err = Data.LoadData("C:\Documents and Settings\user\Desktop\Elaborazione\Lava.im5", DataType, ImgName)

Viewer.DisplayImg (ImgName)

Call Viewer.Tile

Call automedian("Lava", "Lava morf Filter") ◄

Call colordilate("Lava morf Filter", 1, M_SATURATION, "LavaColorDilate") ◄

Call lowpass_5x5("LavaColorDilate", "gauss2", M_AUTO_SCALE, "LavaSmoothed") ◄

Call Viewer.DeleteImg(Nome) [cancella l’immagine chiamata “Nome”, cioè quella

del campione]

Call Viewer.DeleteImg("Lava morf Filter") [cancella l’immagine chiamata “Lava morf Filter”]

Call Viewer.DeleteImg("LavaColorDilate") [cancella l’immagine chiamata “LavaColorDilate”]

Call Viewer.DeleteImg("Lava") [cancella l’immagine chiamata “Lava”]

CallTrovaBolle [chiama la macro “TrovaBolle”]

Call TrovaCpxRicorsivo [chiama la macro “TrovaCpxRicorsivo”]

CallTrovaPlgRicorsivo [chiama la macro “TrovaPlgRicorsivo”]

Call TrovaOlivRicorsivo [chiama la macro “TrovaOlivRicorsivo”]

CallContaBolle [chiama la macro “ContaBolle”]

CallContaCpx [chiama la macro “ContaCpx”]

CallContaOlivina [chiama la macro “ContaOlivina”]

CallContaPlagioclasi [chiama la macro “ContaPlagiocalsi”]

End Sub

Il titolo in verde, in ambiente VBA (Visual Basic Applications), rappresenta un commento ad una parte della macro. Si vedono chiaramente i tre passaggi riguardanti il filtraggio dell’immagine. Un filtro, principalmente, ha la

funzione di rendere più uniforme la variazione cromatica dell’immagine, quindi il suo obbiettivo principale è quello di eliminare il rumore (fig. 6).

Il primo filtro che viene applicato alla nostra immagine, è morfologico, ed appartiene al comando sotto la voce di “Morphology → Morphological filters” (fig. 7). È un filtro di tipo non-linerae che, utilizzando combinazioni di “opening e closing”, permette di rimuovere, nelle stesse quantità, sia il rumore bianco che quello nero. I filtri morfologici sono quattro (fig. 8). Io ho deciso di utlizzare il tipo di filtro “automedian” (vedi testo macro riportato sopra). La seconda e la terza operazione, più che filtrare l’immagine, tendono ad omogeneizzare i colori presenti. Quindi, il comando “colordilate”, che si trova nella casella “Morphology” sotto la

voce “Erode & Dilate” (vedi fig. 7), attuerà una dilatazione dei colori dell’immagine, rendendoli più vivaci. Questo processo può essere applicato sia per saturazione, che per luminosità. Io ho optato per la saturazione.

Figura 6: Schema rappresentativo di come opera un filtro di Visilog 5.2 sul segnale di un immagine (foto presa dal prontuario di Visilog 5.2).

Figura 7: Gruppo dei comandi appartenenti a Morphology.

Figura 8: Filtri del gruppo di comandi Morphological Filters (vedi fig. 7).

Infine, il filtro “lowpass 5x5” appartenente al gruppo di comandi “Smoothing” nella casella “Filters” (fig. 9), tende a ridurre il contrasto e spesso i bordi degli oggetti di un immagine. In pratica, tende a defocalizzare l’immagine. Il fine delle tre operazioni di filtraggio viste sopra, è quello di migliorare la qualità della nostra immagine, soprattutto nella zona riguardante la pasta di fondo, che rappresenta la zona e la fonte principale del disturbo. Ora entriamo nella fase calda della procedura, in quanto inizia il procedimento di segmentazione dell’immagine. L’immagine su cui lavoriamo non è più la “lava”, ma ha preso il nome di “LavaSmoothed” (vedi macro).

TrovaBolle. Questa è la prima macro che viene chiamata ed è costituita dal seguente testo (a fianco sono riportate le spiegazioni dei passaggi):

Sub TrovaBolle()

Call Viewer.Tile

Call rgb2mono("LavaSmoothed", "R", "G", "B") [scompone l’immagine lava smoothed (input) nei tre canali R, G e B. Otteniamo così tre immagini (output) in scala di grigio].

'sogliatura manuale e creazione dei marker [inizio della binarizzazione dell’immagine].

ReDim VlgArray1(0 To 1) [Inizio sogliatura del canale B, partendo da

valori compresi tra 200-255. Questo perché le bolle sono bianche].

VlgArray1(0) = 200# VlgArray1(1) = 255#

Call I_threshold("B", VlgArray1, "Bt") [viene chiamato il commando “I_Threshold” il quale permette di modificare I valori di sogliatura in modo manuale. Crea l’immagine binaria Bt]→questo passaggio si esegue anche per i canali G e R.

ReDim VlgArray1(0 To 1)

VlgArray1(0) = 200# VlgArray1(1) = 255#

Call I_threshold("G", VlgArray1, "Gt")

Figura 9: Comandi relativi alla cartella Filter (a sinistra). A destra sono indicati i tipi di operazioni possibili con lo Smoothing.

ReDim VlgArray1(0 To 1) VlgArray1(0) = 200# VlgArray1(1) = 255#

Call I_threshold("R", VlgArray1, "Rt")

Call logical_or("Bt", "Gt", "Bt+Gt") [con il comando logical-or si sommano le immagini binarie Bt e Gt. Di seguito l’immagine Bt+Gt sarà sommata con Rt].

Call logical_or("Bt+Gt", "Rt", "Rt+Gt+Bt")

Call Viewer.DeleteImg("R") [cancella l’immagine R].

Call Viewer.DeleteImg("G") Call Viewer.DeleteImg("B") Call Viewer.DeleteImg("Bt") Call Viewer.DeleteImg("Gt") Call Viewer.DeleteImg("Rt") Call Viewer.DeleteImg("Bt+Gt") Err = Viewer.Display("Rt+Gt+Bt")

‘ciclo iterativo per la costruzione dei marker [l’immagine binaria delle bolle Rt+Gt+Bt

rappresenta le bolle “sporche”, ovvero abbiamo applicato una sogliatura tale da prendere sicuramente le bolle, ma anche un po’ di rumore. Per eliminare il rumore si costruisce un marker (maschera) i cui pixel rappresentano vermante le bolle].

controllo = "n"

While controllo = "n"

messaggio1 = "Quante erosioni vuoi fare? (2) "

Call erode("Rt+Gt+Bt", InputBox(messaggio1), "marker") Err = Viewer.Display("marker")

controllo = InputBox("vanno bene i marker? s/n") [se il marker ottenuto non andasse bene, allora la macro ci consente di tornare indietro e di ripetre il ciclo di erosione].

Wend

'uso dei marker la ricostruzione delle bolle [la ricostruzione delle bolle si ottiene con il

comando “reconstruct”. Questo ricostruisce l’immagine sulla base del marker, applicato all’immagine Rt+Gt+Bt, ovvero le bolle “sporche”].

Call reconstruct("Rt+Gt+Bt", "marker", "bolle provvisorie")

Call hole_fill("bolle provvisorie", M_8CONNEXITIES, "bolle") [il commando “hole_fill” riempie, se presenti, le cavità delle bolle “binarie”].

Call Viewer.DeleteImg("Rt+Gt+Bt")

Call Viewer.DeleteImg("bolle provvisorie")

Call Viewer.DeleteImg("marker")

Err = Data.SaveData(eDATATYPE_IMG, "bolle", "C:\Documents and

Settings\user\Desktop\Elaborazione\Bolle.im5") [salvataggio dell’immagine “bolle” nella cartella di lavoro “Elaborazione”].

Ora è opportuno riassumere quanto descritto sopra (macro “TrovaBolle”). Il punto di partenza, l’immagine di input, è rappresentato da “LavaSmoothed”, la quale viene scomposta in tre immagini: R, G e B. Il comando per compiere questa operazione si trova nella cartella “Miscellaneous” alla voce “Color Tools” (fig. 10). Una volta eseguita questa scomposizione, è possibile tramite il comando “I_threshold”, che si trova nella cartella “Thresholding” alla voce “Binarisation” (fig. 11), avviare la procedura di sogliatura sulle tre immagini in scala di grigio R, G e T ed ottenere tre immagini binarie per le bolle. Questo processo è di tipo interattivo, permette all’esecutore di operare direttamente nella macro, senza interromperla. Una volta ottenute (Rt, Gt e Bt), operiamo una somma tra di loro (comando “logical or”), per avere l’immagine binaria delle bolle completa. La somma avviene prendendo i pixel comuni e non comuni delle tre immagini. Nella figura 12 sono riportati i comandi associati a questa operazione. È inutile dire che il processo di sogliatura è il più importante, in

quanto un’errata scelta dei parametri comporta un risultato finale del tutto insoddisfacente. Per avere un buon risultato finale è necessario operare una “setacciatura” che non prenda in considerazione troppo rumore, che come già sappiamo è quello che induce il processo a fornire immagini binarie finali di scarso valore. Una volta ottenute le bolle binarie Figura 10: Comandi riguardanti la scomposizione

dell’immagine.

Figura 11: Comandi riguardanti la binarizzazione delle immagini.

Figura 12: Gruppo dei comandi logici.

totali, quindi anche con un leggero rumore, è possibile ricavare sempre da quest’ultima immagine, la maschera o marker, compiendo vari cicli di erosione a seconda delle esigenze. Applicando cicli di erosione appropriati, arriviamo ad ottenere un’immagine binaria delle bolle, che contiene solo ed esclusivamente dei pixel rappresentanti sicure delle bolle (marker). L’operazione “reconstruct” consente di ottenere un’immagine finale sulla base delle bolle sporche (Rt+Gt+Bt) e il marker appropriato. Abbiamo già visto in precedenza (fig. 7) a quale cartella di lavoro appartengano queste due operazioni, mentre nelle immagini successive (fig. 13-14) sono riportati sia i comandi relativi all’erosione (“erode”) e al “reconstruct”, sia i grafici che spiegano come operano sull’immagine.

Figura 13: Riprendendo la figura 7 (Morphology), alla voce Erode & Dilate troviamo il comando Erode. Questa operazione rimuove i punti isolati e le piccole particelle e disconnette alcune particelle. Come esempio sono riportate due immagini. Quella a sinistra è l’immagine di Input, quella a destra di Output, ovvero dopo aver subito il ciclo di erosione.

TrovaCpxRicorsivo. Dopo la macro delle bolle, entra in gioco quella dei pirosseni. Questa è la procedura che c’interessa in particolar modo, in quanto basata su una macro ancor più evoluta della precedente. Si tratta infatti di operazioni che possono essere svolte iterativamente. Questa macro nasce dalla necessità di avere la possibilità di lavorare su più zone a diverso contrasto nell’immagine. Infatti, come già accennato all’inizio di questo capitolo, alcuni campioni hanno zone più chiare ed altre più scure.

In definitiva, come premessa, diciamo che la macro dei pirosseni ci permette di trovare l’immagine binaria di più zone del campione a mano, in modo separato, e dopo che abbiamo constatato che sono state scandagliate tutte le zone del campione, somma tutte le immagini binarie. I comandi inseriti all’interno della macro, riguardanti Visilog, sono gli stessi visti nella macro “TrovaBolle”, con l’aggiunta però di piccoli particolari. Di seguito viene riportato il testo della macro “TrovaCpx”, con annesse le spiegazioni dei vari passaggi e i nuovi comandi di Visilog:

Sub TrovaCpxRicorsivo()

'inizia la routine iterativa

Iterazione = "s" controlloBis = 0

While Iterazione = "s"

controlloBis = controlloBis + 1

'scompone l'immagine nei tre canali

Call rgb2mono("LavaSmoothed", "R", "G", "B")

'sogliatura manuale e creazione dei marker

Call Viewer.Tile

ReDim VlgArray1(0 To 1)

VlgArray1(0) = 0# VlgArray1(1) = 48#

Call I_threshold("B", VlgArray1, "Bt")

ReDim VlgArray1(0 To 1)

VlgArray1(0) = 0# VlgArray1(1) = 52#

ReDim VlgArray1(0 To 1) VlgArray1(0) = 0#

VlgArray1(1) = 40#

Call I_threshold("R", VlgArray1, "Rt")

Call logical_or("Bt", "Gt", "Bt+Gt") Call logical_or("Bt+Gt", "Rt", "Rt+Gt+Bt") Call Viewer.DeleteImg("R") Call Viewer.DeleteImg("G") Call Viewer.DeleteImg("B") Call Viewer.DeleteImg("Bt") Call Viewer.DeleteImg("Gt") Call Viewer.DeleteImg("Rt") Call Viewer.DeleteImg("Bt+Gt")

'levo le bolle dai pirosseni totali in cui è possibile la presenza di rumore

Err = Data.LoadData("C:\Documents and Settings\user\Desktop\Elaborazione\Bolle.im5", DataType, ImgName)

Viewer.DisplayImg (ImgName)

Call Viewer.Tile

Call dilate("Bolle", 2, "Bolle")

Call logical_sub("Rt+Gt+Bt", "Bolle", "Rt+Gt+Bt")

Call Viewer.DeleteImg("Bolle")

'troviamo i primi marker con un ciclo che s'interrompe quando i marker ci soddisfano

Err = Viewer.Display("Rt+Gt+Bt") controllo = "n"

While controllo = "n"

messaggio1 = "Quante erosioni vuoi fare? (2) "

Call erode("Rt+Gt+Bt", InputBox(messaggio1), "marker provvisori") Err = Viewer.Display("marker provvisori")

controllo = InputBox("vanno bene i marker provvisori s/n")

Wend

'uso dei marker per ricostruzione totale dei cpx

Call reconstruct("Rt+Gt+Bt", "marker provvisori", "CPX provvisori") Err = Viewer.Display("CPX provvisori")

Call Viewer.Tile

'per sicurezza ricaviamo dei marker più sicuri (marker puliti) dai cpx provvisori

verifica = "n"

While verifica = "n"

messaggio1 = "Quante erosioni vuoi fare? (5) "

Call erode("CPX provvisori", InputBox(messaggio1), "marker puliti") verifica = InputBox("vanno bene i marker puliti? s/n")

Wend

'trova i PRIMI CPX con i marker puliti

Call reconstruct("Rt+Gt+Bt", "marker puliti", "PRIMI CPX")

'cancella le immagini che non servono più e visualizza quelle d'interesse

Call Viewer.DeleteImg("CPX provvisori")

Call Viewer.DeleteImg("marker provvisori")

Call Viewer.DeleteImg("marker puliti") Err = Viewer.Display("PRIMI CPX")

Call Viewer.Tile

Err = Viewer.Display("LavaSmoothed")

Call Viewer.Tile

Err = Viewer.Display("PRIMI CPX")

'chiede se i PRIMI CPX vanno bene o no

messaggio3 = "i PRIMI CPX vanno bene così? s/n/"

'se no allora inizia i cicli di opening e di closing per migliorare l’immagine

assenso = InputBox(messaggio3)

Do While assenso = "n"

messaggio1 = "Quanti cicli di opening (= erosione meno distruttiva!) vuoi fare? (5) " Call opening("PRIMI CPX", InputBox(messaggio1), "nuovi marker")

Call hole_fill("nuovi marker", M_8CONNEXITIES, "nuovi marker") Call reconstruct("Rt+Gt+Bt", "nuovi marker", "cpx")

messaggio1 = "Quanti cicli di closing (= dilatazione più precisa!) vuoi fare? (12) " Call closing("cpx", InputBox(messaggio1), "cpx def")

Err = Viewer.Display("cpx def") Call Viewer.Tile

Err = Viewer.Display("LavaSmoothed") Call Viewer.Tile

Err = Viewer.Display("cpx def") Call Viewer.Tile

Err = Viewer.Display("LavaSmoothed") Call Viewer.Tile

messaggio3 = "vanno bene così i cpx definitivi? s/n/" assenso = InputBox(messaggio3)

Loop

Call Viewer.DeleteImg("PRIMI CPX")

Call Viewer.DeleteImg("nuovi marker")

Call Viewer.DeleteImg("cpx")

Call Viewer.DeleteImg("Rt+Gt+Bt")

If controlloBis <> 1 Then

Err = Data.LoadData(Nome, DataType, ImgName)

Call logical_or(ImgName, "cpx def", "cpx def")

EndIf

Call Viewer.Tile

Call Data.SaveSeqRange(False, False)

Nome = "C:\Documents and Settings\user\Desktop\Elaborazione\cpx" + Iterazione + ".im5" Err = Data.SaveData(eDATATYPE_IMG, "cpx def", Nome)

Iterazione = InputBox("Vuoi effettuare la routine su un'altra parte della sezione? s/n")

Wend

'finite le iterazioni iniziamo la rifinitura dell'immagine

Call hole_fill("cpx def", M_8CONNEXITIES, "cpx filled") controllo = "n"

messaggio1 = "Quanti cicli di closing vuoi fare? (2) "

Call closing("cpx filled", InputBox(messaggio1), "cpx closed") Err = Viewer.Display("cpx closed")

controllo = InputBox("vanno bene i cpx? s/n")

Wend

Call hole_fill("cpx closed", M_8CONNEXITIES, "cpx filled bis")

Call Viewer.DeleteImg("cpx filled")

Call Viewer.DeleteImg("cpx closed")

Call Viewer.DeleteImg("cpx def") Err = Viewer.Display("cpx filled bis")

'ripulitura finale della pasta di fondo

Call negative("cpx filled bis", 8, "CPX")

Call negative("CPX", 8, "CPX")

messaggio4 = "Ripulitura pasta di fondo (elimina i cpx piccoli!) s/n?" rifinitura = InputBox(messaggio4)

Do While rifinitura = "s"

messaggio5 = "Quanti cicli di erosione vuoi fare? (5) "

Call erode("cpx filled bis", InputBox(messaggio5), "marker finali") Call reconstruct("cpx filled bis", "marker finali", "CPX")

messaggio4 = "Pulisco ancora? s/n/" rifinitura = InputBox(messaggio4) Loop Err = Viewer.Display("LavaSmoothed") Call Viewer.Tile Err = Viewer.Display("CPX") Call Viewer.Tile

Call Data.SaveSeqRange(False, False)

Err = Data.SaveData(eDATATYPE_IMG, "CPX", "C:\Documents and Settings\user\Desktop\Elaborazione\CPX.im5")

Call Viewer.DeleteImg("cpx filled bis")

Call Viewer.DeleteImg("marker finali")

Call Viewer.DeleteImg("CPX")

End Sub

Nel testo sopra riportato sono evidenziati i vari step da cui è composta la macro (commenti apostrofati in verde) che introducono l’operazione che il processo eseguirà in quel frangente. Parte essenziale della macro dei pirosseni sono gli operatori logici (“While - Wend”; “Do While - Loop” e “If/Then - End If”) appartenenti al linguaggio VBA, che permettono di restare all’interno di un ciclo di operazioni fino a che il risultato non sia soddisfacente.

Il nocciolo riguardante le iterazioni possibili, collegate a più zone del campione indagato, è evidenziato in giallo. In modo molto semplice, quando il

processo arriva a questo punto, compare un messaggio che chiede all’operatore se vuole eseguire una nuova sogliatura su una parte della sezione che non è stato possibile prendere in considerazione con i parametri di sogliatura usati. Se l’operatore vuole effettuare una nuova indagine, preme il tasto “s” e il processo riparte da capo, ricordando che ogni immagine binaria creata viene salvata e ogni qualvolta che ripetiamo l’operazione, tali immagini binarie vengono sommate tra di loro. Se l’operatore ritiene di aver scandagliato il campione a mano in ogni sua zona, preme il tasto “n”, dando inizio così alla parte riguardante la rifinitura dell’immagine.

Una variazione rispetto alla macro delle “Bolle” è rappresentata dal comando “logical sub” (sempre evidenziato in giallo). Questa operazione esegue una sottrazione tra l’immagine binaria dei pirosseni sporchi (“Rt+Gt+Bt”) e l’immagine binaria delle bolle trovate in precedenza, cosicché siamo sicuri di non incappare in errori di valutazione. Di seguito riportiamo uno schema (fig. 15) in cui sono inserite le immagini che rappresentano i tratti essenziali del processo. Il campione a cui fa riferimento tale figura è il 1669-1. Non è stata presa l’intera immagine, ma solo una parte, in quanto avrebbe occupato uno spazio eccessivo. Il passaggio 1 indica la scomposizione dell’immagine iniziale nei tre canali R, G e B, con il comando “rgb2mono”; il passaggio 2 crea l’immagini binarie relative ai tre canali, grazie alla sogliatura eseguita dall’operatore mediante il comando “I_threshold”; il passaggio 3 opera la somma tra le tre immagini binarie (Rt+Bt; Rt+Bt+Gt) grazie al comando “logical_or”; il punto 4 crea i marker operando un erosione di ordine due sull’immagine dei “cpx sporchi”. Infine, passaggio 5, si attua un “reconstruct” tra i “cpx sporchi” ed i “marker”. Da quanto detto e dalla figura che seguirà, possiamo dedurre che i punti più delicati ed importanti sono il 2 e il 4, in quanto un’errata sogliatura, oppure una genesi di marker inadeguati, compromette il risultato finale.

IMMAGINE DI PARTENZA

CANALE G CANALE B

Sogliatura: Rt Sogliatura: Gt Sogliatura: Bt

CANALE B Somma: Rt+Gt+Bt “cpx sporchi” Opearzione: “erosione di 2” MARKER IMMAGINE FINALE: “Reconstruct” tra le immagini “Rt+Gt+Bt” e “Marker”. 1. 2. 3. 4. 5.

Documenti correlati