Ενδεικτική πολυ-εργασία 1 - εφαρμογή στην υπολογιστική όραση Εντοπισμός ενός σήματος STOP σε μια εικόνα. Περιγράψτε τη διαδικασία με την οποία μπορώ να εντοπίσω απλά σε μια εικόνα την ύπαρξη του παρακάτω σήματος, χωρίς να χρειαστεί να προβώ σε αναγνώριση γραφής. Λύση Σε πρώτη φάση πρέπει να αναλύσουμε ποια είναι εκείνα τα χαρακτηριστικά του σχήματος που το διαφοροποιούν από το περιβάλλον του (background) και άλλα σχήματα: Α) Το χρώμα (κόκκινο) Β) Το οκταγωνικό σχήμα Άρα, ως διαδικασία ανίχνευσης σχήματος, θα προσπαθήσουμε να απομονώσουμε έναν έναν τους παράγοντες που καθορίζουν το σήμα, από το γενικότερο προς το ειδικότερο. Το χρώμα είναι ένας καθοριστικός παράγοντας που μπορεί να ανιχνευθεί εύκολα. Άρα τον έλεγχο αυτό θα τον βάλουμε πρώτο. Στη συνέχεια θα πρέπει να βρούμε μια περιγραφή για το (οκταγωνικό) σχήμα. Η περιγραφή 1 Η έκταση της εργασίας αυτής είναι μεγαλύτερη από ένα τυπικό θέμα προκειμένου να έχει διδακτική αξία, κυρίως, απαντώντας σε πολλαπλά ερωτήματα κατά την πλήρη επίλυση ενός προβλήματος.
αυτή, όπως άλλωστε και σε κάθε αναπαράσταση «υπογραφής» ενός σχήματος, πρέπει να είναι αμετάβλητη 2 ως προς τον προσανατολισμό, τη θέση και το μέγεθος του αντικειμένου μέσα στην εικόνα. Ας δούμε όμως τα βήματα αυτά σε μορφή αλγορίθμου: Αρχή Απομόνωση κόκκινων περιοχών Υπάρχει κόκκινη περιοχή; ΝΑΙ Εξαγωγή περιγράμματος και υπογραφής Μοιάζει το περίγραμμα με οκτάγωνο; ΝΑΙ Βρέθηκε STOP ΟΧΙ ΟΧΙ Δε βρέθηκε Εντοπισμός Κόκκινης Περιοχής Θα εκμεταλλευτούμε το μοντέλο HSV για την αναπαράσταση χρώματος της εικόνας, ώστε με ασφάλεια να επιλέξουμε εικονοστοιχεία μόνο με βάση την απόχρωση και όχι τη φωτεινότητά τους. Αν II(xx, yy) είναι τα Pixels της αρχικής εικόνας, κάνουμε τη μετατροπή: II HHHHHH (xx, yy) = HHHHHH(II(xx, yy)). Θυμόμαστε ότι στο μοντέλο HSV η απόχρωση παριστάνεται πάνω σε έναν κύκλο, σε μοίρες. To κόκκινο χρώμα βρίσκεται στο μηδέν, οπότε αν θέλουμε να βρούμε όλα τα Pixels με «περίπου κόκκινο» χρώμα, θέλουμε να κρατήσουμε εκείνα των οποίων η τιμή H βρίσκεται κοντά στο 0, με μια ανοχή e μοιρών: ΙΙ RR (xx, yy) = 1, II HHHHHH(xx, yy). h > 360 ee ή II HHHHHH (xx, yy). h < ee 0, δδδδδδδδδδδδδδδδδδδδά Πλέον, έχουμε μηδενίσει όλες τις μη κόκκινες περιοχές και έχουμε μια δυαδική εικόνα ΙΙ RR (xx, yy) με 1 όπου είχαμε στην αρχική εικόνα κόκκινο. 2 Η προοπτική της εικόνας μεταβάλλει τις σχετικές γωνίες του σχήματος αλλά για ένα μεγάλο εύρος γωνιών, το σχήμα διατηρεί αναγνωρίσιμες γωνίες.
Ένας πρώτος έλεγχος που μπορεί να γίνει είναι να μετρήσουμε κατά πόσο η παρουσία του κόκκινου στην εικόνα είναι ισχυρή, ώστε να μπορεί να συνεπάγεται την ύπαρξη κάποιας συμπαγούς περιοχής. Αυτό μπορούμε να το κάνουμε εύκολα καταμετρώντας το ποσοστό των 1 στην ΙΙ RR (xx, yy). Αν για παράδειγμα ο συνολικός πληθυσμός τους είναι κάτω από 5% των συνολικών Pixels της εικόνας, δεν έχει νόημα να συνεχίσουμε, γιατί και να υπάρχει κάποιο σήμα σε αυτή, θα έχει πολύ μικρό περίγραμμα και δε θα μπορέσουμε να το εξάγουμε αξιόπιστα. Προς το παρόν θα υποθέσουμε ότι στην εικόνα δεν υπάρχουν πολλαπλές περιοχές ίδιου χρώματος. Στη συνέχεια θα δούμε πώς αντιμετωπίζονται αυτές (clustering). Περιγραφή Σχήματος Η κόκκινη περιοχή του σήματος περιέχει και γράμματα στο εσωτερικό της, τα οποία δεν είναι κόκκινα. Αυτά όμως δε μας δημιουργούν πρόβλημα, καθώς αν ψάχνουμε για το περίγραμμα του σχήματος, τα εσωτερικά Pixels δε θα ληφθούν υπόψη. Αυτό θα συμβεί γιατί ο κανόνας της αλυσίδας για την εξαγωγή περιγράμματος ξεκινάει από το άνω αριστερό άκρο της περιοχής, το οποίο είναι πάντα εξωτερικό Pixel. Κατά τα γνωστά, εκτελούμε ανίχνευση περιγράμματος με κανόνα αλυσίδας πάνω στη δυαδική εικόνα ΙΙ RR (xx, yy) και παίρνουμε την ακολουθία των εικονοστοιχείων που το απαρτίζουν. Μια λεπτομέρεια είναι ότι ο κανόνας της αλυσίδας μπορεί να μας επιστρέψει 2 πράγματα ως πληροφορίες: α) ποια pixels ανήκουν στο περίγραμμα και β) τη σχετική τους θέση. Αν αποφασίσουμε να χρησιμοποιήσουμε τον κανόνα αλυσίδας για εξαγωγή υπογραφής (δηλαδή το (β) ), τότε ακολουθούμε τη διαδικασία υπολογισμού του διαφορικού κώδικα αλυσίδας, όπως περιγράφεται στις σημειώσεις (με το modulo). Εδώ όμως, ξέρουμε ότι ένα σήμα (και άρα το περίγραμμά του) μέσα στην εικόνα μπορεί να φαίνεται από κοντά ή μακριά και αυτό αλλάζει τον αριθμό των pixels του περιγράμματος, καθώς το αποτύπωμα του σήματος μέσα στην εικόνα μπορεί να έχει διαφορετικό εμβαδό. Εμείς επομένως ενδιαφερόμαστε να εντοπίσουμε σχήματα με περιγράμματα μεταβλητού μήκους. Συνεπώς, η κωδικοποίηση με τον κανόνα της αλυσίδας είναι ακατάλληλη για τη δουλειά αυτή. Αντ αυτού, χρησιμοποιούμαι απευθείας τα εξαχθέντα Pixels (τις συντεταγμένες τους) πάνω στις οποίες μπορούμε να εφαρμόσουμε 2 εναλλακτικούς περιγραφείς (βλ. σημειώσεις):
Α) Πολυγωνική προσέγγιση Β) Γωνιόγραμμα Ας δούμε ποιος από τους 2 είναι πιο κατάλληλος για τη δουλειά μας. Αν πάρουμε πολυγωνική προσέγγιση, η παράμετρος που την αφορά είναι το κατώφλι απόστασης κάτω από το οποίο παύουμε να υποδιαιρούμε τις τεθλασμένες γραμμές. Εύκολα διαπιστώνουμε ότι όσο μικραίνουμε το κατώφλι, τόσο καλύτερα προσεγγίζουμε τη τεθλασμένη γραμμή του οκταγώνου. Όμως, το κατώφλι αυτό εξαρτάται από το μέγεθος του σήματος μέσα στην εικόνα, οπότε για διαφορετικό zoom θα χρειαζόμαστε άλλο κατώφλι. Επιπλέον, ένα μη ακριβές περίγραμμα οκταγώνου (βλ. δεξιά εικόνα) μοιάζει πολύ με το αντίστοιχο ενός κυκλικού σήματος. Άρα, το συμπέρασμα είναι ότι η διαχωρισιμότητα του πολυγωνικού περιγράμματος ως περιγραφέα, δεν είναι μεγάλη. Συνεπώς, μάλλον δεν είναι ο καταλληλότερος περιγραφέας για τη συγκεκριμένη εφαρμογή, όπου σίγουρα θα έχουμε και κυκλικά σχήματα στην εικόνα μας. Με βάση το γωνιόγραμμα, η ακολουθία των εικονοστοιχείων που βρήκαμε από την εξαγωγή περιγράμματος μετατρέπεται εύκολα σε περιγραφέα. Θυμίζουμε ότι στο γωνιόγραμμα, κάνουμε τα ακόλουθα βήματα: Βρίσκουμε το κέντρο βάρους (μέσο όρο) των Pixels bb ii = (xx ii, yy ii ) του περιγράμματος cc = 1 bb ΝΝ ΝΝ ii. Χωρίζουμε τον οριζόντιο άξονα σε μια διακριτοποίηση των γωνιών του κύκλου (π.χ. ανά 1-2 μοίρες). Για κάθε Pixel του περιγράμματος, βρίσκουμε τη γωνία θθ ii που σχηματίζει το διάνυσμα bb ii cc: θθ ii = atan (yy ii yy cc, xx ii xx cc ) Για κάθε διακριτή γωνία που αποθηκεύουμε, κρατάμε τη μέγιστη καταγεγραμμένη απόσταση, δηλαδή το γωνιόγραμμα αναπαριστά τις αποστάσεις από τα εξωτερικά σημεία του σχήματος. Αν το σχήμα περιέχει αναδιπλώσεις και κόλπους, αυτά αγνοούνται. Για την περίπτωση των σχημάτων που έχουμε, αυτό δε μας επηρεάζει, καθώς τα σχήματα που θέλουμε να ανιχνεύσουμε είναι κυρτά, δηλαδή τα σημεία με μεγαλύτερη απόσταση από το κέντρο, απαρτίζουν το περίγραμμα και το αντίστροφο.
Το γωνιόγραμμα του σχήματός μας είναι μια συνάρτηση, η οποία λόγω του σχήματος του περιγράμματος θα διαθέτει 8 ισαπέχουσες (περίπου) κορυφές, παρόμοιου ύψους. Για να βγάλουμε από το πρόβλημά μας τον παράγοντα της κλίμακας, κανονικοποιούμε το γωνιόγραμμα με βάση τη μέγιστη κορυφή (μέγιστη τιμή δηλαδή). Είμαστε πλέον έτοιμοι να συγκρίνουμε την υπογραφή μας, δηλαδή το γωνιόγραμμα, με την αντίστοιχη υπογραφή ενός πρότυπου οκταγώνου, την οποία και έχουμε αποθηκευμένη. 1.4 1.0 0 360 0 360 Κατηγοριοποίηση Σχήματος Για να συγκρίνουμε την υπογραφή του πρότυπου με το περίγραμμα που βρήκαμε, δεν αρκεί να συγκρίνουμε κατά μέλη τις δύο υπογραφές. Αυτό συμβαίνει γιατί η περιστροφή και παραμόρφωση του σχήματος λόγω προοπτικής θα δώσει γωνιογράμματα με ολισθημένη την πληροφορία. Για να λύσουμε το πρόβλημα, παίρνουμε την πράξη της συσχέτισης μεταξύ των δύο υπογραφών και αν η μέγιστη τιμή της ξεπερνάει ένα κατώφλι, τότε έχουμε εντοπίσει ένα οκτάγωνο στην εικόνα μας και άρα το σήμα που ψάχνουμε. Για διαμέριση γωνιών κατά μια μοίρα: 359 cccccc(oooooo, ff)(kk) = oooooo( kk)ff( (kk + ii) mmmmmm 360) ii=0 iiii kk: cccccc(oooooo, ff)(kk) > tthrrrrrr, ttheeee ffffffffff mmmmmmmmh! 0 360 0 360 Πρότυπο οκτάγωνο Περίγραμμα σχήματος Επέκταση: Πως θα απομονώσω το σήμα στην εικόνα παρουσία άλλων κόκκινων περιοχών; Για την ανίχνευση του σχήματος, αν θέλουμε να γενικεύσουμε το πρόβλημα δεχόμενοι την ανίχνευση πολλαπλών κόκκινων περιοχών στην εικόνα, τότε πρέπει να κάνουμε τα ακόλουθα:
Να εντοπίσουμε όλες τις συμπαγείς περιοχές Να απορρίψουμε αυτές που είναι πολύ μικρές Να εφαρμόσουμε σε κάθε μια την παραπάνω μέθοδο Για να εντοπίσουμε πολλαπλές συμπαγείς γειτονιές από 1 (έχουμε ήδη απομονώσει τα κόκκινα pixels και τα έχουμε χαρακτηρίσει με 1, ενώ τα υπόλοιπα με 0) εφαρμόζουμε έναν εύκολο greedy αλγόριθμο flood fill με βάση τη γειτονιά, π.χ. με N4 γειτονιά: Επισκεπτόμαστε ένα Pixel με τιμή 1. Αν to pixel δεν είναι μαρκαρισμένο (δηλ. δεν το έχουμε επισκεφτεί), δημιουργούμε μια νέα περιοχή και εντάσσουμε το pixel σε αυτή. Εξετάζουμε όλους τους γείτονές του (N4). Όσο δεν είναι μαρκαρισμένοι τους βάζουμε κι αυτούς στην περιοχή και αναδρομικά εξετάζουμε και τους δικούς τους γείτονες μέχρι όλοι να είναι μαρκαρισμένοι ή 0. Όσο υπάρχουν αμαρκάριστα Pixels, επαναλαμβάνουμε τα παραπάνω βήματα. Με το πέρας της διαδικασίας έχουμε χωρίσει την εικόνα σε ομάδες (clusters) συνδεδεμένων περιοχών. Για κάθε μια εφαρμόζουμε την εξαγωγή περιγράμματος, υπολογισμό υπογραφής και σύγκριση με το περίγραμμα του οκταγώνου.