Rilevare i bordi degli oggetti di un'immagine è un compito relativamente semplice, pur essendo un' operazione che comporta alcune insidie e necessiti della conoscenza di strumenti non banali. In letteratura si trova moltissimo materiale che tratta di questo argomento. Per raggiungere questo obiettivo eseguirò i seguenti passi in questo ordine:
trasformazione dell'immagine in tonalità di grigio;
applicazione di un filtro all'immagine (smooting con filtro di Canny);
applicazione delll'algoritmo di rilevazione dei bordi (algoritmo di edge detector);
assottigliamento allo spessore di 1 pixel dei bordi rilevati.
1.1 Dai colori alla scala di grigi
Ci sono svariati algoritmi utili per trasformare un'immagine a colori in toni di grigio, per le nostre finalità (non di visualizzazione) va benissimo fare la media delle tre componenti RGB e normalizzare il risultato a 8bit di profondità (ovvero 256 colori). Il risultato è visibile in figura.
FIGURA 2 : Conversione da colori a scala di grigi
1.2 Applicazione del filtro di Canny
Prima di passare alla rilevazione dell'immagine è bene “togliere gli spigoli” all'immagine (in inglese smoothing), o meglio filtrare l'immagine in modo da rendere l'effetto del rumore il meno invadente possibile. Per fare ciò convolveremo l'immagine (che non è nientaltro che una matrice di pixel) con un'altra matrice (detta kernel) che non è nient'altro che una matrice i cui punti definiscono una campana gaussiana bidimensionale (filtro di Canny). Detta così forse a molti non è del tutto chiaro, l'approfondimento lo si lascia al lettore volenteroso.
L'immagine che si otterrà con un kernel 7x7 (senza direzione preferenziale della campana di Gauss) è riportata sotto.
FIGURA 3 : Applicazione dello smoothing
1.3 Algoritmo di edge detection
Il pezzo forte di questo paragrafo arriva ora, per ottenere i bordi di un'immagine si fa un'operazione decisamente semplice da spiegare, ovvero si cercano gli “scalini” di colore, ovvero si cerca ove c'è una repentina variazione della profondità di grigio. Lo strumento matematico adatto per questa operazione è la derivata, che nel mondo discreto si riduce a nient'altro che ad una differenza fra un punto ed i suoi vicini. Semplice no? Poi, per decidere quali sono i punti di bordo e quali no, si procede ad una sogliatura e così si ottiene l'immagine che segue.
FIGURA 4: Edge detection
Da notare che ora l'immagine è divenuta binaria (ovvero in bianco e nero).
Nella scansione di sogliatura dell'immagine si procede anche a tagliare la cornice di qualche punto (ovvero mettere a “nero” i punti al limitare dell'immagine) in quanto l'edge detector ai margini rileva sempre una discontinuità.
1.4 Assottigliamento dei bordi
Si vuole che i bordi siano spessi 1 pixel e si vuole preservarne la lunghezza. L'algoritmo si basa sul cancellare tutti i punti bianchi che non effettuano una disconnessione, ovvero cancellando tale punto non scindo in due gruppi i punti bianchi adiacenti.
Ora abbiamo l'immagine finale di questo passo.
FIGURA 5 : Immagine contenente i bordi spessi un pixel della figura di partenza
Bella, no?
Questa era la parte semplice, passiamo alle altre due sfide, innanzitutto troviamo la griglia!