SlideShare a Scribd company logo
UNIVERSITÀ DEGLI STUDI DI TRIESTE
Dipartimento di Ingegneria e Architettura
Corso di Studi in Ingegneria Elettronica e delle Telecomunicazioni
ESTRAZIONE AUTOMATICA DELLE LINEE IN
UN’IMMAGINE DIGITALE
Tesi di Laurea Magistrale
Laureanda: Relatore:
Francesca PADOIN Prof. Sergio CARRATO
Correlatore:
Ing. Marco FONTANI
_____________________________________________
ANNO ACCADEMICO 2020/2021
Indice
Introduzione 4
Capitolo primo - Individuazione dei contorni in un’immagine 5
1.1 Immagine digitale 5
1.2 Gradiente di intensità di un’immagine 6
1.3 Operatori di riconoscimento dei contorni di un’immagine digitale 7
1.3.1 Operatore di Sobel 7
1.3.2 Operatore di Canny 10
1.4 Confronto fra i due operatori 12
1.5 Utilizzo di maschere differenti per il prefiltraggio 14
1.6 Adaptative Threshold 18
1.7 Scelta di filtri finale 20
1.8 Altre metodologie prese in considerazione 20
1.8.1 Reti neurali 21
1.8.2 Algoritmo Haar-like 21
Capitolo secondo – Trasformata di Hough 23
2.1 Spazio delle immagini e spazio dei parametri 23
2.2 Meccanismo di voting 25
2.3 HOUGH_PROBABILISTIC e HOUGH_STANDARD 26
2.4 Confronto trasformata di Hough con i due operatori: Sobel e Canny 29
Capitolo terzo - Intersezione delle linee e stima dei punti di fuga 32
3.1 Track-bar 32
3.2 Intersezione fra linee 33
3.3 Tempistica di calcolo e complessità dell’algoritmo 34
3.4 Tecniche di clustering 35
3.5 Clustering partizionale 36
3.6 Confronto fra algoritmi 36
3.7 K-means 37
3.8 K-medoids 38
Capitolo quarto – Validazione sperimentale 43
4.1 Parametri di verifica 43
Conclusioni 47
Appendice 48
Bibliografia 50
Introduzione
Questa tesi, svolta presso l’azienda Amped SRL di Trieste, si prefigge l’obiettivo di
automatizzare tramite algoritmi la ricerca delle righe in un’immagine digitale. Questo
al fine di individuare i punti di fuga di un’immagine e calcolare la prospettiva. Tale
ricerca è utile ai fini forensi per individuare le reali dimensioni di un oggetto
all’interno di un’immagine digitale, estrapolandolo dalla prospettiva. Il tutto è stato
svolto con linguaggio C++ utilizzando la libreria OpenCV. Il codice prodotto è
concepito per essere inserito in un software, che calcola, fra le altre cose la
prospettiva, e dovrà quindi rispettare la compatibilità col software preesistente in
termini di linguaggio di programmazione e di versione della libreria utilizzata. Si è
pertanto deciso di procedere usando la versione 3.4.8 della libreria OpenCV.
Il metodo utilizzato per ricercare le linee presenti in un’immagine si basa sulla
trasformata di Hough, già presente in libreria, e sull’ottimizzazione della stessa in
termini di rumore e quantità di linee trovate. La trasformata usa al suo ingresso
l’immagine già pulita da rumore, in bianco e nero, e filtrata in modo tale da
visualizzare solo i punti con un brusco cambio di colore, ovvero i contorni. La
letteratura offre molti metodi di rilevazione dei contorni e per questa tesi si è scelto di
valutare sia l’operatore di Canny sia l’operatore Sobel. Sono state scelti questi due
perché presenti nella libreria e già abbondantemente verificati come efficaci.
Entrambi danno ottimi risultati e sono di facile utilizzo con poco dispendio di
memoria e di calcolo da parte del processore.
In questo lavoro di tesi il suddetto metodo ha trovato applicazione nella ricerca
dell’intersezione fra le linee individuate. Si è poi passati all’utilizzo di un algoritmo
di clustering, nel nostro caso particolare, il k-means, per l’individuazione delle tre
coordinate che localizzano la maggior densità dei punti d’intersezione, ipotizzando
che esse possano identificare i punti di fuga dell’immagine. Alla fine, si è proceduto
alla validazione dei risultati tramite verifica empirica da parte degli utenti.
Prima di iniziare la trattazione dell’edge detection si introduce una breve spiegazione
della libreria e della piattaforma utilizzate e si specifica che in tutti i paragrafi si
utilizzerà la notazione per i filtri e gli algoritmi della libreria OpenCv.
Capitolo 1
Individuazione dei contorni in un’immagine
In questo capitolo vengono introdotti i due operatori utilizzati per individuare i
contorni di un’immagine digitale. Verranno valutate le performance e le
problematiche di entrambi gli operatori e saranno introdotti dei filtri per ottenere dei
contorni più netti possibili in modo da migliorare la ricerca di linee operata dalla
trasformata di Hough.
1.1 Immagine digitale
Per trattare l’individuazione di un oggetto all’interno di una fotografia bisogna
concentrare l’attenzione sui bordi che costituiscono l’oggetto di interesse.
Nell’ambito dell’elaborazione delle immagini una delle tematiche principali è
l’individuazione dei contorni di una figura e per fare questo ci sono molte tecniche
che principalmente si basano sullo studio del gradiente di un’immagine. Qui di
seguito, dopo un breve accenno alla tecnica di estrazione dei contorni, andremo ad
analizzare le due tecniche che si è scelto di valutare per la rilevazione di linee in
un’immagine digitale. Queste tecniche sono fondamentali come base per l’utilizzo
della trasformata di Hough, in seguito trattata, per estrarre le linee in un’immagine.
Iniziamo innanzitutto col definire l’immagine digitale come la rappresentazione
bidimensionale tramite una serie di valori numerici che ne descrivono le qualità
distintive: dimensione e colore. Ogni “punto” a cui assegnare un valore numerico
determinante la qualità luminosa dell’immagine è denominata pixel. L’informazione
contenuta in un pixel viene espressa in bit. Maggiore è il numero di bit che
rappresenta il pixel e maggiore sarà la dinamica dell’immagine. La profondità di
colore è il numero di bit riservati ad ogni pixel. Posto N la profondità di colore, il
numero di possibili tonalità sarà 2^N. Un altro termine che incontreremo spesso sarà
l’edge, che si definisce come una forte variazione locale dei livelli di grigio,
tipicamente associata al confine tra due regioni con valori di grigio diversi. Per
individuarlo vengono usati degli operatori locali, che solitamente hanno la funzione
di migliorare la qualità dell’immagine oppure di estrarne le caratteristiche. Noi lo
useremo nella seconda accezione.
Questi operatori lavorano tramite una maschera quadrata N x N, solitamente 3x3 o
5x5, per valutare l’intorno del punto di interesse. Si considera il punto centrale di
coordinata (x, y) e si vanno a valutare gli N x N - 1 punti del suo intorno con
coordinate che seguono la direzione degli assi come in Figura 1.2.
Fig. 1.1 Maschera 3x3 Fig. 1.2 Maschera 3x3
1.2 Gradiente di intensità di un’immagine
I punti in cui si hanno variazioni brusche dell’intensità possono essere individuati
tramite l’analisi delle derivate, per esempio si possono valutare i massimi e i minimi
della derivata prima, oppure gli zero-crossing della derivata seconda, ovvero i punti
per cui la derivata seconda passa per lo zero, che corrispondono a brusche variazioni
del gradiente. La derivata di un segnale denota la sua variabilità: a fronte di forti
variazioni locali (ad esempio contorni e altri bruschi cambiamenti di intensità) la
derivata assume valori elevati, altrimenti se il segnale è costante, la derivata è zero.
Nel nostro caso di segnali bidimensionali, si devono considerare le derivate parziali e
quindi il gradiente. Questo è il vettore le cui componenti sono le derivate parziali
nelle diverse direzioni (2 nel caso di immagini):
𝛻𝐼(𝑥, 𝑦) =
𝜕𝐼(𝑥, 𝑦)
𝜕𝑥
,
𝜕𝐼(𝑥, 𝑦)
𝜕𝑦
E riprendendo il concetto di derivata come limite del rapporto incrementale avremo:
𝜕(𝑥, 𝑦)
𝜕𝑥
= 𝑙𝑖𝑚
→
𝐼(𝑥 + 𝛥𝑥, 𝑦) − 𝐼(𝑥, 𝑦)
𝛥𝑥
≃ 𝐼(𝑥 + 1, 𝑦) − 𝐼(𝑥, 𝑦)
𝜕(𝑥, 𝑦)
𝜕𝑦
= 𝑙𝑖𝑚
→
𝐼(𝑥, 𝑦 + 𝛥𝑦) − 𝐼(𝑥, 𝑦)
𝛥𝑦
≃ 𝐼(𝑥, 𝑦 + 1) − 𝐼(𝑥, 𝑦)
L’orientazione del vettore gradiente in un punto indica la direzione di maggior
variazione d’intensità in quel punto dell’immagine.
Fig. 1.3 Angolo del vettore Fig. 1.4 Direzione gradiente rispetto all’edge
‖𝛻‖ = 𝛻𝑥 + 𝛻𝑦
𝜃 = 𝑎𝑟𝑐𝑜𝑡𝑔
𝛥𝑦
𝛥𝑥
1.3 Operatori di riconoscimento dei contorni di un’immagine
digitale.
Nel nostro caso abbiamo deciso di utilizzare due operatori: Sobel e Canny come base
per la trasformata di Hough. Tramite questa trasformata è possibile individuare le
linee presenti nell’immagine con una bassa percentuale di errore. Solitamente si
utilizza Canny, il quale comunque si basa su un operatore di tipo Sobel, per creare
l’immagine utilizzata poi per calcolare la trasformata di Hough. Si è scelto di valutare
anche il solo Sobel in quanto fornisce dei contorni netti ed è meno affetto da problemi
di rumore rispetto a Canny. Questi operatori consistono nella convoluzione
dell’immagine con una o più maschere.
1.3.1 Operatore di Sobel
L’operatore di Sobel applica due maschere, solitamente 3 x 3, di convoluzione. Se I è
l’immagine, i rispettivi contorni lungo x e lungo y sono calcolati da:
𝐼 =
−1 −2 −1
0 0 0
1 2 1
e 𝐼 =
−1 0 1
−2 0 2
−1 0 1
𝐼 = I(x-1,y-1) - I(x+1,y-1) + 2I(x-1 ,y) - 2I(x+1,y) + I(x-1,y+1) - I(x+1,y+1)
𝐼 = I(x-1,y-1) + I(x+1,y-1) + 2I(x,y-1) - 2I(x,y+1) - I(x-1,y+1) - I(x+1,y+1)
L’operatore calcola il gradiente della luminosità dell’immagine in ogni punto,
trovando la direzione lungo la quale si ha il massimo incremento possibile dal chiaro
allo scuro e la velocità con cui avviene il cambiamento lungo quella direzione. Il
risultato ottenuto fornisce una stima di quanto l’immagine varia in quel punto, e
quindi della probabilità che quella parte di immagine rappresenti un contorno,
fornendo anche un’indicazione del suo probabile orientamento. In ciascun punto
dell’immagine il gradiente punta nella direzione del massimo aumento possibile di
luminosità e la lunghezza del vettore corrisponde alla rapidità con cui la luminosità
cambia lungo quella direzione.
Il problema di questa tecnica è il fatto di avere frammenti di edge non connessi
oppure punti o segmenti spuri a causa di rumore o piccole variazioni. Inoltre, essa
dipende molto dal settaggio della soglia: per immagini con molte variazioni di colore
o di toni di grigio è opportuno settare una soglia non molto alta (solitamente 60-90)
mentre per immagini abbastanza uniformi, conviene settare un valore alto intorno ai
200-250. Converrebbe in questi casi calcolare l’istogramma dell’immagine e andare a
valutare, in base al contrasto alto o basso, il valore da impostare alla soglia. Un valore
sbagliato può produrre importanti errori in fase di ricerca delle linee con la
trasformata di Hough non dando nessun risultato o linee non presenti nell’immagine.
Fig. 1.5 Utilizzo dell’operatore Sobel con soglia 70 sull’immagine di Lena (470x470).
Fig. 1.6 Utilizzo dell’operatore Sobel con soglia 150 sull’immagine di Lena (470x470).
1.3.2 Operatore di Canny
Per questi motivi solitamente si utilizza Canny come metodo per rilevare i contorni in
quanto esso produce edge connessi e, utilizzando un corretto range, è meno sensibile
alla soglia proprio perché valuta se un pixel è di un contorno basandosi su due soglie.
Il metodo è suddiviso in 4 fasi:
1) Smoothing gaussiano dell’immagine
2) Calcolo del gradiente
3) Soppressione dei non-massimi in direzione ortogonale all’edge
4) Selezione degli edge significativi mediante isteresi
Anche qui, come per Sobel, i risultati varieranno in base ad alcuni parametri che per
Canny sono rispettivamente: l’ampiezza della gaussiana (), la dimensione del filtro
(N) e le soglie per l’isteresi, T1 e T2, nell’ultima fase. Dopo alcune prove, si è visto
che una maschera 3x3 o 5x5 ed una soglia che va da 50 a 200 riesce ad essere
un’ottima configurazione per svariati casi.
Poiché l'algoritmo di Canny utilizza le derivate per trovare i gradienti di intensità
dell'immagine, è altamente suscettibile al rumore. Se non lo si rimuove, l'algoritmo
potrebbe riconoscere le zone rumorose all'interno dell'immagine come bordi ed
etichettarle in modo errato.
Di solito si usa pre-elaborare l’immagine con un filtro gaussiano, che serve a
rimuovere la maggior parte del rumore, pur introducendo, come trade-off, distorsione
nell’immagine, in quanto sfoca i contorni. Perciò bisogna sempre trovare un buon
compromesso, a livello di maschera, fra la riduzione del rumore e il dettaglio ben
definito. In seguito, dopo aver applicato il filtro, il passo successivo è il calcolo del
gradiente per valutare i contorni. Qui vengono usati come operatori differenziali o
Sobel o Prewitt o Roberts, in base alle esigenze.
Il passo successivo è la soppressione dei non massimi. Lo scopo è di eliminare
dall’immagine, vista come modulo-gradiente, i pixel che non sono massimi locali
rispetto all’orientazione del gradiente. Spostandosi in direzione del gradiente, infatti,
non si considerano tutti quei punti il cui modulo è strettamente minore del modulo di
uno dei due punti ad esso adiacenti, andando così a costruire una nuova matrice su
cui poi applicare la soglia. Il massimo locale si ha nei punti in cui la derivata del
gradiente si annulla. Alla fine, si ottiene un'immagine binaria. In figura 1.5 si può
vedere il risultato dell’analisi dell’intorno con una maschera 5x5, eliminando i pixel
che non rispettano la condizione di massimo locale lungo la direzione del gradiente,
che è ortogonale all’edge e con una doppia soglia 50-200.
Fig. 1.7 Utilizzo dell’operatore Canny sull’immagine di Lena (470x470).
A questo punto, abbiamo i bordi più sottili, ma c'è un problema: vi saranno alcuni
falsi bordi causati da rumore e leggere variazioni di colore. Anche se il primo passo
dell'algoritmo è stato quello di rimuovere il rumore, non tutto è stato rimosso. Questo
perché la scelta di un filtro gaussiano è stata un compromesso tra eliminazione del
rumore e sfocatura dei contorni. Ed è qui che si utilizza la doppia soglia. Per prima
cosa scegliamo due valori di soglia: un minimo e un massimo. Successivamente,
confrontiamo il gradiente di intensità di ciascun bordo con entrambi i valori di soglia.
Se il gradiente di intensità di un bordo è maggiore del valore di soglia massimo, viene
contrassegnato come un bordo forte. Al contrario, se il gradiente di intensità del
bordo è inferiore al valore di soglia minimo, viene scartato. Infine, se il gradiente di
intensità del bordo si trova tra i valori di soglia minimo e massimo, viene
contrassegnato come bordo debole. L'algoritmo di Canny determina ciò considerando
ogni pixel del bordo debole e gli 8 pixel adiacenti circostanti. Se uno qualsiasi dei
suoi pixel adiacenti fa parte di un bordo forte, si considera collegato a un bordo forte.
E perciò questo pixel viene conservato nel nostro risultato finale. Viceversa, se
nessuno dei pixel vicini è forte, si presume che non faccia parte di un bordo forte e
viene quindi soppresso.
Nel nostro caso specifico si è utilizzata la funzione Canny della libreria OpenCV che
implementa tutte queste funzioni e trova i contorni in un’immagine d’ingresso e li
traccia in uscita in una mappa dei contorni.
Una soglia troppo alta può far perdere informazioni importanti. D'altra parte, una
soglia troppo bassa identificherà erroneamente le informazioni irrilevanti (come il
rumore) come importanti. Sono state scelte queste due soglie in seguito a delle prove
su alcune immagini e si è visto che la soluzione ottimale, che permette di avere buoni
risultati in condizioni di luminosità e contrasto diversi, è quella del range 50-200. Il
problema qui è impostare un corretto prefiltraggio per evitare l’individuazione di falsi
contorni.
1.4 Confronto fra i due operatori
Tutti e due gli operatori, Sobel e Canny, hanno i loro pro e contro e sono stati valutati
entrambi come base per la trasformata di Hough. Sobel permette minori passaggi non
richiedendo né un prefiltraggio né l’individuazione di due soglie né la soppressione
dei non massimi. Inoltre, su immagini più geometriche individua in maniera migliore
i contorni di interesse come si può vedere in figura 1.7. In figura 1.6 l’immagine di
partenza da cui si sono calcolati i contorni.
Fig. 1.8 Immagine di partenza
Fig. 1.9 Contorni rilevati a sinistra tramite Sobel, con soglia 200 e a destra tramite Canny con
doppia soglia 50-200.
Il problema di tale tecnica è la dipendenza da un settaggio di soglia corretto. Ad
esempio, usando la stessa immagine di partenza e impostando un valore di soglia pari
a 70 si otterrà il risultato di figura 1.10 che è ben diverso da quello ottenuto con una
soglia a 200.
Fig. 1.10 Contorni rilevati a sinistra tramite Sobel, con soglia 70 e a destra tramite Canny con
doppia soglia 50-200.
Come si può notare l’immagine è molto più rumorosa nel secondo caso e nel
dettaglio anche il bordo del tetto è un’unica fascia nera e non più distinguibile come
nell’immagine precedente. Tutto ciò porta in seguito, usando Hough, ad un’errata
rilevazione delle linee presenti e quindi ad errori anche grossolani.
La problematica invece riscontrata con Canny è il bisogno di pre-filtrare l’immagine
per evitare eccessivi edge, poi interpretati come linee. Una maschera troppo piccola o
viceversa troppo grande può fare più danni del mancato filtraggio. Quindi anche in
questo caso bisogna calibrare bene la tipologia di filtro e la grandezza della maschera.
1.5 Utilizzo di maschere differenti per il prefiltraggio
Di seguito vengono riportate una serie di immagini a cui è stato applicato l’operatore
di Canny, prefiltrate con maschere di grandezza differente. Rispettivamente la foto a
destra viene filtrata con un filtro mediano 5x5 che elimina il rumore e introduce un
minimo di distorsione, sfocando i bordi. In figura ci sono vari esempi del risultato
della convoluzione con maschere differenti:
Fig. 1.11 Canny applicato all’immagine di partenza senza alcun filtro
Fig. 1.12 Canny applicato all’immagine di partenza elaborata con un filtro mediano con maschera
3x3
Fig. 1.13 Canny applicato all’immagine di partenza elaborata con un filtro mediano con maschera
5x5
Fig. 1.14 Canny applicato all’immagine di partenza elaborata con un filtro mediano con maschera
7x7
Fig. 1.15 Canny applicato all’immagine di partenza elaborata con un filtro mediano con maschera
9x9
Fig. 1.16 Canny applicato all’immagine di partenza elaborata con un filtro gaussiano con maschera
5x5 e sigma pari a 1
Fig. 1.17 Canny applicato all’immagine di partenza elaborata con un filtro gaussiano con maschera
9x5 e sigma pari a 15
Come si può notare una maschera troppo piccola non risulta utile, come pure una
eccessivamente grande. Non vi è inoltre particolare differenza fra un filtro mediano
ed uno gaussiano e qui si è scelto di utilizzare il primo perché richiede un minor
numero di variabili da inserire.
1.6 Adaptative Threshold
L’altro comando della riga di codice che si è utilizzato è l’adaptativeThreshold che
trasforma un’immagine in scala di grigi in una binaria tramite questa formula:
THRESH_BINARY
dst(x,y)={maxValue if src(x,y)>T(x,y)
0 otherwise
THRESH_BINARY_INV
dst(x,y)={ 0 if src(x,y)>T(x,y)
maxValue otherwise
dove T(x,y) è una soglia calcolata individualmente per ogni pixel.
In questo caso, prima di effettuare l’operazione di soglia vera e propria, si convolve
l’input con un particolare operatore, ADAPTIVE_THRESH_GAUSSIAN_C, che
trasforma l’immagine in una rappresentazione binaria, applicando la distribuzione di
Gauss. Si utilizza la binarizzazione in modo da eliminare ogni tipo di sfumatura e
gradazione di grigio. Tale soglia adattiva si utilizza quando si hanno situazioni di
illuminazione non uniforme, che rappresentano la maggior parte dei casi. Se non si
applicasse, pur applicando precedentemente il filtro mediano, otterremmo i risultati in
figura 1.18:
Fig 1.18 Utilizzo di Canny senza il comando adaptativeThreshold.
Infine, si applica un altro filtro per rimuovere il rumore che potrebbe essere stato
introdotto dall’operazione di soglia. Anche qui i risultati, senza l’applicazione di
questo filtro, sarebbero disastrosi:
Fig 1.19 Utilizzo di Canny senza applicare un filtro, dopo l’applicazione dell’AdaptativeThreshold
Come si può notare dalle figure precedenti un mancato prefiltraggio dell’immagine
può portare ad un’eccessiva e non voluta ricerca di contorni che in seguito porterà a
rilevare false linee nell’immagine.
1.7 Scelta di filtri finale
Pur tuttavia una serie di pre-filtri con una generica maschera 5x5 o 7x7 sono
sufficienti a pulire l’immagine dal rumore ed offrire un’accettabile base per la
trasformata di Hough. A differenza quindi di quanto avveniva con Sobel, non sarà
necessario settare una soglia ben precisa in base all’immagine di partenza ma basterà
implementare i giusti filtri ed una doppia soglia abbastanza ampia da comprendere
tutte le casistiche più comuni. Con questi valori difficilmente verranno prodotti falsi
contorni o false linee dell’immagine, mentre sbagliando la soglia di Sobel il nostro
programma interpreterà i dati che ha nella maniera scorretta, generando linee con
un’inclinazione anche di 90° diversa da quella originale.
In figura 1.20 l’immagine finale con operatore di Canny applicato con filtro mediano
7x7, adaptativeThreshold 7x7 ed infine filtro mediano 7x7.
Fig. 1.20 Canny applicata all’immagine di partenza con filtro mediano 7x7 e adaptativeThreshold
7x7.
1.8Altre metodologie prese in considerazione
In questo sotto capitolo si fa un breve accenno alle altre tecniche di estrazione delle
linee prese in considerazione.
1.8.1 Reti neurali
Prima di scegliere la trasformata di Hough, si sono valutate varie tecniche di
estrazione delle linee da un’immagine, in primis quella tramite l’utilizzo delle reti
neurali oppure un affiancamento delle stesse per avvalorare i risultati trovati con altri
algoritmi. Le reti neurali sono degli algoritmi basati sulle connessioni fra il neurone
trasmettitore e quello ricevitore, dove ogni connessione è caratterizzata da un peso
che sarà quello che verrà modificato per ridurre l’errore. Queste reti spesso si basano
su un apprendimento supervised, ovvero vi sarà un external teacher che determinerà
la durata dell’apprendimento, la frequenza di presentazione degli esempi e la misura
degli errori. In pratica mentre si addestra la rete, si presenta un pattern di foto
all’ingresso e si vuole che la rete modifichi l’insieme dei pesi per avere le uscite
desiderate ai nodi di uscita.
Per non appesantire il codice e non occupare eccessiva memoria, si era valutato dal
Paper [2] “Deep Learning for Vanishing Point Detection Using an Inverse Gnomonic
Projection”: la Inverse Gnomonic Projection. Questa è una mappatura che trasforma
il piano dell’immagine illimitato in uno spazio limitato, rendendo in tal modo il punto
di fuga, lontano dal centro dell’immagine, più facile da trattare. L’approccio
consisteva nei seguenti passi: estrazione delle linee, mappatura delle linee nella sfera
gaussiana e visualizzazione dell’immagine. Questa immagine veniva poi usata come
input per un CNN, allenato solo con dati sintetici. Questo CNN dava una previsione
sui possibili punti di fuga. La mappatura era utile al fine di permettere l’utilizzo di
dati sintetici piuttosto che quelli reali, occupando così minore spazio e permettendo di
crearsi i dati da sé.
Però, sebbene questa tecnica offra dei risultati molto soddisfacenti e precisi, non è
adatta al nostro caso principalmente per due motivi. Il primo si basa sul fatto che, per
una questione di compatibilità, il codice deve essere scritto in linguaggio C++ ed
essere coerente con la versione di OpenCV, già utilizzata nel software preesistente
mentre per le reti neurali si usa utilizzare Python oppure le nuove versioni di
OpenCV, per sfruttare al meglio e non appesantire troppo il codice.
Il secondo motivo si basa sul fatto che i dati forniti dal codice saranno poi utilizzati in
ambito legale e l’utilizzo delle reti neurali non è avvalorato da tutte le legislazioni
proprio perché è l’utente che decide di addestrare la rete sulla base dei dati che lui
stesso carica, introducendo dunque una parte non oggettiva nel computo delle linee.
1.8.2 Algoritmo Haar-like
Si era valutato anche l’utilizzo di un algoritmo Haar-like[3], che si basa sulla
differenza di intensità luminosa fra aree vicine dell’immagine tramite la Haar
wavelets. Una Haar-like features considera regioni rettangolari adiacenti e somma le
intensità dei pixels in ogni regione e calcola la differenza tra queste somme. Questa
differenza viene poi usata per categorizzare le sottosezioni di un’immagine. Nella
fase di ricerca una finestra, di forma definita, si muove su tutta l’immagine e per ogni
sottosezione si calcola la Haar-like feature. Questa differenza viene poi confrontata
con una soglia precedentemente decisa che separa i non oggetti dagli oggetti. Il
problema di questa tecnica è la poca precisione, di conseguenza ci vorranno parecchie
Haar-like features per descrivere un oggetto con sufficiente accuratezza. Anche se
questa feature ha una velocità di calcolo elevata, perché viene calcolata in tempo
reale, in sede di studio questa tecnica è stata scartata poiché non presente in libreria
OpenCV e quindi meno pratica.
Capitolo 2
Trasformata di Hough
In questo capitolo verrà introdotta la trasformata di Hough e i risultati ottenuti
applicando su di essa l’operatore Sobel e l’operatore Canny. Inoltre verranno
introdotti i due comandi della libreria OpenCV per calcolare la trasformata e un breve
confronto fra i due.
2.1 Spazio delle immagini e spazio dei parametri
Nel nostro caso specifico si è scelto di adottare la trasformata di Hough quale metodo
di individuazione delle rette nelle immagini. Questo metodo consiste nel mappare
ogni punto presente nell’immagine in una retta nello spazio dei parametri. Si usa una
rappresentazione parametrica che viene utilizzata per descrivere le rette nel piano
immagine tramite i parametri m, per la pendenza, e c, per l’intercetta. Fissati i valori
di m e c, l’equazione può essere vista come una mappatura di tipo biunivoco dallo
spazio dei parametri allo spazio dell’immagine.
Consideriamo il punto (x', y') nel piano cartesiano (x, y) e la generica retta di
equazione y'=mx' + c passante per il punto (Figura 2.1). Variando m e c posso
rappresentare tutte le possibili rette del piano cartesiano passanti per il punto (x', y').
Si può ricavare ora la legge che da un punto (x', y') dello spazio immagine permette di
tracciare la curva nello spazio dei parametri (m, c). Dall'equazione y'=mx' + c si
ottiene infatti c=-mx' + y', dove ora x' e y' sono costanti, e m e c variabili. Come si
vede in Figura 4.2, il fascio di rette passante per il punto P dell'immagine viene
quindi rappresentato con una retta nello spazio (m, c).
Figura 2.1: spazio immagine Figura 2.2: spazio parametri
Se considero ora 2 punti P'(x', y') e P''(x", y") nello spazio (x, y), che giacciono sulla
stessa retta, per ognuno di essi si ha un corrispondente fascio di rette che nello spazio
immagine (m, c) viene rappresentato da una retta. Si avrà allora che nello spazio dei
parametri la retta c=-mx' + y' descrive i valori di (m, c) relativi alle rette passanti per
P' e la retta c=-mx'' + y'' descrive i valori di (m, c) relativi alle rette passanti per P'',
come si vede in Figura 2.4.
Figura 2.3: spazio immagine Figura 2.4: spazio parametri
Il punto di intersezione (m', c') nello spazio dei parametri descrive i valori dei
parametri (m, c) della retta passante per P' e P'' nello spazio originale (x, y) ed è
quindi facile risalirvi. Il problema di tale impostazione è che, nel caso limite di retta
parallela all’asse y, avremo un valore di m tendente all’infinito che non sarebbe
gestibile facilmente tramite un calcolatore. Per questo motivo si tende ad utilizzare un
diverso metodo di parametrizzazione, simile alle coordinate polari, per non incappare
nel problema della pendenza infinita. Anche in questo caso entrano in gioco due
parametri: la distanza, ρ, della retta dall’origine e θ, l’angolo fra la normale alla retta
dall’origine e l’asse x: ρ= x cosθ+ y sin θ. Con questa parametrizzazione, per i punti
che sono allineati nel piano immagine corrisponde, grazie alla mappatura, una
sinusoide nello spazio dei parametri e l’insieme di tutte queste sinusoidi,
corrispondenti ai punti allineati, individuerà un punto in comune tra di loro. Questo
punto nel piano (ρ, θ) denominato (ρ₀, θ₀), definisce la retta passante per i punti
collineari. Quando sul piano dell’immagine ci sono dei punti allineati su una stessa
retta, sul piano dei parametri, le curve si intersecano in un punto che è l’immagine
della retta su cui giacciono i punti.
Figura 2.5: spazio delle immagini Figura 2.6: spazio dei parametri
2.2 Meccanismo di voting
Un altro problema che si riscontra è legato al rumore. Una retta nello spazio di
partenza definita da N punti P1, ..., PN viene identificata come intersezione nello
spazio dei parametri di N rette, ognuna corrispondente a un Pi, come in figura 2.7.
Fig. 2.7 Rappresentazione in assenza di rumore di punti allineati nello spazio dei parametri
Col rumore non è detto che i punti Pi siano perfettamente allineati e di conseguenza
non ci sarà un’unica intersezione come si può vedere in figura 2.8.
Fig. 2.8 Rappresentazione in presenza di rumore di punti non più allineati nello spazio dei parametri
Per ovviare a questo problema, si introduce un meccanismo di voting, ovvero si
divide lo spazio dei parametri in una griglia finita di celle, e si associa ad ognuna un
contatore. Quelle col maggior numero di voti, ovvero punti all’interno della griglia,
saranno quelle con la maggior probabilità di essere linee.
A livello di codice l’immagine che viene data in ingresso, per calcolarne la
trasformata, è un’immagine già passata sotto l’operatore di Canny o di Sobel. Sarà
quindi in bianco e nero per una minore complessità. Le foto che vengono trattate sono
spesso di interni monocolori o con poca variazione tonale e quindi non si va a perdere
eccessiva informazione estromettendo le tre componenti R, G, B ma si guadagna in
termini di calcolo.
2.3 HOUGH_PROBABILISTIC e HOUGH_STANDARD
Inizialmente si sono valutate due diverse tipologie della trasformata di Hough: la
HOUGH_PROBABILISTIC e la HOUGH_STANDARD. La fondamentale
differenza fra le due è che la prima restituisce dei segmenti, dando le coordinate degli
estremi, mentre la seconda restituisce una linea rappresentata dai parametri ρ, θ.
La HOUGH_PROBABILISTIC richiede come parametri: threshold(t),
minLineLenght(l) e maxLineGap(g).
Il primo è un parametro di accumulazione: solo le linee che hanno un voto superiore
ad un certo valore vengono accettate; dove il voto è dato dal numero di rette che si
intersecano nello stesso punto nello spazio dei parametri, ovvero punti che
appartengono alla stessa linea nello spazio delle immagini.
Il secondo indica la lunghezza minima che deve avere il segmento. Tutti i valori al di
sotto di tale lunghezza verranno scartati.
Il terzo indica il massimo gap permesso fra due punti, appartenenti ad una stessa
linea, affinché si possano unire in un unico segmento.
Questa trasformata può essere molto utile se si è interessati ai segmenti o ad avere le
coordinate iniziali e finali degli stessi per trattare con dei punti. Infatti, in uscita
otterremmo un vettore a quattro elementi. Il problema è che bisogna impostare ben 3
parametri ed è difficile trovare dei valori che possano andare bene per una buona
parte dei casi d’esame. Quindi anche a livello di utenza, si richiederebbe al fruitore
del software di selezionare i valori di interesse con una certa precisione, cosa che non
richiede la STANDARD_HOUGH. Inoltre, questo metodo è sensibile al rumore se si
imposta un basso valore di threshold per avere più segmenti o un eccessivo valore di
maxLineGap per includere anche alcune linee che altrimenti risulterebbero spezzate,
si rischia di includere dei segmenti che non vogliamo o addirittura dei falsi segmenti.
Di seguito si possono vedere i vari casi per diversi valori di soglia e gap.
Fig. 2.9 Figura con parametro di voting 20, Fig. 2.10 Figura con parametro di voting 100,
tenendo fisso l a100 e g a 5. tenendo fisso l a100 e g a 5.
Fig. 2.11 Figura con parametro di gap 5, Fig. 2.12 Figura con parametro di gap 10,
tenendo fisso l a 100 e v a 50. tenendo fisso l a 100 e v a 50.
Fig. 2.13 Figura con parametro di length 20, Fig. 2.14 Figura con parametro di length 20,
gap 5 e voting 50. gap 15 e voting 50.
Come si può notare dalla figura 2.13 una lunghezza minima troppo piccola porta ad
un eccessivo numero di segmenti e pure a parecchi errori come segmenti con
inclinazione di 45° rispetto all’orizzontale sulle assi della casa o come quelli rilevati
per le foglie. Riducendo il gap, come in figura 2.11, si otterranno decisamente meno
segmenti ma molti non voluti. In più, come si può notare, a meno di settare
opportunamente i parametri, non si ottiene una gran quantità di linee.
Per questo motivo si è optato per la ricerca delle linee tramite la trasformata di
HOUGH_STANDARD che richiede un minor numero di parametri e in uscita dà un
vettore a due elementi. Per questo comando si devono impostare la distance e l’angle
resolution, in termini di ρ e θ, per definire la risoluzione dell’accumulatore che è la
zona, nel piano dei parametri, dove si accumulano le intersezioni fra curve che
individuano la presenza di una linea.
Solitamente per tale parametro si mette il valore di 1 pixel per la distance e di 𝜋/180
per l’angle resolution. Un altro parametro richiesto è la threshold per l’accumulatore,
ovvero vengono visualizzate solo le linee che ottengono abbastanza voti. Ma con un
valore di 150 standard si riesce a coprire bene le varie casistiche.
E il risultato sarà come quello in figura 2.15, dove sono rappresentate 15 linee:
Fig. 2.15 Rappresentazione delle linee tramite HOUGH_STANDARD
Tra queste due rappresentazioni, HOUGH_PROBABILISTIC e
HOUGH_STANDARD, si è scelto quindi di utilizzare la seconda in quanto meno
legata ad impostazioni da settare da parte dell’utente e perché fornisce linee infinite,
che sono più utili in vista dell’obiettivo di determinazione del punto di fuga per il
calcolo della prospettiva. Interessante poteva essere l’utilizzo dei segmenti, con la
trasformata HOUGH_PROBABILISTIC, per calcolare le distanze o le lunghezze di
alcuni contorni, in quanto in uscita venivano fornite le coordinate di inizio e fine dei
segmenti. Il problema è che gli stessi segmenti rimanevano vincolati a quali la
trasformata riuscisse ad estrarre.
2.4 Confronto trasformata di Hough con i due operatori: Sobel e
Canny
Nelle figure seguenti ci saranno alcune foto con le linee trovate tramite la trasformata
HOUGH_STANDARD con i due operatori per fare un confronto tra i due metodi. Su
tutte le immagini si sono estratte 15 linee.
Fig. 2.16 Nell’immagine a sinistra, in rosso, le linee estratte tramite la trasformata di Hough a
seguito dell’operatore Canny; a destra, in blu, le linee estratte a seguito dell’operatore Sobel
Fig. 2.17 Nell’immagine a sinistra, in rosso, le linee estratte tramite la trasformata di Hough a
seguito dell’operatore Canny; a destra, in blu, le linee estratte a seguito dell’operatore Sobel
Fig. 2.18 Nell’immagine a sinistra, in rosso, le linee estratte tramite la trasformata di Hough a
seguito dell’operatore Canny; a destra, in blu, le linee estratte a seguito dell’operatore Sobel
Come si può notare da questi tre esempi non vi sono molte differenze fra i due
metodi, se non una maggiore variabilità direzionale con quello che utilizza
l’operatore Canny. Infatti, già dalla prima immagine si nota che le linee rosse
individuano sia le assi della facciata principale ma anche quelle della parte lunga
della casa oltre alle colonne e al tetto, mentre le linee blu, associate all’operatore di
Sobel, individuano quasi tutte unicamente le assi della facciata principale, andando a
perdere l’informazione nelle altre direzioni. Pertanto, da questi esempi e considerate
le problematiche maggiori per impostare un valore di soglia corretto, viste al
paragrafo precedente, si è preferito utilizzare l’operatore di Canny come base per la
trasformata di Hough, tenendo comunque disponibile, come ulteriore opzione per una
valutazione di linee in più, l’operatore Sobel.
Capitolo 3
Intersezione delle rette e stima dei punti di fuga
In questo capitolo, dopo aver individuato le linee presenti nell’immagine, si prosegue
con la ricerca dei punti d’intersezione fra le suddette. Questo passaggio è intermedio
per la ricerca, tramite algoritmo k-medoids, di cui si parlerà nel capitolo seguente,
delle zone a maggior densità di punti d’intersezione. Ciò sarà utile per determinare i
tre punti di fuga, verso cui le rette convergono, e quindi le tre direzioni principali, al
fine di definire le reali dimensioni di un oggetto in un’immagine, estrapolandolo dalla
prospettiva in cui è costretto.
3.1 Track-bar
Prima di enunciare il metodo, utilizzato per individuare i punti d’incrocio fra le linee,
si introduce brevemente il concetto di track-bar, che serve a determinare la quantità di
rette che si vogliono trovare. Si è deciso di far scegliere all’utente il numero di linee
da individuare nell’immagine e per far questo si è introdotta un’interfaccia grafica
(GUI). La libreria OpenCV non offre molte funzionalità d’interfaccia utente e la più
immediata, senza dover inserire dati, è risultata essere la track-bar, che permette di
selezionare la quantità voluta in un intervallo di valori definito dal programmatore sul
codice. Cambiando la posizione sulla track-bar, il valore della variabile intera cambia
e usando quel nuovo valore andremo a variare una proprietà dell’immagine.
Nel nostro caso la scelta dell’utente determinerà la quantità di linee che l’algoritmo
dovrà trovare e, di conseguenza, il numero di confronti per trovare tutti i punti
d’intersezione con le linee appena trovate.
In figura 4.1 un esempio di utilizzo della track-bar, dove si è preimpostato un valore
di partenza di 5 linee:
Fig. 3.1 A sinistra immagine con 5 linee impostate già in partenza, a destra con 25.
Introdotta la track-bar, utile al fine di determinare il numero di linee che si devono
trovare, si può tornare a parlare del metodo utilizzato per la ricerca dei punti in
comune fra le linee trovate.
3.2 Intersezione fra linee
Il metodo che si utilizza per trovare l’intersezione fra due linee è quello algebrico del
sistema fra due rette r e s:
𝑦 = 𝑚 𝑥 + 𝑐
𝑦 = 𝑚 𝑥 + 𝑐
Andando a risolvere col metodo del confronto:
m₁x+c₁=m₂x+c₂;
quindi:
x= (c₂-c₁) / (m₁-m₂) ;
y = m₁ * (c₂-c₁) / (m₁-m₂) + c₁
Individueremo così tutti i punti di intersezione fra le linee trovate nella foto, la
maggior parte dei quali saranno fuori immagine. Risulta quindi utile riportare le
coordinate dei punti di incrocio sul terminale in modo da avere una chiara idea della
percentuale di punti presenti al di fuori dell’immagine. Si tratta di rette idealmente
infinite, nella realtà soggette alla lunghezza massima consentita dal calcolatore e
quindi trattabili per un confronto punto a punto per determinare dove le x e y delle
due rette coincidono.
3.3 Tempistica di calcolo e complessità dell’algoritmo
A livello di codice il tutto è strutturato con due cicli for. Uno serve a trovare le linee
presenti nell’immagine in quantità richiesta dall’utente, mentre l’altro esegue il
confronto a coppie, punto a punto, fra la prima linea con la seconda, la prima con la
terza e così via fino a esaurimento linee. Il ciclo riparte poi con la seconda linea che
confronta con la prima e così via per un totale di Nx(N-1)/2 confronti, dove N sta per
la quantità di linee inserite dall’utente.
Con questa tecnica vi è una problematica di cui si deve tenere conto: il denominatore
a zero, nel caso di rette parallele; e un minimo di lag in uscita per eseguire il ciclo per
il confronto fra le linee, per trovare punti d’incrocio, pari a Nx(N-1)/2 volte.
Per ovviare alla prima problematica, che porterebbe inevitabilmente ad un errore a
runtime, con conseguente blocco del programma, basta gestire l’eccezione che
sarebbe il caso in cui m1 = m2, ovvero le rette con coefficiente angolare identico e
quindi parallele. Perciò individuando quest’eccezione ed andandola a eliminare dalla
soluzione non si perderà nessuna informazione utile, in quanto due rette parallele non
si intersecano mai e quindi non avranno punti in comune da tenere in considerazione.
Per quanto riguarda la tempistica, seppure il doppio ciclo introduca tempi di calcolo
maggiori, si deve tenere conto che normalmente bastano quindici/venti linee per una
sufficiente densità di punti d’intersezione e perciò saranno richiesti 105 /190
confronti che, per un normale calcolatore, non sono eccessivi. E le tempistiche di
calcolo varieranno circa da 1,7 secondi per 15 linee a 1,9 secondi per 20 linee.
Fig. 3.2 Confronto intersezioni utilizzando Canny (a sinistra) e Sobel (a destra)
Fig. 3.3 Confronto intersezioni utilizzando Canny (a sinistra) e Sobel (a destra)
Una volta trovati i punti d’intersezione, si inseriscono le rispettive coordinate in un
vettore, che sarà la base di partenza per l’algoritmo di clustering.
3.4 Tecniche di clustering
Una volta trovati tutti i punti di intersezione fra le rette presenti nell’immagine, si
prosegue nella ricerca delle zone con una maggiore densità di punti. Lo scopo di tale
ricerca è l’individuazione delle tre direzioni principali di convergenza delle linee per
trovare i punti di fuga dell’immagine. Per fare questo si utilizzano degli algoritmi di
clustering, dove il clustering consiste nel raggruppare oggetti in classi omogenee. Un
cluster è un insieme di oggetti che presentano tra loro delle similarità, mentre per
contro presentano dissimilarità con oggetti in altri cluster. Come input nell’algoritmo
verrà dato un certo numero di elementi, che poi saranno suddivisi in base alle loro
similarità. In output avremo invece un certo numero di cluster, trovati dall’algoritmo.
In molti approcci, come pure nel nostro, questa similarità è concepita in termini di
distanza in uno spazio multidimensionale.
Vi sono varie tecniche di clustering, inizialmente suddivise in metodi aggregativi o
bottom-up e metodi divisivi o top-down. Nel primo caso si considera ogni singolo
dato come un cluster a sé e a successive iterazioni si raggruppa in base alla
somiglianza agli altri cluster; mentre il secondo considera inizialmente l’insieme dei
dati come un unico cluster e per successive iterazioni e confronti, li divide in un
numero minore di cluster.
Inoltre, vi sono altre due classificazioni importanti [3] in base all’algoritmo che si
vuole utilizzare: clustering partizionale e clustering gerarchico. Il primo definisce
l’appartenenza ad un gruppo in base alla distanza da un punto rappresentativo del
cluster (centroide, medioide, ecc…), dopo aver prefissato il numero di gruppi della
partizione. L’algoritmo gerarchico invece costruisce una gerarchia di partizioni
caratterizzata da un numero crescente o decrescente di gruppi. Da queste due
ripartizioni la scelta è ricaduta sull’algoritmo partizionale in quanto fin dall’inizio
sappiamo esattamente di quante direzioni abbiamo bisogno, ovvero tre, per poi
andare a calcolare la prospettiva.
3.5 Clustering partizionale
Il procedimento per il clustering partizionale prevede i seguenti passaggi:
inizialmente si suddivide l’insieme dei dati in K cluster e ad ognuno di essi si
assegnano degli elementi scelti casualmente. Dopodiché si vanno a calcolare i
centroidi di ciascun cluster:
𝑀 = ∑ 𝑥
dove Mk è il centroide per il cluster K, nk è il numero di elementi del cluster K e xik è
l’i-esimo elemento del cluster.
Il centroide è un punto appartenente allo spazio che media le distanze tra tutti i dati
appartenenti al cluster ad esso associato. Rappresenta quindi una sorta di baricentro
del cluster ed in generale, proprio per le sue caratteristiche, non è uno dei punti del
dataset. I centroidi vengono scelti casualmente e di solito hanno una certa distanza
l’uno dall’altro per fare in modo che l’algoritmo converga.
Si calcola poi la distanza degli elementi del cluster dal centroide e in base a quello si
valuta l’errore quadratico medio tramite:
𝑒 = (𝑥 − 𝑀 )
con ek errore quadratico medio per il cluster K. Questo serve a valutare gli errori di
tutti i cluster e sarà il parametro da minimizzare nelle varie iterazioni dell’algoritmo.
A questo punto, calcolato l’errore, si riassegnano gli elementi del campione in base al
centroide più vicino e si ripetono i passaggi finché non si raggiunge il valore minimo
desiderato dell’errore oppure finché i membri del cluster non si stabilizzano.
3.6 Confronto fra algoritmi
Tra questi algoritmi i principali sono il k-means, il fuzzy c-means e il k-medoids. I
primi due, anche se con implementazioni completamente diverse, portano a risultati e
problematiche molto simili. Entrambi scelgono inizialmente in modo casuale i dati (il
primo) e i coefficienti (il secondo) da assegnare ad ogni cluster ed entrambi cercano
di minimizzare l’errore quadratico medio di iterazione in iterazione. Il problema di
tutti e due i metodi è dovuto proprio alla scelta casuale iniziale dei dati che potrebbe
far convergere l’algoritmo ad un minimo locale e non assoluto. Inoltre, nel caso del
metodo fuzzy, il risultato dipenderà anche dalla scelta iniziale dei pesi. Risultati
migliori vengono invece dal metodo k-medoids in quanto, a differenza del k-means,
esso minimizza la somma delle dissimilarità tra punti in un cluster e un punto
indicato come centro di quel cluster. Infatti, al primo passaggio, l’algoritmo k-
medoids sceglie k punti arbitrari come punti centrali del cluster. Sebbene sulla carta il
k-medoids sia più robusto al rumore e più preciso in presenza di valori anomali, in
quanto minimizza la distanza dal centro, nel codice abbiamo implementato il k-
means. Questa scelta si è fatta perché la libreria OpenCV implementa già un metodo
k-means e questo algoritmo dà risultati più che soddisfacenti per la ricerca dei tre
punti di fuga, anche perché nel nostro caso spesso i valori anomali rappresentano
quelli di interesse.
3.7 K-means
Il k-means si basa sui cosiddetti centroidi. Questa tecnica raggruppa il set di dati in k
cluster diversi con un numero quasi uguale di punti. Dato un insieme di oggetti (x1,
x2, ..., xn), dove ognuno è un vettore reale bi-dimensionale, l’algoritmo di clustering
k-means ripartisce gli n oggetti in k ≤ n insiemi S = {S1, S2, ..., Sk} così da
minimizzare la varianza. In pratica l’obiettivo è trovare:
arg min ‖𝑥 − 𝜇 ‖
∈
In termini di codice, l’algoritmo darà un vettore in uscita contenente le coordinate dei
punti su cui convergono i tre cluster.
Fig. 3.4 Distanza di un punto x dai tre centroidi individuati.
3.8 K-medoids
Il k-medoids parte con una selezione arbitraria di k oggetti, come punti medoids, da
un insieme di n oggetti e associa ogni elemento nel dato insieme al più simile
medoid, dove la similarità è data dalla funzione di costo che è definita
usando distanze come la distanza di Manhattan, nel nostro caso.
La distanza di Manhattan è la distanza tra due punti è la somma del valore assoluto
delle differenze delle loro coordinate.
Seleziona poi in modo casuale un elemento non medoid O’, calcola il costo
totale Si, che è la somma dei costi dei singoli elementi dal corrispondente medoid, nel
caso del medoid iniziale e il costo totale Sf nel caso del medoid O’ e ne calcola la
differenza S=Sf-Si. Se S<0 allora viene scambiato il medoid iniziale con il nuovo e si
ripetono i vari passi sino a quando si hanno cambiamenti nell'insieme dei medoid.
La bontà del clustering può essere negativamente influenzata dalla presenza di outlier
che tendono a spostare il centroide dei cluster al fine di ridurre l’aumento dell’SSE
determinato indotto dall’outlier. Dato che la somma del quadrato degli errori è un
quadrato di una distanza, i punti molto lontani incidono pesantemente sul suo valore.
Gli outlier se identificati possono essere eliminati in fase di preprocessing.
In figura degli esempi di cluster trovati; le linee azzurre collegano il centro
dell’immagine ai punti trovati dall’algoritmo così da dare un’idea visiva della
direzione trovata.
Fig. 3.5 Algoritmo di k-means nel caso di operatore di Sobel con 30 linee trovate
Fig. 3.6 Algoritmo k-means nel caso di operatore Canny con 25 linee trovate
Fig. 3.7 Confronto k-means tra operatore Canny (a sinistra) e Sobel (a destra) con 15 linee trovate
Fig. 3.8 Confronto k-means tra operatore Canny (a sinistra) e Sobel (a destra) con 25 linee trovate
Fig. 3.9 Algoritmo di k-means con operatore Sobel con 1) 15 linee, 2) 23 linee e 3) 27 linee.
Nell’ultima immagine si sono paragonate le tre diverse ricerche con l’algoritmo k-
means con una quantità di linee, e quindi intersezioni, man mano crescente. Come si
può vedere un valore intorno alle 20 linee trovate può risultare sufficiente per una
stabilizzazione dell’algoritmo.
Capitolo 4
Validazione Sperimentale
In questo capitolo si testa il programma secondo alcuni parametri per rilevarne le
problematiche e i punti di forza dell’algoritmo in base ai due operatori (Sobel e
Canny).
4.1 Parametri di verifica
Si è utilizzata una tabellina, inserita qui sotto, per valutare quattro casi su sei
immagini in modo da avere risultati su differenti tipologie di foto. La tabella è stata
poi suddivisa in due righe: una riservata ai risultati trovati per le linee ricavate usando
Sobel e l’altra per quelle ricavate usando Canny. Il software parte da un valore fisso
sullo slider pari a otto linee trovate.
Le quattro colonne sono suddivise in questo modo:
Colonna A: si devono contare quante linee concorrono a trovare un punto di fuga e
riportarne il numero.
Colonna B: si aumenta il numero delle linee da trovare, tramite slide, finché non si
trova una buona calibrazione fra linee per ogni direzione che concorre a trovare il
punto di fuga.
Colonna C: si devono contare quante linee azzurre si dirigono verso un corretto punto
di fuga.
Colonna D: si deve verificare se, rimuovendo determinate linee, la linea azzurra
cambia direzione e concorre verso un punto di fuga corretto.
Sample #1 A) Numero di linee che
concorrono ad un
punto di fuga (slider,
“Qt: 8”)
B) Variare lo slider per
avere almeno una linea
per direzione voluta.
C) Numero di linee
azzurre che vanno
verso un punto di fuga.
D) Numero di linee
azzurre che vanno
verso un punto di
fuga, dopo aver
rimosso alcune
linee trovate.
Blue-line image
(Sobel)
8 27 1 1
Red-line image
(Canny)
5 8 2 3
Sample #2 A) Numero di linee che
concorrono ad un
punto di fuga (slider,
“Qt: 8”)
B) Variare lo slider per
avere almeno una linea
per direzione voluta.
C) Numero di line
azzurre che vanno
verso un punto di fuga.
D) Numero di linee
azzurre che vanno
verso un punto di
fuga, dopo aver
rimosso alcune
linee trovate.
Blue-line image
(Sobel)
8 19 2 2
Red-line image
(Canny)
8 11 2 2
Sample #3 A) Numero di linee che
concorrono ad un
punto di fuga (slider,
“Qt: 8”)
B) Variare lo slider per
avere almeno una linea
per direzione voluta.
C) Numero di line
azzurre che vanno
verso un punto di fuga.
D) Numero di linee
azzurre che vanno
verso un punto di
fuga, dopo aver
rimosso alcune
linee trovate.
Blue-line image
(Sobel)
8 28 3 3
Red-line image
(Canny)
8 28 2 2
Sample #4 A) Numero di linee che
concorrono ad un
punto di fuga (slider,
“Qt: 8”)
B) Variare lo slider per
avere almeno una linea
per direzione voluta.
C) Numero di line
azzurre che vanno
verso un punto di fuga.
D) Numero di linee
azzurre che vanno
verso un punto di
fuga, dopo aver
rimosso alcune
linee trovate.
Blue-line image
(Sobel)
8 A 28 ne ha 2 2 2
Red-line image
(Canny)
8 Non riesce 2 2
Sample #5 A) Numero di linee che
concorrono ad un
punto di fuga (slider,
“Qt: 8”)
B) Variare lo slider per
avere almeno una linea
per direzione voluta.
C) Numero di line
azzurre che vanno
verso un punto di fuga.
D) Numero di linee
azzurre che vanno
verso un punto di
fuga, dopo aver
rimosso alcune
linee trovate.
Blue-line image
(Sobel)
8 Non riesce 2 2
Red-line image
(Canny)
8 Non riesce 2 2
Sample #6 A) Numero di linee che
concorrono ad un
punto di fuga (slider,
“Qt: 8”)
B) Variare lo slider per
avere almeno una linea
per direzione voluta.
C) Numero di line
azzurre che vanno
verso un punto di fuga.
D) Numero di linee
azzurre che vanno
verso un punto di
fuga, dopo aver
rimosso alcune
linee trovate.
Blue-line image
(Sobel)
8 20 2 2
Red-line image
(Canny)
8 20 2 3
Questo test è stato mandato a cinque persone differenti e i risultati in tabella sono dati
da una media delle risposte. In realtà il programma trova sempre le stesse linee quindi
in questo caso varia solo la modalità con cui l’utente percepisce e calcola il punto di
fuga di un’immagine.
Come si può notare dalle tabelle entrambi i metodi riescono ad individuare molto
bene e già con solo otto linee di partenza, due delle tre direzioni preferenziali. Il
problema è trovare la terza direzione, difatti il programma o non riesce ad individuare
nessuna linea oppure ne trova poche. Poiché il metodo di individuazione dei tre punti
di fuga è basato sulla ricerca delle tre zone con maggior densità di punti
d’intersezione fra le linee trovate, il fatto di individuare solamente una o due linee
nella terza direzione non porta ad un numero sufficientemente alto di punti da creare
un cluster. Quello che succede è che l’algoritmo calcola una media fra quei punti ed
altri trovati dentro o fuori dell’immagine, andando a sfalsare il terzo cluster. La
soluzione, di eliminare alcune linee non volute, aiuta in parte il programma a
ricalibrare correttamente la ricerca di cluster ma sarebbe d’aiuto anche eliminare
qualche linea in eccesso nelle due direzioni già trovate. Un’altra cosa che si nota è
che in generale bisogna aumentare ad almeno venti il valore dello slider per avere
almeno una linea nelle tre direzioni volute; conviene quindi partire da questo numero
di base e andare poi a sfoltire le linee non desiderate o quelle in eccesso. Un’ulteriore
valutazione che si può fare è che le linee rosse individuano più velocemente i punti di
fuga corretti. Sarebbe interessante aggiungere in seguito due punti nella colonna della
tabella; ovvero quante linee della direzione corretta sia necessario togliere e se
andando a modificare i filtri e introducendo uno slider per dare la possibilità
all’utente di variarli, si nota qualche cambiamento nell’individuazione delle linee. Si
potrebbe anche aggiungere una riga in cui si valuta il risultato su un’immagine in cui
il programma utilizza sia Sobel che Canny per individuare le linee.
Conclusioni
Dalla validazione sperimentale si evince che il metodo basato sulla trasformata di
Canny dà maggiore informazione direzionale, si trovano più linee con differente
direzione, mentre quello basato su Sobel spesso riesce ad individuare solo due
direzioni preferenziali su tre. Purtroppo, anche utilizzando la trasformata di Hough,
basata su Canny, il più delle volte non si riescono ad individuare i punti di fuga
corretti.
Questo è dovuto in parte alla trasformata che non individua abbastanza linee con
diversa direzione ed in parte alla scelta di usare il metodo dell’intersezione per
individuare le tre direzioni principali delle linee. Infatti, per immagini con poco
rumore visivo (case, uffici) non ci sono problemi perché la trasformata di Hough
individua correttamente le linee e sono tutte quelle che concorrono verso uno dei tre
punti di fuga, anche se spesso trova due direzioni su tre. Ma se vi sono elementi di
disturbo come alberi o mobilio allora iniziano le problematiche. Su rami e arbusti
qualcosa si può fare andando a lavorare con i filtri per cercare di sfocare un poco
l’immagine e quindi non far percepire i rami come bordi da includere nella ricerca
delle linee. Per i mobili o gli arredamenti interni il problema è diverso perché spesso
si tratta di pezzi squadrati e ben a fuoco nell’immagine e che in alcuni casi possono
concorrere alla corretta individuazione del punto di fuga. Si è pensato allora di
utilizzare l’informazione fornita dal colore ma spesso l’elemento di disturbo è dello
stesso colore delle pareti che ci interessano a livello di linee, oppure è un blocco di
colore diverso ma non lo si può escludere a priori non sapendo se è utile ai fini della
ricerca o meno. La soluzione adottata è stata quella di far scegliere all’utente quale
linea tenere e quale togliere ai fini dell’individuazione di un punto di fuga. L’utente
potrà quindi eliminare le linee non volute e il software eseguirà nell’immediato una
ricalibrazione con le linee rimaste. Se poi se ne vogliono aggiungere altre, il
programma, nel ricalcolo, non reinserirà quelle già eliminate.
Per quanto riguarda la scarsa scelta di linee da tutte e tre le direzioni, si è pensato di
inglobare in un’unica ricerca le direzioni trovate tramite Sobel con quelle trovate
tramite Canny, escludendo i doppioni, ma per una questione di tempo non si è riusciti
ad implementarlo sul software. Si è visto che la possibilità di scartare le linee non
volute migliora sensibilmente la capacità di trovare il punto di fuga, mentre sarebbe
d’aiuto una maggiore variabilità di linee individuate per avere un cluster più corposo
per alcune direzioni. Per fare questo un’altra soluzione potrebbe essere quella di
coadiuvare la ricerca stessa con un algoritmo genetico oppure con una rete neurale.
Appendice
Strumenti
In questo capitolo vengono introdotte brevemente gli strumenti utilizzati per scrivere
il codice.
I OpenCV
OpenCV (Open Source Computer Vision Library) è una libreria software
multipiattaforma nell’ambito della visione artificiale in tempo reale. Si è scelto di
utilizzarla poiché principalmente è scritta in C++ e la sua prima interfaccia è il C++,
linguaggio con cui è scritto il software della tesi. Inoltre, offre una struttura comune
su cui gli sviluppatori da cui possono partire, in modo tale che il codice sia più
leggibile e trasferibile.
II GitHub
GitHub, Inc. è un provider di hosting Internet basato su cloud per lo sviluppo di
software e il controllo della versione tramite Git, uno specifico sistema di controllo
versioni open-source creato da Linus Torvalds nel 2005.
In particolare, Git è un sistema di controllo versioni distribuito, il che significa che
l’intero codice base e la cronologia sono disponibili sul computer di ogni
sviluppatore, il che permette di creare facilmente ramificazioni e fusioni.
Il controllo delle versioni aiuta gli sviluppatori a tracciare e gestire le modifiche al
codice di un progetto software. Invece, il controllo delle versioni permette agli
sviluppatori di lavorare in sicurezza attraverso il branching (ramificazione) e
il merging (fusione). Con il branching, uno sviluppatore duplica parte del codice
sorgente (chiamato repository). Lo sviluppatore può quindi apportare in modo sicuro
modifiche a quella parte del codice senza influenzare il resto del progetto.
III Visual Studio
Microsoft Visual Studio (o più comunemente Visual Studio) è un ambiente di
sviluppo integrato sviluppato da Microsoft per lo sviluppo di applicazioni per tablet,
smartphone e computer, oltre a siti e servizi web. Come il suo predecessore, Visual
Studio integra la tecnologia IntelliSense che permette di correggere eventuali errori
sintattici, e anche alcuni logici, senza compilare l'applicazione, possiede un debugger
interno per il rilevamento e la correzione degli errori logici nel codice in runtime e
fornisce diversi strumenti per l'analisi delle prestazioni. Il futuro delle applicazioni
sarà basato interamente sull'integrazione tra i diversi dispostivi, mobile e fissi. I
programmatori dovranno cambiare l'approccio allo sviluppo delle app: il layout dovrà
adattarsi alla perfezione sia sul tablet sia su computer o smart Tv.
Microsoft Visual Studio è tra i programmi più utilizzati per sviluppare applicazioni
(code editor) e nelle ultime due versioni permette di creare applicazioni per Windows
8.1 (computer, tablet o smartphone) scrivendo il codice una sola volta.
Bibliografia
[1] Rafael C. Gonzalez - Richard E. Woods, Digital image processing (third edition),
Prentice Hall, 2008.
[2] Richard O.Duda and Peter E.Hart “Use of the Hough transformation to detect
lines and curves in pictures”, January 1972.
[2] Florian Kluger1 - Hanno Ackermann1 - Michael Ying Yang2 - Bodo
Rosenhahn1, “Deep Learning for Vanishing Point Detection Using an Inverse
Gnomonic Projection”, Leibniz Universit ̈at Hannover - University of Twente
[3] Heechul Jung – Junggon Min – Junmo Kim, “An efficient lane detection
algorithm for lane departure detection”, June 2013, Conference: Intelligent Vehicles
Symposium (IV), 2013 IEEE
[4] A. Rezzani, “Business Intelligence. Processi, metodi, utilizzo in azienda”,
APOGEO, 2012
[5] Mehmed Kantardzic “Data Mining: Concepts, Models, Methods, and
Algorithms”, John Wiley & Sons, 2003
[6] Jiawei Han, Micheline Kamber, “Data Mining:Concepts and Techniques” Second
Edition, Morgan Kaufmann Publishers, 2006
[7] https://docs.opencv.org/3.4.8/d9/df8/tutorial_root.html
[8] MacQueen J.B., Some Methods for Classification Analysis of Multivariate
Observations, Proceedings of 5-th Berkeley Symposium on Mathematical Statistics
and Probability, Berkeley, 1967, University of California Press, 1:281-297.
[9] Roiger R.J., Geatz M.W., Introduzione al Data Mining, McGraw-Hill, 2004.
[10] Tan P., Steinbach M., Kumar V., Introduction to Data Mining, Pearson Addison
Wesley, 2005.

More Related Content

What's hot

PPT s04-machine vision-s2
PPT s04-machine vision-s2PPT s04-machine vision-s2
PPT s04-machine vision-s2
Binus Online Learning
 
Block Matching Project
Block Matching ProjectBlock Matching Project
Block Matching Project
dswazalwar
 
Report
ReportReport
Basics of edge detection and forier transform
Basics of edge detection and forier transformBasics of edge detection and forier transform
Basics of edge detection and forier transform
Simranjit Singh
 
Image feature extraction
Image feature extractionImage feature extraction
Image feature extraction
Rushin Shah
 
Lect 02 second portion
Lect 02  second portionLect 02  second portion
Lect 02 second portion
Moe Moe Myint
 
COM2304: Digital Image Fundamentals - I
COM2304: Digital Image Fundamentals - I COM2304: Digital Image Fundamentals - I
COM2304: Digital Image Fundamentals - I
Hemantha Kulathilake
 
Adaptive Median Filters
Adaptive Median FiltersAdaptive Median Filters
Adaptive Median Filters
Amnaakhaan
 
Edges and lines
Edges and linesEdges and lines
Edges and lines
Rushil Anirudh
 
Chapter10 image segmentation
Chapter10 image segmentationChapter10 image segmentation
Chapter10 image segmentation
asodariyabhavesh
 
Introductory Digital Image Processing using Matlab, IIT Roorkee
Introductory Digital Image Processing using Matlab, IIT RoorkeeIntroductory Digital Image Processing using Matlab, IIT Roorkee
Introductory Digital Image Processing using Matlab, IIT Roorkee
Vinayak Sahai
 
3 intensity transformations and spatial filtering slides
3 intensity transformations and spatial filtering slides3 intensity transformations and spatial filtering slides
3 intensity transformations and spatial filtering slides
BHAGYAPRASADBUGGE
 
Chapter 1 introduction (Image Processing)
Chapter 1 introduction (Image Processing)Chapter 1 introduction (Image Processing)
Chapter 1 introduction (Image Processing)
Varun Ojha
 
Edge linking in image processing
Edge linking in image processingEdge linking in image processing
Edge linking in image processing
VARUN KUMAR
 
Image colorization
Image colorizationImage colorization
Image colorization
Pankti Fadia
 
Edge Detection
Edge Detection Edge Detection
Edge Detection
Jakir Hossain
 
04 image enhancement edge detection
04 image enhancement edge detection04 image enhancement edge detection
04 image enhancement edge detection
Rumah Belajar
 
Denoising and Edge Detection Using Sobelmethod
Denoising and Edge Detection Using SobelmethodDenoising and Edge Detection Using Sobelmethod
Denoising and Edge Detection Using Sobelmethod
IJMER
 
Digital Image Fundamentals
Digital Image FundamentalsDigital Image Fundamentals
Digital Image Fundamentals
A B Shinde
 
Image analysis using python
Image analysis using pythonImage analysis using python
Image analysis using python
Jerlyn Manohar
 

What's hot (20)

PPT s04-machine vision-s2
PPT s04-machine vision-s2PPT s04-machine vision-s2
PPT s04-machine vision-s2
 
Block Matching Project
Block Matching ProjectBlock Matching Project
Block Matching Project
 
Report
ReportReport
Report
 
Basics of edge detection and forier transform
Basics of edge detection and forier transformBasics of edge detection and forier transform
Basics of edge detection and forier transform
 
Image feature extraction
Image feature extractionImage feature extraction
Image feature extraction
 
Lect 02 second portion
Lect 02  second portionLect 02  second portion
Lect 02 second portion
 
COM2304: Digital Image Fundamentals - I
COM2304: Digital Image Fundamentals - I COM2304: Digital Image Fundamentals - I
COM2304: Digital Image Fundamentals - I
 
Adaptive Median Filters
Adaptive Median FiltersAdaptive Median Filters
Adaptive Median Filters
 
Edges and lines
Edges and linesEdges and lines
Edges and lines
 
Chapter10 image segmentation
Chapter10 image segmentationChapter10 image segmentation
Chapter10 image segmentation
 
Introductory Digital Image Processing using Matlab, IIT Roorkee
Introductory Digital Image Processing using Matlab, IIT RoorkeeIntroductory Digital Image Processing using Matlab, IIT Roorkee
Introductory Digital Image Processing using Matlab, IIT Roorkee
 
3 intensity transformations and spatial filtering slides
3 intensity transformations and spatial filtering slides3 intensity transformations and spatial filtering slides
3 intensity transformations and spatial filtering slides
 
Chapter 1 introduction (Image Processing)
Chapter 1 introduction (Image Processing)Chapter 1 introduction (Image Processing)
Chapter 1 introduction (Image Processing)
 
Edge linking in image processing
Edge linking in image processingEdge linking in image processing
Edge linking in image processing
 
Image colorization
Image colorizationImage colorization
Image colorization
 
Edge Detection
Edge Detection Edge Detection
Edge Detection
 
04 image enhancement edge detection
04 image enhancement edge detection04 image enhancement edge detection
04 image enhancement edge detection
 
Denoising and Edge Detection Using Sobelmethod
Denoising and Edge Detection Using SobelmethodDenoising and Edge Detection Using Sobelmethod
Denoising and Edge Detection Using Sobelmethod
 
Digital Image Fundamentals
Digital Image FundamentalsDigital Image Fundamentals
Digital Image Fundamentals
 
Image analysis using python
Image analysis using pythonImage analysis using python
Image analysis using python
 

Similar to Estrazione automatica delle linee in un'immagine digitale

Hardware Unit for Edge Detection with Comparative Analysis of Different Edge ...
Hardware Unit for Edge Detection with Comparative Analysis of Different Edge ...Hardware Unit for Edge Detection with Comparative Analysis of Different Edge ...
Hardware Unit for Edge Detection with Comparative Analysis of Different Edge ...
paperpublications3
 
A PROJECT REPORT ON REMOVAL OF UNNECESSARY OBJECTS FROM PHOTOS USING MASKING
A PROJECT REPORT ON REMOVAL OF UNNECESSARY OBJECTS FROM PHOTOS USING MASKINGA PROJECT REPORT ON REMOVAL OF UNNECESSARY OBJECTS FROM PHOTOS USING MASKING
A PROJECT REPORT ON REMOVAL OF UNNECESSARY OBJECTS FROM PHOTOS USING MASKING
IRJET Journal
 
EDGE DETECTION
EDGE DETECTIONEDGE DETECTION
EDGE DETECTION
VIKAS SINGH BHADOURIA
 
mini prjt
mini prjtmini prjt
Log polar coordinates
Log polar coordinatesLog polar coordinates
Log polar coordinates
Oğul Göçmen
 
User Interactive Color Transformation between Images
User Interactive Color Transformation between ImagesUser Interactive Color Transformation between Images
User Interactive Color Transformation between Images
IJMER
 
Simple Pendulum Experiment and Automatic Survey Grading using Computer Vision
Simple Pendulum Experiment and Automatic Survey Grading using Computer VisionSimple Pendulum Experiment and Automatic Survey Grading using Computer Vision
Simple Pendulum Experiment and Automatic Survey Grading using Computer Vision
Anish Patel
 
IJIRMF202012032.pdf
IJIRMF202012032.pdfIJIRMF202012032.pdf
IJIRMF202012032.pdf
VaideshSiva1
 
ee8220_project_W2013_v5
ee8220_project_W2013_v5ee8220_project_W2013_v5
ee8220_project_W2013_v5
Farhad Gholami
 
Ijcatr04041016
Ijcatr04041016Ijcatr04041016
Ijcatr04041016
Editor IJCATR
 
Shi.pdf
Shi.pdfShi.pdf
IJCER (www.ijceronline.com) International Journal of computational Engineerin...
IJCER (www.ijceronline.com) International Journal of computational Engineerin...IJCER (www.ijceronline.com) International Journal of computational Engineerin...
IJCER (www.ijceronline.com) International Journal of computational Engineerin...
ijceronline
 
Paper on image processing
Paper on image processingPaper on image processing
Paper on image processing
Saloni Bhatia
 
Image Interpolation Techniques with Optical and Digital Zoom Concepts -semina...
Image Interpolation Techniques with Optical and Digital Zoom Concepts -semina...Image Interpolation Techniques with Optical and Digital Zoom Concepts -semina...
Image Interpolation Techniques with Optical and Digital Zoom Concepts -semina...
mmjalbiaty
 
I010634450
I010634450I010634450
I010634450
IOSR Journals
 
Performance of Efficient Closed-Form Solution to Comprehensive Frontier Exposure
Performance of Efficient Closed-Form Solution to Comprehensive Frontier ExposurePerformance of Efficient Closed-Form Solution to Comprehensive Frontier Exposure
Performance of Efficient Closed-Form Solution to Comprehensive Frontier Exposure
iosrjce
 
2-Dimensional Wavelet pre-processing to extract IC-Pin information for disarr...
2-Dimensional Wavelet pre-processing to extract IC-Pin information for disarr...2-Dimensional Wavelet pre-processing to extract IC-Pin information for disarr...
2-Dimensional Wavelet pre-processing to extract IC-Pin information for disarr...
IOSR Journals
 
Lec_2_Digital Image Fundamentals.pdf
Lec_2_Digital Image Fundamentals.pdfLec_2_Digital Image Fundamentals.pdf
Lec_2_Digital Image Fundamentals.pdf
nagwaAboElenein
 
A STUDY AND ANALYSIS OF DIFFERENT EDGE DETECTION TECHNIQUES
A STUDY AND ANALYSIS OF DIFFERENT EDGE DETECTION TECHNIQUESA STUDY AND ANALYSIS OF DIFFERENT EDGE DETECTION TECHNIQUES
A STUDY AND ANALYSIS OF DIFFERENT EDGE DETECTION TECHNIQUES
cscpconf
 
Fundamentals of image processing
Fundamentals of image processingFundamentals of image processing
Fundamentals of image processing
RoufulAlamBhat1
 

Similar to Estrazione automatica delle linee in un'immagine digitale (20)

Hardware Unit for Edge Detection with Comparative Analysis of Different Edge ...
Hardware Unit for Edge Detection with Comparative Analysis of Different Edge ...Hardware Unit for Edge Detection with Comparative Analysis of Different Edge ...
Hardware Unit for Edge Detection with Comparative Analysis of Different Edge ...
 
A PROJECT REPORT ON REMOVAL OF UNNECESSARY OBJECTS FROM PHOTOS USING MASKING
A PROJECT REPORT ON REMOVAL OF UNNECESSARY OBJECTS FROM PHOTOS USING MASKINGA PROJECT REPORT ON REMOVAL OF UNNECESSARY OBJECTS FROM PHOTOS USING MASKING
A PROJECT REPORT ON REMOVAL OF UNNECESSARY OBJECTS FROM PHOTOS USING MASKING
 
EDGE DETECTION
EDGE DETECTIONEDGE DETECTION
EDGE DETECTION
 
mini prjt
mini prjtmini prjt
mini prjt
 
Log polar coordinates
Log polar coordinatesLog polar coordinates
Log polar coordinates
 
User Interactive Color Transformation between Images
User Interactive Color Transformation between ImagesUser Interactive Color Transformation between Images
User Interactive Color Transformation between Images
 
Simple Pendulum Experiment and Automatic Survey Grading using Computer Vision
Simple Pendulum Experiment and Automatic Survey Grading using Computer VisionSimple Pendulum Experiment and Automatic Survey Grading using Computer Vision
Simple Pendulum Experiment and Automatic Survey Grading using Computer Vision
 
IJIRMF202012032.pdf
IJIRMF202012032.pdfIJIRMF202012032.pdf
IJIRMF202012032.pdf
 
ee8220_project_W2013_v5
ee8220_project_W2013_v5ee8220_project_W2013_v5
ee8220_project_W2013_v5
 
Ijcatr04041016
Ijcatr04041016Ijcatr04041016
Ijcatr04041016
 
Shi.pdf
Shi.pdfShi.pdf
Shi.pdf
 
IJCER (www.ijceronline.com) International Journal of computational Engineerin...
IJCER (www.ijceronline.com) International Journal of computational Engineerin...IJCER (www.ijceronline.com) International Journal of computational Engineerin...
IJCER (www.ijceronline.com) International Journal of computational Engineerin...
 
Paper on image processing
Paper on image processingPaper on image processing
Paper on image processing
 
Image Interpolation Techniques with Optical and Digital Zoom Concepts -semina...
Image Interpolation Techniques with Optical and Digital Zoom Concepts -semina...Image Interpolation Techniques with Optical and Digital Zoom Concepts -semina...
Image Interpolation Techniques with Optical and Digital Zoom Concepts -semina...
 
I010634450
I010634450I010634450
I010634450
 
Performance of Efficient Closed-Form Solution to Comprehensive Frontier Exposure
Performance of Efficient Closed-Form Solution to Comprehensive Frontier ExposurePerformance of Efficient Closed-Form Solution to Comprehensive Frontier Exposure
Performance of Efficient Closed-Form Solution to Comprehensive Frontier Exposure
 
2-Dimensional Wavelet pre-processing to extract IC-Pin information for disarr...
2-Dimensional Wavelet pre-processing to extract IC-Pin information for disarr...2-Dimensional Wavelet pre-processing to extract IC-Pin information for disarr...
2-Dimensional Wavelet pre-processing to extract IC-Pin information for disarr...
 
Lec_2_Digital Image Fundamentals.pdf
Lec_2_Digital Image Fundamentals.pdfLec_2_Digital Image Fundamentals.pdf
Lec_2_Digital Image Fundamentals.pdf
 
A STUDY AND ANALYSIS OF DIFFERENT EDGE DETECTION TECHNIQUES
A STUDY AND ANALYSIS OF DIFFERENT EDGE DETECTION TECHNIQUESA STUDY AND ANALYSIS OF DIFFERENT EDGE DETECTION TECHNIQUES
A STUDY AND ANALYSIS OF DIFFERENT EDGE DETECTION TECHNIQUES
 
Fundamentals of image processing
Fundamentals of image processingFundamentals of image processing
Fundamentals of image processing
 

Recently uploaded

CSM Cloud Service Management Presentarion
CSM Cloud Service Management PresentarionCSM Cloud Service Management Presentarion
CSM Cloud Service Management Presentarion
rpskprasana
 
哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样
哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样
哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样
insn4465
 
Advanced control scheme of doubly fed induction generator for wind turbine us...
Advanced control scheme of doubly fed induction generator for wind turbine us...Advanced control scheme of doubly fed induction generator for wind turbine us...
Advanced control scheme of doubly fed induction generator for wind turbine us...
IJECEIAES
 
Electric vehicle and photovoltaic advanced roles in enhancing the financial p...
Electric vehicle and photovoltaic advanced roles in enhancing the financial p...Electric vehicle and photovoltaic advanced roles in enhancing the financial p...
Electric vehicle and photovoltaic advanced roles in enhancing the financial p...
IJECEIAES
 
学校原版美国波士顿大学毕业证学历学位证书原版一模一样
学校原版美国波士顿大学毕业证学历学位证书原版一模一样学校原版美国波士顿大学毕业证学历学位证书原版一模一样
学校原版美国波士顿大学毕业证学历学位证书原版一模一样
171ticu
 
132/33KV substation case study Presentation
132/33KV substation case study Presentation132/33KV substation case study Presentation
132/33KV substation case study Presentation
kandramariana6
 
DEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODEL
DEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODELDEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODEL
DEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODEL
gerogepatton
 
Computational Engineering IITH Presentation
Computational Engineering IITH PresentationComputational Engineering IITH Presentation
Computational Engineering IITH Presentation
co23btech11018
 
New techniques for characterising damage in rock slopes.pdf
New techniques for characterising damage in rock slopes.pdfNew techniques for characterising damage in rock slopes.pdf
New techniques for characterising damage in rock slopes.pdf
wisnuprabawa3
 
Manufacturing Process of molasses based distillery ppt.pptx
Manufacturing Process of molasses based distillery ppt.pptxManufacturing Process of molasses based distillery ppt.pptx
Manufacturing Process of molasses based distillery ppt.pptx
Madan Karki
 
A review on techniques and modelling methodologies used for checking electrom...
A review on techniques and modelling methodologies used for checking electrom...A review on techniques and modelling methodologies used for checking electrom...
A review on techniques and modelling methodologies used for checking electrom...
nooriasukmaningtyas
 
ACEP Magazine edition 4th launched on 05.06.2024
ACEP Magazine edition 4th launched on 05.06.2024ACEP Magazine edition 4th launched on 05.06.2024
ACEP Magazine edition 4th launched on 05.06.2024
Rahul
 
2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf
2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf
2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf
Yasser Mahgoub
 
Unit-III-ELECTROCHEMICAL STORAGE DEVICES.ppt
Unit-III-ELECTROCHEMICAL STORAGE DEVICES.pptUnit-III-ELECTROCHEMICAL STORAGE DEVICES.ppt
Unit-III-ELECTROCHEMICAL STORAGE DEVICES.ppt
KrishnaveniKrishnara1
 
KuberTENes Birthday Bash Guadalajara - K8sGPT first impressions
KuberTENes Birthday Bash Guadalajara - K8sGPT first impressionsKuberTENes Birthday Bash Guadalajara - K8sGPT first impressions
KuberTENes Birthday Bash Guadalajara - K8sGPT first impressions
Victor Morales
 
Question paper of renewable energy sources
Question paper of renewable energy sourcesQuestion paper of renewable energy sources
Question paper of renewable energy sources
mahammadsalmanmech
 
官方认证美国密歇根州立大学毕业证学位证书原版一模一样
官方认证美国密歇根州立大学毕业证学位证书原版一模一样官方认证美国密歇根州立大学毕业证学位证书原版一模一样
官方认证美国密歇根州立大学毕业证学位证书原版一模一样
171ticu
 
The Python for beginners. This is an advance computer language.
The Python for beginners. This is an advance computer language.The Python for beginners. This is an advance computer language.
The Python for beginners. This is an advance computer language.
sachin chaurasia
 
Modelagem de um CSTR com reação endotermica.pdf
Modelagem de um CSTR com reação endotermica.pdfModelagem de um CSTR com reação endotermica.pdf
Modelagem de um CSTR com reação endotermica.pdf
camseq
 
Iron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdf
Iron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdfIron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdf
Iron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdf
RadiNasr
 

Recently uploaded (20)

CSM Cloud Service Management Presentarion
CSM Cloud Service Management PresentarionCSM Cloud Service Management Presentarion
CSM Cloud Service Management Presentarion
 
哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样
哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样
哪里办理(csu毕业证书)查尔斯特大学毕业证硕士学历原版一模一样
 
Advanced control scheme of doubly fed induction generator for wind turbine us...
Advanced control scheme of doubly fed induction generator for wind turbine us...Advanced control scheme of doubly fed induction generator for wind turbine us...
Advanced control scheme of doubly fed induction generator for wind turbine us...
 
Electric vehicle and photovoltaic advanced roles in enhancing the financial p...
Electric vehicle and photovoltaic advanced roles in enhancing the financial p...Electric vehicle and photovoltaic advanced roles in enhancing the financial p...
Electric vehicle and photovoltaic advanced roles in enhancing the financial p...
 
学校原版美国波士顿大学毕业证学历学位证书原版一模一样
学校原版美国波士顿大学毕业证学历学位证书原版一模一样学校原版美国波士顿大学毕业证学历学位证书原版一模一样
学校原版美国波士顿大学毕业证学历学位证书原版一模一样
 
132/33KV substation case study Presentation
132/33KV substation case study Presentation132/33KV substation case study Presentation
132/33KV substation case study Presentation
 
DEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODEL
DEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODELDEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODEL
DEEP LEARNING FOR SMART GRID INTRUSION DETECTION: A HYBRID CNN-LSTM-BASED MODEL
 
Computational Engineering IITH Presentation
Computational Engineering IITH PresentationComputational Engineering IITH Presentation
Computational Engineering IITH Presentation
 
New techniques for characterising damage in rock slopes.pdf
New techniques for characterising damage in rock slopes.pdfNew techniques for characterising damage in rock slopes.pdf
New techniques for characterising damage in rock slopes.pdf
 
Manufacturing Process of molasses based distillery ppt.pptx
Manufacturing Process of molasses based distillery ppt.pptxManufacturing Process of molasses based distillery ppt.pptx
Manufacturing Process of molasses based distillery ppt.pptx
 
A review on techniques and modelling methodologies used for checking electrom...
A review on techniques and modelling methodologies used for checking electrom...A review on techniques and modelling methodologies used for checking electrom...
A review on techniques and modelling methodologies used for checking electrom...
 
ACEP Magazine edition 4th launched on 05.06.2024
ACEP Magazine edition 4th launched on 05.06.2024ACEP Magazine edition 4th launched on 05.06.2024
ACEP Magazine edition 4th launched on 05.06.2024
 
2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf
2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf
2008 BUILDING CONSTRUCTION Illustrated - Ching Chapter 02 The Building.pdf
 
Unit-III-ELECTROCHEMICAL STORAGE DEVICES.ppt
Unit-III-ELECTROCHEMICAL STORAGE DEVICES.pptUnit-III-ELECTROCHEMICAL STORAGE DEVICES.ppt
Unit-III-ELECTROCHEMICAL STORAGE DEVICES.ppt
 
KuberTENes Birthday Bash Guadalajara - K8sGPT first impressions
KuberTENes Birthday Bash Guadalajara - K8sGPT first impressionsKuberTENes Birthday Bash Guadalajara - K8sGPT first impressions
KuberTENes Birthday Bash Guadalajara - K8sGPT first impressions
 
Question paper of renewable energy sources
Question paper of renewable energy sourcesQuestion paper of renewable energy sources
Question paper of renewable energy sources
 
官方认证美国密歇根州立大学毕业证学位证书原版一模一样
官方认证美国密歇根州立大学毕业证学位证书原版一模一样官方认证美国密歇根州立大学毕业证学位证书原版一模一样
官方认证美国密歇根州立大学毕业证学位证书原版一模一样
 
The Python for beginners. This is an advance computer language.
The Python for beginners. This is an advance computer language.The Python for beginners. This is an advance computer language.
The Python for beginners. This is an advance computer language.
 
Modelagem de um CSTR com reação endotermica.pdf
Modelagem de um CSTR com reação endotermica.pdfModelagem de um CSTR com reação endotermica.pdf
Modelagem de um CSTR com reação endotermica.pdf
 
Iron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdf
Iron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdfIron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdf
Iron and Steel Technology Roadmap - Towards more sustainable steelmaking.pdf
 

Estrazione automatica delle linee in un'immagine digitale

  • 1. UNIVERSITÀ DEGLI STUDI DI TRIESTE Dipartimento di Ingegneria e Architettura Corso di Studi in Ingegneria Elettronica e delle Telecomunicazioni ESTRAZIONE AUTOMATICA DELLE LINEE IN UN’IMMAGINE DIGITALE Tesi di Laurea Magistrale Laureanda: Relatore: Francesca PADOIN Prof. Sergio CARRATO Correlatore: Ing. Marco FONTANI _____________________________________________ ANNO ACCADEMICO 2020/2021
  • 2. Indice Introduzione 4 Capitolo primo - Individuazione dei contorni in un’immagine 5 1.1 Immagine digitale 5 1.2 Gradiente di intensità di un’immagine 6 1.3 Operatori di riconoscimento dei contorni di un’immagine digitale 7 1.3.1 Operatore di Sobel 7 1.3.2 Operatore di Canny 10 1.4 Confronto fra i due operatori 12 1.5 Utilizzo di maschere differenti per il prefiltraggio 14 1.6 Adaptative Threshold 18 1.7 Scelta di filtri finale 20 1.8 Altre metodologie prese in considerazione 20 1.8.1 Reti neurali 21 1.8.2 Algoritmo Haar-like 21 Capitolo secondo – Trasformata di Hough 23 2.1 Spazio delle immagini e spazio dei parametri 23 2.2 Meccanismo di voting 25 2.3 HOUGH_PROBABILISTIC e HOUGH_STANDARD 26 2.4 Confronto trasformata di Hough con i due operatori: Sobel e Canny 29 Capitolo terzo - Intersezione delle linee e stima dei punti di fuga 32 3.1 Track-bar 32 3.2 Intersezione fra linee 33 3.3 Tempistica di calcolo e complessità dell’algoritmo 34 3.4 Tecniche di clustering 35 3.5 Clustering partizionale 36 3.6 Confronto fra algoritmi 36 3.7 K-means 37 3.8 K-medoids 38 Capitolo quarto – Validazione sperimentale 43 4.1 Parametri di verifica 43
  • 4. Introduzione Questa tesi, svolta presso l’azienda Amped SRL di Trieste, si prefigge l’obiettivo di automatizzare tramite algoritmi la ricerca delle righe in un’immagine digitale. Questo al fine di individuare i punti di fuga di un’immagine e calcolare la prospettiva. Tale ricerca è utile ai fini forensi per individuare le reali dimensioni di un oggetto all’interno di un’immagine digitale, estrapolandolo dalla prospettiva. Il tutto è stato svolto con linguaggio C++ utilizzando la libreria OpenCV. Il codice prodotto è concepito per essere inserito in un software, che calcola, fra le altre cose la prospettiva, e dovrà quindi rispettare la compatibilità col software preesistente in termini di linguaggio di programmazione e di versione della libreria utilizzata. Si è pertanto deciso di procedere usando la versione 3.4.8 della libreria OpenCV. Il metodo utilizzato per ricercare le linee presenti in un’immagine si basa sulla trasformata di Hough, già presente in libreria, e sull’ottimizzazione della stessa in termini di rumore e quantità di linee trovate. La trasformata usa al suo ingresso l’immagine già pulita da rumore, in bianco e nero, e filtrata in modo tale da visualizzare solo i punti con un brusco cambio di colore, ovvero i contorni. La letteratura offre molti metodi di rilevazione dei contorni e per questa tesi si è scelto di valutare sia l’operatore di Canny sia l’operatore Sobel. Sono state scelti questi due perché presenti nella libreria e già abbondantemente verificati come efficaci. Entrambi danno ottimi risultati e sono di facile utilizzo con poco dispendio di memoria e di calcolo da parte del processore. In questo lavoro di tesi il suddetto metodo ha trovato applicazione nella ricerca dell’intersezione fra le linee individuate. Si è poi passati all’utilizzo di un algoritmo di clustering, nel nostro caso particolare, il k-means, per l’individuazione delle tre coordinate che localizzano la maggior densità dei punti d’intersezione, ipotizzando che esse possano identificare i punti di fuga dell’immagine. Alla fine, si è proceduto alla validazione dei risultati tramite verifica empirica da parte degli utenti. Prima di iniziare la trattazione dell’edge detection si introduce una breve spiegazione della libreria e della piattaforma utilizzate e si specifica che in tutti i paragrafi si utilizzerà la notazione per i filtri e gli algoritmi della libreria OpenCv.
  • 5. Capitolo 1 Individuazione dei contorni in un’immagine In questo capitolo vengono introdotti i due operatori utilizzati per individuare i contorni di un’immagine digitale. Verranno valutate le performance e le problematiche di entrambi gli operatori e saranno introdotti dei filtri per ottenere dei contorni più netti possibili in modo da migliorare la ricerca di linee operata dalla trasformata di Hough. 1.1 Immagine digitale Per trattare l’individuazione di un oggetto all’interno di una fotografia bisogna concentrare l’attenzione sui bordi che costituiscono l’oggetto di interesse. Nell’ambito dell’elaborazione delle immagini una delle tematiche principali è l’individuazione dei contorni di una figura e per fare questo ci sono molte tecniche che principalmente si basano sullo studio del gradiente di un’immagine. Qui di seguito, dopo un breve accenno alla tecnica di estrazione dei contorni, andremo ad analizzare le due tecniche che si è scelto di valutare per la rilevazione di linee in un’immagine digitale. Queste tecniche sono fondamentali come base per l’utilizzo della trasformata di Hough, in seguito trattata, per estrarre le linee in un’immagine. Iniziamo innanzitutto col definire l’immagine digitale come la rappresentazione bidimensionale tramite una serie di valori numerici che ne descrivono le qualità distintive: dimensione e colore. Ogni “punto” a cui assegnare un valore numerico determinante la qualità luminosa dell’immagine è denominata pixel. L’informazione contenuta in un pixel viene espressa in bit. Maggiore è il numero di bit che rappresenta il pixel e maggiore sarà la dinamica dell’immagine. La profondità di colore è il numero di bit riservati ad ogni pixel. Posto N la profondità di colore, il numero di possibili tonalità sarà 2^N. Un altro termine che incontreremo spesso sarà l’edge, che si definisce come una forte variazione locale dei livelli di grigio, tipicamente associata al confine tra due regioni con valori di grigio diversi. Per individuarlo vengono usati degli operatori locali, che solitamente hanno la funzione di migliorare la qualità dell’immagine oppure di estrarne le caratteristiche. Noi lo useremo nella seconda accezione. Questi operatori lavorano tramite una maschera quadrata N x N, solitamente 3x3 o 5x5, per valutare l’intorno del punto di interesse. Si considera il punto centrale di coordinata (x, y) e si vanno a valutare gli N x N - 1 punti del suo intorno con coordinate che seguono la direzione degli assi come in Figura 1.2.
  • 6. Fig. 1.1 Maschera 3x3 Fig. 1.2 Maschera 3x3 1.2 Gradiente di intensità di un’immagine I punti in cui si hanno variazioni brusche dell’intensità possono essere individuati tramite l’analisi delle derivate, per esempio si possono valutare i massimi e i minimi della derivata prima, oppure gli zero-crossing della derivata seconda, ovvero i punti per cui la derivata seconda passa per lo zero, che corrispondono a brusche variazioni del gradiente. La derivata di un segnale denota la sua variabilità: a fronte di forti variazioni locali (ad esempio contorni e altri bruschi cambiamenti di intensità) la derivata assume valori elevati, altrimenti se il segnale è costante, la derivata è zero. Nel nostro caso di segnali bidimensionali, si devono considerare le derivate parziali e quindi il gradiente. Questo è il vettore le cui componenti sono le derivate parziali nelle diverse direzioni (2 nel caso di immagini): 𝛻𝐼(𝑥, 𝑦) = 𝜕𝐼(𝑥, 𝑦) 𝜕𝑥 , 𝜕𝐼(𝑥, 𝑦) 𝜕𝑦 E riprendendo il concetto di derivata come limite del rapporto incrementale avremo: 𝜕(𝑥, 𝑦) 𝜕𝑥 = 𝑙𝑖𝑚 → 𝐼(𝑥 + 𝛥𝑥, 𝑦) − 𝐼(𝑥, 𝑦) 𝛥𝑥 ≃ 𝐼(𝑥 + 1, 𝑦) − 𝐼(𝑥, 𝑦) 𝜕(𝑥, 𝑦) 𝜕𝑦 = 𝑙𝑖𝑚 → 𝐼(𝑥, 𝑦 + 𝛥𝑦) − 𝐼(𝑥, 𝑦) 𝛥𝑦 ≃ 𝐼(𝑥, 𝑦 + 1) − 𝐼(𝑥, 𝑦) L’orientazione del vettore gradiente in un punto indica la direzione di maggior variazione d’intensità in quel punto dell’immagine.
  • 7. Fig. 1.3 Angolo del vettore Fig. 1.4 Direzione gradiente rispetto all’edge ‖𝛻‖ = 𝛻𝑥 + 𝛻𝑦 𝜃 = 𝑎𝑟𝑐𝑜𝑡𝑔 𝛥𝑦 𝛥𝑥 1.3 Operatori di riconoscimento dei contorni di un’immagine digitale. Nel nostro caso abbiamo deciso di utilizzare due operatori: Sobel e Canny come base per la trasformata di Hough. Tramite questa trasformata è possibile individuare le linee presenti nell’immagine con una bassa percentuale di errore. Solitamente si utilizza Canny, il quale comunque si basa su un operatore di tipo Sobel, per creare l’immagine utilizzata poi per calcolare la trasformata di Hough. Si è scelto di valutare anche il solo Sobel in quanto fornisce dei contorni netti ed è meno affetto da problemi di rumore rispetto a Canny. Questi operatori consistono nella convoluzione dell’immagine con una o più maschere. 1.3.1 Operatore di Sobel L’operatore di Sobel applica due maschere, solitamente 3 x 3, di convoluzione. Se I è l’immagine, i rispettivi contorni lungo x e lungo y sono calcolati da: 𝐼 = −1 −2 −1 0 0 0 1 2 1 e 𝐼 = −1 0 1 −2 0 2 −1 0 1
  • 8. 𝐼 = I(x-1,y-1) - I(x+1,y-1) + 2I(x-1 ,y) - 2I(x+1,y) + I(x-1,y+1) - I(x+1,y+1) 𝐼 = I(x-1,y-1) + I(x+1,y-1) + 2I(x,y-1) - 2I(x,y+1) - I(x-1,y+1) - I(x+1,y+1) L’operatore calcola il gradiente della luminosità dell’immagine in ogni punto, trovando la direzione lungo la quale si ha il massimo incremento possibile dal chiaro allo scuro e la velocità con cui avviene il cambiamento lungo quella direzione. Il risultato ottenuto fornisce una stima di quanto l’immagine varia in quel punto, e quindi della probabilità che quella parte di immagine rappresenti un contorno, fornendo anche un’indicazione del suo probabile orientamento. In ciascun punto dell’immagine il gradiente punta nella direzione del massimo aumento possibile di luminosità e la lunghezza del vettore corrisponde alla rapidità con cui la luminosità cambia lungo quella direzione. Il problema di questa tecnica è il fatto di avere frammenti di edge non connessi oppure punti o segmenti spuri a causa di rumore o piccole variazioni. Inoltre, essa dipende molto dal settaggio della soglia: per immagini con molte variazioni di colore o di toni di grigio è opportuno settare una soglia non molto alta (solitamente 60-90) mentre per immagini abbastanza uniformi, conviene settare un valore alto intorno ai 200-250. Converrebbe in questi casi calcolare l’istogramma dell’immagine e andare a valutare, in base al contrasto alto o basso, il valore da impostare alla soglia. Un valore sbagliato può produrre importanti errori in fase di ricerca delle linee con la trasformata di Hough non dando nessun risultato o linee non presenti nell’immagine.
  • 9. Fig. 1.5 Utilizzo dell’operatore Sobel con soglia 70 sull’immagine di Lena (470x470). Fig. 1.6 Utilizzo dell’operatore Sobel con soglia 150 sull’immagine di Lena (470x470).
  • 10. 1.3.2 Operatore di Canny Per questi motivi solitamente si utilizza Canny come metodo per rilevare i contorni in quanto esso produce edge connessi e, utilizzando un corretto range, è meno sensibile alla soglia proprio perché valuta se un pixel è di un contorno basandosi su due soglie. Il metodo è suddiviso in 4 fasi: 1) Smoothing gaussiano dell’immagine 2) Calcolo del gradiente 3) Soppressione dei non-massimi in direzione ortogonale all’edge 4) Selezione degli edge significativi mediante isteresi Anche qui, come per Sobel, i risultati varieranno in base ad alcuni parametri che per Canny sono rispettivamente: l’ampiezza della gaussiana (), la dimensione del filtro (N) e le soglie per l’isteresi, T1 e T2, nell’ultima fase. Dopo alcune prove, si è visto che una maschera 3x3 o 5x5 ed una soglia che va da 50 a 200 riesce ad essere un’ottima configurazione per svariati casi. Poiché l'algoritmo di Canny utilizza le derivate per trovare i gradienti di intensità dell'immagine, è altamente suscettibile al rumore. Se non lo si rimuove, l'algoritmo potrebbe riconoscere le zone rumorose all'interno dell'immagine come bordi ed etichettarle in modo errato. Di solito si usa pre-elaborare l’immagine con un filtro gaussiano, che serve a rimuovere la maggior parte del rumore, pur introducendo, come trade-off, distorsione nell’immagine, in quanto sfoca i contorni. Perciò bisogna sempre trovare un buon compromesso, a livello di maschera, fra la riduzione del rumore e il dettaglio ben definito. In seguito, dopo aver applicato il filtro, il passo successivo è il calcolo del gradiente per valutare i contorni. Qui vengono usati come operatori differenziali o Sobel o Prewitt o Roberts, in base alle esigenze. Il passo successivo è la soppressione dei non massimi. Lo scopo è di eliminare dall’immagine, vista come modulo-gradiente, i pixel che non sono massimi locali rispetto all’orientazione del gradiente. Spostandosi in direzione del gradiente, infatti, non si considerano tutti quei punti il cui modulo è strettamente minore del modulo di uno dei due punti ad esso adiacenti, andando così a costruire una nuova matrice su cui poi applicare la soglia. Il massimo locale si ha nei punti in cui la derivata del gradiente si annulla. Alla fine, si ottiene un'immagine binaria. In figura 1.5 si può vedere il risultato dell’analisi dell’intorno con una maschera 5x5, eliminando i pixel che non rispettano la condizione di massimo locale lungo la direzione del gradiente, che è ortogonale all’edge e con una doppia soglia 50-200.
  • 11. Fig. 1.7 Utilizzo dell’operatore Canny sull’immagine di Lena (470x470). A questo punto, abbiamo i bordi più sottili, ma c'è un problema: vi saranno alcuni falsi bordi causati da rumore e leggere variazioni di colore. Anche se il primo passo dell'algoritmo è stato quello di rimuovere il rumore, non tutto è stato rimosso. Questo perché la scelta di un filtro gaussiano è stata un compromesso tra eliminazione del rumore e sfocatura dei contorni. Ed è qui che si utilizza la doppia soglia. Per prima cosa scegliamo due valori di soglia: un minimo e un massimo. Successivamente, confrontiamo il gradiente di intensità di ciascun bordo con entrambi i valori di soglia. Se il gradiente di intensità di un bordo è maggiore del valore di soglia massimo, viene contrassegnato come un bordo forte. Al contrario, se il gradiente di intensità del bordo è inferiore al valore di soglia minimo, viene scartato. Infine, se il gradiente di intensità del bordo si trova tra i valori di soglia minimo e massimo, viene contrassegnato come bordo debole. L'algoritmo di Canny determina ciò considerando ogni pixel del bordo debole e gli 8 pixel adiacenti circostanti. Se uno qualsiasi dei suoi pixel adiacenti fa parte di un bordo forte, si considera collegato a un bordo forte. E perciò questo pixel viene conservato nel nostro risultato finale. Viceversa, se nessuno dei pixel vicini è forte, si presume che non faccia parte di un bordo forte e viene quindi soppresso. Nel nostro caso specifico si è utilizzata la funzione Canny della libreria OpenCV che implementa tutte queste funzioni e trova i contorni in un’immagine d’ingresso e li traccia in uscita in una mappa dei contorni. Una soglia troppo alta può far perdere informazioni importanti. D'altra parte, una soglia troppo bassa identificherà erroneamente le informazioni irrilevanti (come il rumore) come importanti. Sono state scelte queste due soglie in seguito a delle prove su alcune immagini e si è visto che la soluzione ottimale, che permette di avere buoni
  • 12. risultati in condizioni di luminosità e contrasto diversi, è quella del range 50-200. Il problema qui è impostare un corretto prefiltraggio per evitare l’individuazione di falsi contorni. 1.4 Confronto fra i due operatori Tutti e due gli operatori, Sobel e Canny, hanno i loro pro e contro e sono stati valutati entrambi come base per la trasformata di Hough. Sobel permette minori passaggi non richiedendo né un prefiltraggio né l’individuazione di due soglie né la soppressione dei non massimi. Inoltre, su immagini più geometriche individua in maniera migliore i contorni di interesse come si può vedere in figura 1.7. In figura 1.6 l’immagine di partenza da cui si sono calcolati i contorni. Fig. 1.8 Immagine di partenza
  • 13. Fig. 1.9 Contorni rilevati a sinistra tramite Sobel, con soglia 200 e a destra tramite Canny con doppia soglia 50-200. Il problema di tale tecnica è la dipendenza da un settaggio di soglia corretto. Ad esempio, usando la stessa immagine di partenza e impostando un valore di soglia pari a 70 si otterrà il risultato di figura 1.10 che è ben diverso da quello ottenuto con una soglia a 200. Fig. 1.10 Contorni rilevati a sinistra tramite Sobel, con soglia 70 e a destra tramite Canny con doppia soglia 50-200. Come si può notare l’immagine è molto più rumorosa nel secondo caso e nel dettaglio anche il bordo del tetto è un’unica fascia nera e non più distinguibile come nell’immagine precedente. Tutto ciò porta in seguito, usando Hough, ad un’errata rilevazione delle linee presenti e quindi ad errori anche grossolani. La problematica invece riscontrata con Canny è il bisogno di pre-filtrare l’immagine per evitare eccessivi edge, poi interpretati come linee. Una maschera troppo piccola o viceversa troppo grande può fare più danni del mancato filtraggio. Quindi anche in questo caso bisogna calibrare bene la tipologia di filtro e la grandezza della maschera.
  • 14. 1.5 Utilizzo di maschere differenti per il prefiltraggio Di seguito vengono riportate una serie di immagini a cui è stato applicato l’operatore di Canny, prefiltrate con maschere di grandezza differente. Rispettivamente la foto a destra viene filtrata con un filtro mediano 5x5 che elimina il rumore e introduce un minimo di distorsione, sfocando i bordi. In figura ci sono vari esempi del risultato della convoluzione con maschere differenti: Fig. 1.11 Canny applicato all’immagine di partenza senza alcun filtro
  • 15. Fig. 1.12 Canny applicato all’immagine di partenza elaborata con un filtro mediano con maschera 3x3 Fig. 1.13 Canny applicato all’immagine di partenza elaborata con un filtro mediano con maschera 5x5
  • 16. Fig. 1.14 Canny applicato all’immagine di partenza elaborata con un filtro mediano con maschera 7x7 Fig. 1.15 Canny applicato all’immagine di partenza elaborata con un filtro mediano con maschera 9x9
  • 17. Fig. 1.16 Canny applicato all’immagine di partenza elaborata con un filtro gaussiano con maschera 5x5 e sigma pari a 1 Fig. 1.17 Canny applicato all’immagine di partenza elaborata con un filtro gaussiano con maschera 9x5 e sigma pari a 15
  • 18. Come si può notare una maschera troppo piccola non risulta utile, come pure una eccessivamente grande. Non vi è inoltre particolare differenza fra un filtro mediano ed uno gaussiano e qui si è scelto di utilizzare il primo perché richiede un minor numero di variabili da inserire. 1.6 Adaptative Threshold L’altro comando della riga di codice che si è utilizzato è l’adaptativeThreshold che trasforma un’immagine in scala di grigi in una binaria tramite questa formula: THRESH_BINARY dst(x,y)={maxValue if src(x,y)>T(x,y) 0 otherwise THRESH_BINARY_INV dst(x,y)={ 0 if src(x,y)>T(x,y) maxValue otherwise dove T(x,y) è una soglia calcolata individualmente per ogni pixel. In questo caso, prima di effettuare l’operazione di soglia vera e propria, si convolve l’input con un particolare operatore, ADAPTIVE_THRESH_GAUSSIAN_C, che trasforma l’immagine in una rappresentazione binaria, applicando la distribuzione di Gauss. Si utilizza la binarizzazione in modo da eliminare ogni tipo di sfumatura e gradazione di grigio. Tale soglia adattiva si utilizza quando si hanno situazioni di illuminazione non uniforme, che rappresentano la maggior parte dei casi. Se non si applicasse, pur applicando precedentemente il filtro mediano, otterremmo i risultati in figura 1.18:
  • 19. Fig 1.18 Utilizzo di Canny senza il comando adaptativeThreshold. Infine, si applica un altro filtro per rimuovere il rumore che potrebbe essere stato introdotto dall’operazione di soglia. Anche qui i risultati, senza l’applicazione di questo filtro, sarebbero disastrosi: Fig 1.19 Utilizzo di Canny senza applicare un filtro, dopo l’applicazione dell’AdaptativeThreshold
  • 20. Come si può notare dalle figure precedenti un mancato prefiltraggio dell’immagine può portare ad un’eccessiva e non voluta ricerca di contorni che in seguito porterà a rilevare false linee nell’immagine. 1.7 Scelta di filtri finale Pur tuttavia una serie di pre-filtri con una generica maschera 5x5 o 7x7 sono sufficienti a pulire l’immagine dal rumore ed offrire un’accettabile base per la trasformata di Hough. A differenza quindi di quanto avveniva con Sobel, non sarà necessario settare una soglia ben precisa in base all’immagine di partenza ma basterà implementare i giusti filtri ed una doppia soglia abbastanza ampia da comprendere tutte le casistiche più comuni. Con questi valori difficilmente verranno prodotti falsi contorni o false linee dell’immagine, mentre sbagliando la soglia di Sobel il nostro programma interpreterà i dati che ha nella maniera scorretta, generando linee con un’inclinazione anche di 90° diversa da quella originale. In figura 1.20 l’immagine finale con operatore di Canny applicato con filtro mediano 7x7, adaptativeThreshold 7x7 ed infine filtro mediano 7x7. Fig. 1.20 Canny applicata all’immagine di partenza con filtro mediano 7x7 e adaptativeThreshold 7x7. 1.8Altre metodologie prese in considerazione In questo sotto capitolo si fa un breve accenno alle altre tecniche di estrazione delle linee prese in considerazione.
  • 21. 1.8.1 Reti neurali Prima di scegliere la trasformata di Hough, si sono valutate varie tecniche di estrazione delle linee da un’immagine, in primis quella tramite l’utilizzo delle reti neurali oppure un affiancamento delle stesse per avvalorare i risultati trovati con altri algoritmi. Le reti neurali sono degli algoritmi basati sulle connessioni fra il neurone trasmettitore e quello ricevitore, dove ogni connessione è caratterizzata da un peso che sarà quello che verrà modificato per ridurre l’errore. Queste reti spesso si basano su un apprendimento supervised, ovvero vi sarà un external teacher che determinerà la durata dell’apprendimento, la frequenza di presentazione degli esempi e la misura degli errori. In pratica mentre si addestra la rete, si presenta un pattern di foto all’ingresso e si vuole che la rete modifichi l’insieme dei pesi per avere le uscite desiderate ai nodi di uscita. Per non appesantire il codice e non occupare eccessiva memoria, si era valutato dal Paper [2] “Deep Learning for Vanishing Point Detection Using an Inverse Gnomonic Projection”: la Inverse Gnomonic Projection. Questa è una mappatura che trasforma il piano dell’immagine illimitato in uno spazio limitato, rendendo in tal modo il punto di fuga, lontano dal centro dell’immagine, più facile da trattare. L’approccio consisteva nei seguenti passi: estrazione delle linee, mappatura delle linee nella sfera gaussiana e visualizzazione dell’immagine. Questa immagine veniva poi usata come input per un CNN, allenato solo con dati sintetici. Questo CNN dava una previsione sui possibili punti di fuga. La mappatura era utile al fine di permettere l’utilizzo di dati sintetici piuttosto che quelli reali, occupando così minore spazio e permettendo di crearsi i dati da sé. Però, sebbene questa tecnica offra dei risultati molto soddisfacenti e precisi, non è adatta al nostro caso principalmente per due motivi. Il primo si basa sul fatto che, per una questione di compatibilità, il codice deve essere scritto in linguaggio C++ ed essere coerente con la versione di OpenCV, già utilizzata nel software preesistente mentre per le reti neurali si usa utilizzare Python oppure le nuove versioni di OpenCV, per sfruttare al meglio e non appesantire troppo il codice. Il secondo motivo si basa sul fatto che i dati forniti dal codice saranno poi utilizzati in ambito legale e l’utilizzo delle reti neurali non è avvalorato da tutte le legislazioni proprio perché è l’utente che decide di addestrare la rete sulla base dei dati che lui stesso carica, introducendo dunque una parte non oggettiva nel computo delle linee. 1.8.2 Algoritmo Haar-like Si era valutato anche l’utilizzo di un algoritmo Haar-like[3], che si basa sulla differenza di intensità luminosa fra aree vicine dell’immagine tramite la Haar wavelets. Una Haar-like features considera regioni rettangolari adiacenti e somma le
  • 22. intensità dei pixels in ogni regione e calcola la differenza tra queste somme. Questa differenza viene poi usata per categorizzare le sottosezioni di un’immagine. Nella fase di ricerca una finestra, di forma definita, si muove su tutta l’immagine e per ogni sottosezione si calcola la Haar-like feature. Questa differenza viene poi confrontata con una soglia precedentemente decisa che separa i non oggetti dagli oggetti. Il problema di questa tecnica è la poca precisione, di conseguenza ci vorranno parecchie Haar-like features per descrivere un oggetto con sufficiente accuratezza. Anche se questa feature ha una velocità di calcolo elevata, perché viene calcolata in tempo reale, in sede di studio questa tecnica è stata scartata poiché non presente in libreria OpenCV e quindi meno pratica.
  • 23. Capitolo 2 Trasformata di Hough In questo capitolo verrà introdotta la trasformata di Hough e i risultati ottenuti applicando su di essa l’operatore Sobel e l’operatore Canny. Inoltre verranno introdotti i due comandi della libreria OpenCV per calcolare la trasformata e un breve confronto fra i due. 2.1 Spazio delle immagini e spazio dei parametri Nel nostro caso specifico si è scelto di adottare la trasformata di Hough quale metodo di individuazione delle rette nelle immagini. Questo metodo consiste nel mappare ogni punto presente nell’immagine in una retta nello spazio dei parametri. Si usa una rappresentazione parametrica che viene utilizzata per descrivere le rette nel piano immagine tramite i parametri m, per la pendenza, e c, per l’intercetta. Fissati i valori di m e c, l’equazione può essere vista come una mappatura di tipo biunivoco dallo spazio dei parametri allo spazio dell’immagine. Consideriamo il punto (x', y') nel piano cartesiano (x, y) e la generica retta di equazione y'=mx' + c passante per il punto (Figura 2.1). Variando m e c posso rappresentare tutte le possibili rette del piano cartesiano passanti per il punto (x', y'). Si può ricavare ora la legge che da un punto (x', y') dello spazio immagine permette di tracciare la curva nello spazio dei parametri (m, c). Dall'equazione y'=mx' + c si ottiene infatti c=-mx' + y', dove ora x' e y' sono costanti, e m e c variabili. Come si vede in Figura 4.2, il fascio di rette passante per il punto P dell'immagine viene quindi rappresentato con una retta nello spazio (m, c). Figura 2.1: spazio immagine Figura 2.2: spazio parametri Se considero ora 2 punti P'(x', y') e P''(x", y") nello spazio (x, y), che giacciono sulla stessa retta, per ognuno di essi si ha un corrispondente fascio di rette che nello spazio immagine (m, c) viene rappresentato da una retta. Si avrà allora che nello spazio dei
  • 24. parametri la retta c=-mx' + y' descrive i valori di (m, c) relativi alle rette passanti per P' e la retta c=-mx'' + y'' descrive i valori di (m, c) relativi alle rette passanti per P'', come si vede in Figura 2.4. Figura 2.3: spazio immagine Figura 2.4: spazio parametri Il punto di intersezione (m', c') nello spazio dei parametri descrive i valori dei parametri (m, c) della retta passante per P' e P'' nello spazio originale (x, y) ed è quindi facile risalirvi. Il problema di tale impostazione è che, nel caso limite di retta parallela all’asse y, avremo un valore di m tendente all’infinito che non sarebbe gestibile facilmente tramite un calcolatore. Per questo motivo si tende ad utilizzare un diverso metodo di parametrizzazione, simile alle coordinate polari, per non incappare nel problema della pendenza infinita. Anche in questo caso entrano in gioco due parametri: la distanza, ρ, della retta dall’origine e θ, l’angolo fra la normale alla retta dall’origine e l’asse x: ρ= x cosθ+ y sin θ. Con questa parametrizzazione, per i punti che sono allineati nel piano immagine corrisponde, grazie alla mappatura, una sinusoide nello spazio dei parametri e l’insieme di tutte queste sinusoidi, corrispondenti ai punti allineati, individuerà un punto in comune tra di loro. Questo punto nel piano (ρ, θ) denominato (ρ₀, θ₀), definisce la retta passante per i punti collineari. Quando sul piano dell’immagine ci sono dei punti allineati su una stessa retta, sul piano dei parametri, le curve si intersecano in un punto che è l’immagine della retta su cui giacciono i punti.
  • 25. Figura 2.5: spazio delle immagini Figura 2.6: spazio dei parametri 2.2 Meccanismo di voting Un altro problema che si riscontra è legato al rumore. Una retta nello spazio di partenza definita da N punti P1, ..., PN viene identificata come intersezione nello spazio dei parametri di N rette, ognuna corrispondente a un Pi, come in figura 2.7. Fig. 2.7 Rappresentazione in assenza di rumore di punti allineati nello spazio dei parametri Col rumore non è detto che i punti Pi siano perfettamente allineati e di conseguenza non ci sarà un’unica intersezione come si può vedere in figura 2.8.
  • 26. Fig. 2.8 Rappresentazione in presenza di rumore di punti non più allineati nello spazio dei parametri Per ovviare a questo problema, si introduce un meccanismo di voting, ovvero si divide lo spazio dei parametri in una griglia finita di celle, e si associa ad ognuna un contatore. Quelle col maggior numero di voti, ovvero punti all’interno della griglia, saranno quelle con la maggior probabilità di essere linee. A livello di codice l’immagine che viene data in ingresso, per calcolarne la trasformata, è un’immagine già passata sotto l’operatore di Canny o di Sobel. Sarà quindi in bianco e nero per una minore complessità. Le foto che vengono trattate sono spesso di interni monocolori o con poca variazione tonale e quindi non si va a perdere eccessiva informazione estromettendo le tre componenti R, G, B ma si guadagna in termini di calcolo. 2.3 HOUGH_PROBABILISTIC e HOUGH_STANDARD Inizialmente si sono valutate due diverse tipologie della trasformata di Hough: la HOUGH_PROBABILISTIC e la HOUGH_STANDARD. La fondamentale differenza fra le due è che la prima restituisce dei segmenti, dando le coordinate degli estremi, mentre la seconda restituisce una linea rappresentata dai parametri ρ, θ. La HOUGH_PROBABILISTIC richiede come parametri: threshold(t), minLineLenght(l) e maxLineGap(g). Il primo è un parametro di accumulazione: solo le linee che hanno un voto superiore ad un certo valore vengono accettate; dove il voto è dato dal numero di rette che si intersecano nello stesso punto nello spazio dei parametri, ovvero punti che appartengono alla stessa linea nello spazio delle immagini. Il secondo indica la lunghezza minima che deve avere il segmento. Tutti i valori al di sotto di tale lunghezza verranno scartati. Il terzo indica il massimo gap permesso fra due punti, appartenenti ad una stessa linea, affinché si possano unire in un unico segmento.
  • 27. Questa trasformata può essere molto utile se si è interessati ai segmenti o ad avere le coordinate iniziali e finali degli stessi per trattare con dei punti. Infatti, in uscita otterremmo un vettore a quattro elementi. Il problema è che bisogna impostare ben 3 parametri ed è difficile trovare dei valori che possano andare bene per una buona parte dei casi d’esame. Quindi anche a livello di utenza, si richiederebbe al fruitore del software di selezionare i valori di interesse con una certa precisione, cosa che non richiede la STANDARD_HOUGH. Inoltre, questo metodo è sensibile al rumore se si imposta un basso valore di threshold per avere più segmenti o un eccessivo valore di maxLineGap per includere anche alcune linee che altrimenti risulterebbero spezzate, si rischia di includere dei segmenti che non vogliamo o addirittura dei falsi segmenti. Di seguito si possono vedere i vari casi per diversi valori di soglia e gap. Fig. 2.9 Figura con parametro di voting 20, Fig. 2.10 Figura con parametro di voting 100, tenendo fisso l a100 e g a 5. tenendo fisso l a100 e g a 5. Fig. 2.11 Figura con parametro di gap 5, Fig. 2.12 Figura con parametro di gap 10, tenendo fisso l a 100 e v a 50. tenendo fisso l a 100 e v a 50.
  • 28. Fig. 2.13 Figura con parametro di length 20, Fig. 2.14 Figura con parametro di length 20, gap 5 e voting 50. gap 15 e voting 50. Come si può notare dalla figura 2.13 una lunghezza minima troppo piccola porta ad un eccessivo numero di segmenti e pure a parecchi errori come segmenti con inclinazione di 45° rispetto all’orizzontale sulle assi della casa o come quelli rilevati per le foglie. Riducendo il gap, come in figura 2.11, si otterranno decisamente meno segmenti ma molti non voluti. In più, come si può notare, a meno di settare opportunamente i parametri, non si ottiene una gran quantità di linee. Per questo motivo si è optato per la ricerca delle linee tramite la trasformata di HOUGH_STANDARD che richiede un minor numero di parametri e in uscita dà un vettore a due elementi. Per questo comando si devono impostare la distance e l’angle resolution, in termini di ρ e θ, per definire la risoluzione dell’accumulatore che è la zona, nel piano dei parametri, dove si accumulano le intersezioni fra curve che individuano la presenza di una linea. Solitamente per tale parametro si mette il valore di 1 pixel per la distance e di 𝜋/180 per l’angle resolution. Un altro parametro richiesto è la threshold per l’accumulatore, ovvero vengono visualizzate solo le linee che ottengono abbastanza voti. Ma con un valore di 150 standard si riesce a coprire bene le varie casistiche. E il risultato sarà come quello in figura 2.15, dove sono rappresentate 15 linee:
  • 29. Fig. 2.15 Rappresentazione delle linee tramite HOUGH_STANDARD Tra queste due rappresentazioni, HOUGH_PROBABILISTIC e HOUGH_STANDARD, si è scelto quindi di utilizzare la seconda in quanto meno legata ad impostazioni da settare da parte dell’utente e perché fornisce linee infinite, che sono più utili in vista dell’obiettivo di determinazione del punto di fuga per il calcolo della prospettiva. Interessante poteva essere l’utilizzo dei segmenti, con la trasformata HOUGH_PROBABILISTIC, per calcolare le distanze o le lunghezze di alcuni contorni, in quanto in uscita venivano fornite le coordinate di inizio e fine dei segmenti. Il problema è che gli stessi segmenti rimanevano vincolati a quali la trasformata riuscisse ad estrarre. 2.4 Confronto trasformata di Hough con i due operatori: Sobel e Canny Nelle figure seguenti ci saranno alcune foto con le linee trovate tramite la trasformata HOUGH_STANDARD con i due operatori per fare un confronto tra i due metodi. Su tutte le immagini si sono estratte 15 linee.
  • 30. Fig. 2.16 Nell’immagine a sinistra, in rosso, le linee estratte tramite la trasformata di Hough a seguito dell’operatore Canny; a destra, in blu, le linee estratte a seguito dell’operatore Sobel Fig. 2.17 Nell’immagine a sinistra, in rosso, le linee estratte tramite la trasformata di Hough a seguito dell’operatore Canny; a destra, in blu, le linee estratte a seguito dell’operatore Sobel
  • 31. Fig. 2.18 Nell’immagine a sinistra, in rosso, le linee estratte tramite la trasformata di Hough a seguito dell’operatore Canny; a destra, in blu, le linee estratte a seguito dell’operatore Sobel Come si può notare da questi tre esempi non vi sono molte differenze fra i due metodi, se non una maggiore variabilità direzionale con quello che utilizza l’operatore Canny. Infatti, già dalla prima immagine si nota che le linee rosse individuano sia le assi della facciata principale ma anche quelle della parte lunga della casa oltre alle colonne e al tetto, mentre le linee blu, associate all’operatore di Sobel, individuano quasi tutte unicamente le assi della facciata principale, andando a perdere l’informazione nelle altre direzioni. Pertanto, da questi esempi e considerate le problematiche maggiori per impostare un valore di soglia corretto, viste al paragrafo precedente, si è preferito utilizzare l’operatore di Canny come base per la trasformata di Hough, tenendo comunque disponibile, come ulteriore opzione per una valutazione di linee in più, l’operatore Sobel.
  • 32. Capitolo 3 Intersezione delle rette e stima dei punti di fuga In questo capitolo, dopo aver individuato le linee presenti nell’immagine, si prosegue con la ricerca dei punti d’intersezione fra le suddette. Questo passaggio è intermedio per la ricerca, tramite algoritmo k-medoids, di cui si parlerà nel capitolo seguente, delle zone a maggior densità di punti d’intersezione. Ciò sarà utile per determinare i tre punti di fuga, verso cui le rette convergono, e quindi le tre direzioni principali, al fine di definire le reali dimensioni di un oggetto in un’immagine, estrapolandolo dalla prospettiva in cui è costretto. 3.1 Track-bar Prima di enunciare il metodo, utilizzato per individuare i punti d’incrocio fra le linee, si introduce brevemente il concetto di track-bar, che serve a determinare la quantità di rette che si vogliono trovare. Si è deciso di far scegliere all’utente il numero di linee da individuare nell’immagine e per far questo si è introdotta un’interfaccia grafica (GUI). La libreria OpenCV non offre molte funzionalità d’interfaccia utente e la più immediata, senza dover inserire dati, è risultata essere la track-bar, che permette di selezionare la quantità voluta in un intervallo di valori definito dal programmatore sul codice. Cambiando la posizione sulla track-bar, il valore della variabile intera cambia e usando quel nuovo valore andremo a variare una proprietà dell’immagine. Nel nostro caso la scelta dell’utente determinerà la quantità di linee che l’algoritmo dovrà trovare e, di conseguenza, il numero di confronti per trovare tutti i punti d’intersezione con le linee appena trovate. In figura 4.1 un esempio di utilizzo della track-bar, dove si è preimpostato un valore di partenza di 5 linee:
  • 33. Fig. 3.1 A sinistra immagine con 5 linee impostate già in partenza, a destra con 25. Introdotta la track-bar, utile al fine di determinare il numero di linee che si devono trovare, si può tornare a parlare del metodo utilizzato per la ricerca dei punti in comune fra le linee trovate. 3.2 Intersezione fra linee Il metodo che si utilizza per trovare l’intersezione fra due linee è quello algebrico del sistema fra due rette r e s: 𝑦 = 𝑚 𝑥 + 𝑐 𝑦 = 𝑚 𝑥 + 𝑐 Andando a risolvere col metodo del confronto: m₁x+c₁=m₂x+c₂; quindi: x= (c₂-c₁) / (m₁-m₂) ; y = m₁ * (c₂-c₁) / (m₁-m₂) + c₁ Individueremo così tutti i punti di intersezione fra le linee trovate nella foto, la maggior parte dei quali saranno fuori immagine. Risulta quindi utile riportare le coordinate dei punti di incrocio sul terminale in modo da avere una chiara idea della percentuale di punti presenti al di fuori dell’immagine. Si tratta di rette idealmente
  • 34. infinite, nella realtà soggette alla lunghezza massima consentita dal calcolatore e quindi trattabili per un confronto punto a punto per determinare dove le x e y delle due rette coincidono. 3.3 Tempistica di calcolo e complessità dell’algoritmo A livello di codice il tutto è strutturato con due cicli for. Uno serve a trovare le linee presenti nell’immagine in quantità richiesta dall’utente, mentre l’altro esegue il confronto a coppie, punto a punto, fra la prima linea con la seconda, la prima con la terza e così via fino a esaurimento linee. Il ciclo riparte poi con la seconda linea che confronta con la prima e così via per un totale di Nx(N-1)/2 confronti, dove N sta per la quantità di linee inserite dall’utente. Con questa tecnica vi è una problematica di cui si deve tenere conto: il denominatore a zero, nel caso di rette parallele; e un minimo di lag in uscita per eseguire il ciclo per il confronto fra le linee, per trovare punti d’incrocio, pari a Nx(N-1)/2 volte. Per ovviare alla prima problematica, che porterebbe inevitabilmente ad un errore a runtime, con conseguente blocco del programma, basta gestire l’eccezione che sarebbe il caso in cui m1 = m2, ovvero le rette con coefficiente angolare identico e quindi parallele. Perciò individuando quest’eccezione ed andandola a eliminare dalla soluzione non si perderà nessuna informazione utile, in quanto due rette parallele non si intersecano mai e quindi non avranno punti in comune da tenere in considerazione. Per quanto riguarda la tempistica, seppure il doppio ciclo introduca tempi di calcolo maggiori, si deve tenere conto che normalmente bastano quindici/venti linee per una sufficiente densità di punti d’intersezione e perciò saranno richiesti 105 /190 confronti che, per un normale calcolatore, non sono eccessivi. E le tempistiche di calcolo varieranno circa da 1,7 secondi per 15 linee a 1,9 secondi per 20 linee. Fig. 3.2 Confronto intersezioni utilizzando Canny (a sinistra) e Sobel (a destra)
  • 35. Fig. 3.3 Confronto intersezioni utilizzando Canny (a sinistra) e Sobel (a destra) Una volta trovati i punti d’intersezione, si inseriscono le rispettive coordinate in un vettore, che sarà la base di partenza per l’algoritmo di clustering. 3.4 Tecniche di clustering Una volta trovati tutti i punti di intersezione fra le rette presenti nell’immagine, si prosegue nella ricerca delle zone con una maggiore densità di punti. Lo scopo di tale ricerca è l’individuazione delle tre direzioni principali di convergenza delle linee per trovare i punti di fuga dell’immagine. Per fare questo si utilizzano degli algoritmi di clustering, dove il clustering consiste nel raggruppare oggetti in classi omogenee. Un cluster è un insieme di oggetti che presentano tra loro delle similarità, mentre per contro presentano dissimilarità con oggetti in altri cluster. Come input nell’algoritmo verrà dato un certo numero di elementi, che poi saranno suddivisi in base alle loro similarità. In output avremo invece un certo numero di cluster, trovati dall’algoritmo. In molti approcci, come pure nel nostro, questa similarità è concepita in termini di distanza in uno spazio multidimensionale. Vi sono varie tecniche di clustering, inizialmente suddivise in metodi aggregativi o bottom-up e metodi divisivi o top-down. Nel primo caso si considera ogni singolo dato come un cluster a sé e a successive iterazioni si raggruppa in base alla somiglianza agli altri cluster; mentre il secondo considera inizialmente l’insieme dei dati come un unico cluster e per successive iterazioni e confronti, li divide in un numero minore di cluster. Inoltre, vi sono altre due classificazioni importanti [3] in base all’algoritmo che si vuole utilizzare: clustering partizionale e clustering gerarchico. Il primo definisce l’appartenenza ad un gruppo in base alla distanza da un punto rappresentativo del cluster (centroide, medioide, ecc…), dopo aver prefissato il numero di gruppi della partizione. L’algoritmo gerarchico invece costruisce una gerarchia di partizioni caratterizzata da un numero crescente o decrescente di gruppi. Da queste due
  • 36. ripartizioni la scelta è ricaduta sull’algoritmo partizionale in quanto fin dall’inizio sappiamo esattamente di quante direzioni abbiamo bisogno, ovvero tre, per poi andare a calcolare la prospettiva. 3.5 Clustering partizionale Il procedimento per il clustering partizionale prevede i seguenti passaggi: inizialmente si suddivide l’insieme dei dati in K cluster e ad ognuno di essi si assegnano degli elementi scelti casualmente. Dopodiché si vanno a calcolare i centroidi di ciascun cluster: 𝑀 = ∑ 𝑥 dove Mk è il centroide per il cluster K, nk è il numero di elementi del cluster K e xik è l’i-esimo elemento del cluster. Il centroide è un punto appartenente allo spazio che media le distanze tra tutti i dati appartenenti al cluster ad esso associato. Rappresenta quindi una sorta di baricentro del cluster ed in generale, proprio per le sue caratteristiche, non è uno dei punti del dataset. I centroidi vengono scelti casualmente e di solito hanno una certa distanza l’uno dall’altro per fare in modo che l’algoritmo converga. Si calcola poi la distanza degli elementi del cluster dal centroide e in base a quello si valuta l’errore quadratico medio tramite: 𝑒 = (𝑥 − 𝑀 ) con ek errore quadratico medio per il cluster K. Questo serve a valutare gli errori di tutti i cluster e sarà il parametro da minimizzare nelle varie iterazioni dell’algoritmo. A questo punto, calcolato l’errore, si riassegnano gli elementi del campione in base al centroide più vicino e si ripetono i passaggi finché non si raggiunge il valore minimo desiderato dell’errore oppure finché i membri del cluster non si stabilizzano. 3.6 Confronto fra algoritmi Tra questi algoritmi i principali sono il k-means, il fuzzy c-means e il k-medoids. I primi due, anche se con implementazioni completamente diverse, portano a risultati e problematiche molto simili. Entrambi scelgono inizialmente in modo casuale i dati (il primo) e i coefficienti (il secondo) da assegnare ad ogni cluster ed entrambi cercano di minimizzare l’errore quadratico medio di iterazione in iterazione. Il problema di tutti e due i metodi è dovuto proprio alla scelta casuale iniziale dei dati che potrebbe
  • 37. far convergere l’algoritmo ad un minimo locale e non assoluto. Inoltre, nel caso del metodo fuzzy, il risultato dipenderà anche dalla scelta iniziale dei pesi. Risultati migliori vengono invece dal metodo k-medoids in quanto, a differenza del k-means, esso minimizza la somma delle dissimilarità tra punti in un cluster e un punto indicato come centro di quel cluster. Infatti, al primo passaggio, l’algoritmo k- medoids sceglie k punti arbitrari come punti centrali del cluster. Sebbene sulla carta il k-medoids sia più robusto al rumore e più preciso in presenza di valori anomali, in quanto minimizza la distanza dal centro, nel codice abbiamo implementato il k- means. Questa scelta si è fatta perché la libreria OpenCV implementa già un metodo k-means e questo algoritmo dà risultati più che soddisfacenti per la ricerca dei tre punti di fuga, anche perché nel nostro caso spesso i valori anomali rappresentano quelli di interesse. 3.7 K-means Il k-means si basa sui cosiddetti centroidi. Questa tecnica raggruppa il set di dati in k cluster diversi con un numero quasi uguale di punti. Dato un insieme di oggetti (x1, x2, ..., xn), dove ognuno è un vettore reale bi-dimensionale, l’algoritmo di clustering k-means ripartisce gli n oggetti in k ≤ n insiemi S = {S1, S2, ..., Sk} così da minimizzare la varianza. In pratica l’obiettivo è trovare: arg min ‖𝑥 − 𝜇 ‖ ∈ In termini di codice, l’algoritmo darà un vettore in uscita contenente le coordinate dei punti su cui convergono i tre cluster. Fig. 3.4 Distanza di un punto x dai tre centroidi individuati.
  • 38. 3.8 K-medoids Il k-medoids parte con una selezione arbitraria di k oggetti, come punti medoids, da un insieme di n oggetti e associa ogni elemento nel dato insieme al più simile medoid, dove la similarità è data dalla funzione di costo che è definita usando distanze come la distanza di Manhattan, nel nostro caso. La distanza di Manhattan è la distanza tra due punti è la somma del valore assoluto delle differenze delle loro coordinate. Seleziona poi in modo casuale un elemento non medoid O’, calcola il costo totale Si, che è la somma dei costi dei singoli elementi dal corrispondente medoid, nel caso del medoid iniziale e il costo totale Sf nel caso del medoid O’ e ne calcola la differenza S=Sf-Si. Se S<0 allora viene scambiato il medoid iniziale con il nuovo e si ripetono i vari passi sino a quando si hanno cambiamenti nell'insieme dei medoid. La bontà del clustering può essere negativamente influenzata dalla presenza di outlier che tendono a spostare il centroide dei cluster al fine di ridurre l’aumento dell’SSE determinato indotto dall’outlier. Dato che la somma del quadrato degli errori è un quadrato di una distanza, i punti molto lontani incidono pesantemente sul suo valore. Gli outlier se identificati possono essere eliminati in fase di preprocessing. In figura degli esempi di cluster trovati; le linee azzurre collegano il centro dell’immagine ai punti trovati dall’algoritmo così da dare un’idea visiva della direzione trovata.
  • 39. Fig. 3.5 Algoritmo di k-means nel caso di operatore di Sobel con 30 linee trovate
  • 40. Fig. 3.6 Algoritmo k-means nel caso di operatore Canny con 25 linee trovate Fig. 3.7 Confronto k-means tra operatore Canny (a sinistra) e Sobel (a destra) con 15 linee trovate
  • 41. Fig. 3.8 Confronto k-means tra operatore Canny (a sinistra) e Sobel (a destra) con 25 linee trovate Fig. 3.9 Algoritmo di k-means con operatore Sobel con 1) 15 linee, 2) 23 linee e 3) 27 linee.
  • 42. Nell’ultima immagine si sono paragonate le tre diverse ricerche con l’algoritmo k- means con una quantità di linee, e quindi intersezioni, man mano crescente. Come si può vedere un valore intorno alle 20 linee trovate può risultare sufficiente per una stabilizzazione dell’algoritmo.
  • 43. Capitolo 4 Validazione Sperimentale In questo capitolo si testa il programma secondo alcuni parametri per rilevarne le problematiche e i punti di forza dell’algoritmo in base ai due operatori (Sobel e Canny). 4.1 Parametri di verifica Si è utilizzata una tabellina, inserita qui sotto, per valutare quattro casi su sei immagini in modo da avere risultati su differenti tipologie di foto. La tabella è stata poi suddivisa in due righe: una riservata ai risultati trovati per le linee ricavate usando Sobel e l’altra per quelle ricavate usando Canny. Il software parte da un valore fisso sullo slider pari a otto linee trovate. Le quattro colonne sono suddivise in questo modo: Colonna A: si devono contare quante linee concorrono a trovare un punto di fuga e riportarne il numero. Colonna B: si aumenta il numero delle linee da trovare, tramite slide, finché non si trova una buona calibrazione fra linee per ogni direzione che concorre a trovare il punto di fuga. Colonna C: si devono contare quante linee azzurre si dirigono verso un corretto punto di fuga. Colonna D: si deve verificare se, rimuovendo determinate linee, la linea azzurra cambia direzione e concorre verso un punto di fuga corretto. Sample #1 A) Numero di linee che concorrono ad un punto di fuga (slider, “Qt: 8”) B) Variare lo slider per avere almeno una linea per direzione voluta. C) Numero di linee azzurre che vanno verso un punto di fuga. D) Numero di linee azzurre che vanno verso un punto di fuga, dopo aver rimosso alcune linee trovate. Blue-line image (Sobel) 8 27 1 1 Red-line image (Canny) 5 8 2 3
  • 44. Sample #2 A) Numero di linee che concorrono ad un punto di fuga (slider, “Qt: 8”) B) Variare lo slider per avere almeno una linea per direzione voluta. C) Numero di line azzurre che vanno verso un punto di fuga. D) Numero di linee azzurre che vanno verso un punto di fuga, dopo aver rimosso alcune linee trovate. Blue-line image (Sobel) 8 19 2 2 Red-line image (Canny) 8 11 2 2 Sample #3 A) Numero di linee che concorrono ad un punto di fuga (slider, “Qt: 8”) B) Variare lo slider per avere almeno una linea per direzione voluta. C) Numero di line azzurre che vanno verso un punto di fuga. D) Numero di linee azzurre che vanno verso un punto di fuga, dopo aver rimosso alcune linee trovate. Blue-line image (Sobel) 8 28 3 3 Red-line image (Canny) 8 28 2 2 Sample #4 A) Numero di linee che concorrono ad un punto di fuga (slider, “Qt: 8”) B) Variare lo slider per avere almeno una linea per direzione voluta. C) Numero di line azzurre che vanno verso un punto di fuga. D) Numero di linee azzurre che vanno verso un punto di fuga, dopo aver rimosso alcune linee trovate. Blue-line image (Sobel) 8 A 28 ne ha 2 2 2 Red-line image (Canny) 8 Non riesce 2 2
  • 45. Sample #5 A) Numero di linee che concorrono ad un punto di fuga (slider, “Qt: 8”) B) Variare lo slider per avere almeno una linea per direzione voluta. C) Numero di line azzurre che vanno verso un punto di fuga. D) Numero di linee azzurre che vanno verso un punto di fuga, dopo aver rimosso alcune linee trovate. Blue-line image (Sobel) 8 Non riesce 2 2 Red-line image (Canny) 8 Non riesce 2 2 Sample #6 A) Numero di linee che concorrono ad un punto di fuga (slider, “Qt: 8”) B) Variare lo slider per avere almeno una linea per direzione voluta. C) Numero di line azzurre che vanno verso un punto di fuga. D) Numero di linee azzurre che vanno verso un punto di fuga, dopo aver rimosso alcune linee trovate. Blue-line image (Sobel) 8 20 2 2 Red-line image (Canny) 8 20 2 3 Questo test è stato mandato a cinque persone differenti e i risultati in tabella sono dati da una media delle risposte. In realtà il programma trova sempre le stesse linee quindi in questo caso varia solo la modalità con cui l’utente percepisce e calcola il punto di fuga di un’immagine. Come si può notare dalle tabelle entrambi i metodi riescono ad individuare molto bene e già con solo otto linee di partenza, due delle tre direzioni preferenziali. Il problema è trovare la terza direzione, difatti il programma o non riesce ad individuare nessuna linea oppure ne trova poche. Poiché il metodo di individuazione dei tre punti di fuga è basato sulla ricerca delle tre zone con maggior densità di punti d’intersezione fra le linee trovate, il fatto di individuare solamente una o due linee nella terza direzione non porta ad un numero sufficientemente alto di punti da creare un cluster. Quello che succede è che l’algoritmo calcola una media fra quei punti ed altri trovati dentro o fuori dell’immagine, andando a sfalsare il terzo cluster. La soluzione, di eliminare alcune linee non volute, aiuta in parte il programma a ricalibrare correttamente la ricerca di cluster ma sarebbe d’aiuto anche eliminare
  • 46. qualche linea in eccesso nelle due direzioni già trovate. Un’altra cosa che si nota è che in generale bisogna aumentare ad almeno venti il valore dello slider per avere almeno una linea nelle tre direzioni volute; conviene quindi partire da questo numero di base e andare poi a sfoltire le linee non desiderate o quelle in eccesso. Un’ulteriore valutazione che si può fare è che le linee rosse individuano più velocemente i punti di fuga corretti. Sarebbe interessante aggiungere in seguito due punti nella colonna della tabella; ovvero quante linee della direzione corretta sia necessario togliere e se andando a modificare i filtri e introducendo uno slider per dare la possibilità all’utente di variarli, si nota qualche cambiamento nell’individuazione delle linee. Si potrebbe anche aggiungere una riga in cui si valuta il risultato su un’immagine in cui il programma utilizza sia Sobel che Canny per individuare le linee.
  • 47. Conclusioni Dalla validazione sperimentale si evince che il metodo basato sulla trasformata di Canny dà maggiore informazione direzionale, si trovano più linee con differente direzione, mentre quello basato su Sobel spesso riesce ad individuare solo due direzioni preferenziali su tre. Purtroppo, anche utilizzando la trasformata di Hough, basata su Canny, il più delle volte non si riescono ad individuare i punti di fuga corretti. Questo è dovuto in parte alla trasformata che non individua abbastanza linee con diversa direzione ed in parte alla scelta di usare il metodo dell’intersezione per individuare le tre direzioni principali delle linee. Infatti, per immagini con poco rumore visivo (case, uffici) non ci sono problemi perché la trasformata di Hough individua correttamente le linee e sono tutte quelle che concorrono verso uno dei tre punti di fuga, anche se spesso trova due direzioni su tre. Ma se vi sono elementi di disturbo come alberi o mobilio allora iniziano le problematiche. Su rami e arbusti qualcosa si può fare andando a lavorare con i filtri per cercare di sfocare un poco l’immagine e quindi non far percepire i rami come bordi da includere nella ricerca delle linee. Per i mobili o gli arredamenti interni il problema è diverso perché spesso si tratta di pezzi squadrati e ben a fuoco nell’immagine e che in alcuni casi possono concorrere alla corretta individuazione del punto di fuga. Si è pensato allora di utilizzare l’informazione fornita dal colore ma spesso l’elemento di disturbo è dello stesso colore delle pareti che ci interessano a livello di linee, oppure è un blocco di colore diverso ma non lo si può escludere a priori non sapendo se è utile ai fini della ricerca o meno. La soluzione adottata è stata quella di far scegliere all’utente quale linea tenere e quale togliere ai fini dell’individuazione di un punto di fuga. L’utente potrà quindi eliminare le linee non volute e il software eseguirà nell’immediato una ricalibrazione con le linee rimaste. Se poi se ne vogliono aggiungere altre, il programma, nel ricalcolo, non reinserirà quelle già eliminate. Per quanto riguarda la scarsa scelta di linee da tutte e tre le direzioni, si è pensato di inglobare in un’unica ricerca le direzioni trovate tramite Sobel con quelle trovate tramite Canny, escludendo i doppioni, ma per una questione di tempo non si è riusciti ad implementarlo sul software. Si è visto che la possibilità di scartare le linee non volute migliora sensibilmente la capacità di trovare il punto di fuga, mentre sarebbe d’aiuto una maggiore variabilità di linee individuate per avere un cluster più corposo per alcune direzioni. Per fare questo un’altra soluzione potrebbe essere quella di coadiuvare la ricerca stessa con un algoritmo genetico oppure con una rete neurale.
  • 48. Appendice Strumenti In questo capitolo vengono introdotte brevemente gli strumenti utilizzati per scrivere il codice. I OpenCV OpenCV (Open Source Computer Vision Library) è una libreria software multipiattaforma nell’ambito della visione artificiale in tempo reale. Si è scelto di utilizzarla poiché principalmente è scritta in C++ e la sua prima interfaccia è il C++, linguaggio con cui è scritto il software della tesi. Inoltre, offre una struttura comune su cui gli sviluppatori da cui possono partire, in modo tale che il codice sia più leggibile e trasferibile. II GitHub GitHub, Inc. è un provider di hosting Internet basato su cloud per lo sviluppo di software e il controllo della versione tramite Git, uno specifico sistema di controllo versioni open-source creato da Linus Torvalds nel 2005. In particolare, Git è un sistema di controllo versioni distribuito, il che significa che l’intero codice base e la cronologia sono disponibili sul computer di ogni sviluppatore, il che permette di creare facilmente ramificazioni e fusioni. Il controllo delle versioni aiuta gli sviluppatori a tracciare e gestire le modifiche al codice di un progetto software. Invece, il controllo delle versioni permette agli sviluppatori di lavorare in sicurezza attraverso il branching (ramificazione) e il merging (fusione). Con il branching, uno sviluppatore duplica parte del codice sorgente (chiamato repository). Lo sviluppatore può quindi apportare in modo sicuro modifiche a quella parte del codice senza influenzare il resto del progetto. III Visual Studio Microsoft Visual Studio (o più comunemente Visual Studio) è un ambiente di sviluppo integrato sviluppato da Microsoft per lo sviluppo di applicazioni per tablet, smartphone e computer, oltre a siti e servizi web. Come il suo predecessore, Visual Studio integra la tecnologia IntelliSense che permette di correggere eventuali errori sintattici, e anche alcuni logici, senza compilare l'applicazione, possiede un debugger interno per il rilevamento e la correzione degli errori logici nel codice in runtime e fornisce diversi strumenti per l'analisi delle prestazioni. Il futuro delle applicazioni sarà basato interamente sull'integrazione tra i diversi dispostivi, mobile e fissi. I
  • 49. programmatori dovranno cambiare l'approccio allo sviluppo delle app: il layout dovrà adattarsi alla perfezione sia sul tablet sia su computer o smart Tv. Microsoft Visual Studio è tra i programmi più utilizzati per sviluppare applicazioni (code editor) e nelle ultime due versioni permette di creare applicazioni per Windows 8.1 (computer, tablet o smartphone) scrivendo il codice una sola volta.
  • 50. Bibliografia [1] Rafael C. Gonzalez - Richard E. Woods, Digital image processing (third edition), Prentice Hall, 2008. [2] Richard O.Duda and Peter E.Hart “Use of the Hough transformation to detect lines and curves in pictures”, January 1972. [2] Florian Kluger1 - Hanno Ackermann1 - Michael Ying Yang2 - Bodo Rosenhahn1, “Deep Learning for Vanishing Point Detection Using an Inverse Gnomonic Projection”, Leibniz Universit ̈at Hannover - University of Twente [3] Heechul Jung – Junggon Min – Junmo Kim, “An efficient lane detection algorithm for lane departure detection”, June 2013, Conference: Intelligent Vehicles Symposium (IV), 2013 IEEE [4] A. Rezzani, “Business Intelligence. Processi, metodi, utilizzo in azienda”, APOGEO, 2012 [5] Mehmed Kantardzic “Data Mining: Concepts, Models, Methods, and Algorithms”, John Wiley & Sons, 2003 [6] Jiawei Han, Micheline Kamber, “Data Mining:Concepts and Techniques” Second Edition, Morgan Kaufmann Publishers, 2006 [7] https://docs.opencv.org/3.4.8/d9/df8/tutorial_root.html [8] MacQueen J.B., Some Methods for Classification Analysis of Multivariate Observations, Proceedings of 5-th Berkeley Symposium on Mathematical Statistics and Probability, Berkeley, 1967, University of California Press, 1:281-297. [9] Roiger R.J., Geatz M.W., Introduzione al Data Mining, McGraw-Hill, 2004. [10] Tan P., Steinbach M., Kumar V., Introduction to Data Mining, Pearson Addison Wesley, 2005.