ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 1 ΒΑΣΙΚΟΙ ΧΕΙΡΙΣΜΟΙ ΕΙΚΟΝΑΣ Αντικείμενο: Εισαγωγή στις βασικές αρχές της ψηφιακής επεξεργασίας εικόνας χρησιμοποιώντας το MATLAB και το πακέτο Επεξεργασίας Εικόνας. Περιγραφή και αναπαράσταση των διαφόρων τύπων εικόνας που υποστηρίζονται από το MATLAB. Περιγραφή των βασικών αρχών επεξεργασίας των δεδομένων εικόνας και των συστημάτων συντεταγμένων. 1. Εισαγωγή: Ο γενικός όρος Ψηφιακή Επεξεργασία Εικόνας (Digital Image Processing) χρησιμοποιείται για να περιγράψει την διαδικασία επεξεργασίας μιας εικόνας (ή γενικότερα ενός σήματος δύο διαστάσεων) από έναν ψηφιακό υπολογιστή. Η ψηφιακή εικόνα είναι μια διάταξη πραγματικών ή μιγαδικών αριθμών που αναπαρίστανται με ένα πλήθος πεπερασμένων δυαδικών ψηφίων (bits). Η διαδικασία λήψης της ψηφιακής (digital) εικόνας από την πραγματική (actual) περιλαμβάνει τα στάδια της δειγματοληψίας (ή ψηφιοποίησης), και της αποθήκευσης στην μνήμη του Η/Υ με την μορφή ενός πίνακα δυαδικών ψηφίων (bytes). Η ψηφιακή εικόνα μπορεί πλέον να δεχτεί οποιαδήποτε μορφή επεξεργασίας και να εμφανιστεί στην οθόνη ενός υπολογιστή. Η εικόνα 1 παρουσιάζει μια τυπική ακολουθία επεξεργασίας μιας εικόνας. Σύστημα Εισαγωγής Εικόνας Δειγματοληψία και κβάντιση Αποθήκευση Η/Υ Εικόνα Αρχείο Εικόνα 1. Τυπικό Σύστημα Επεξεργασίας Εικόνας 2. Τύποι εικόνων. Το MATLAB υποστηρίζει τέσσερις βασικούς τύπους εικόνας. I. Εικόνες δείκτη (Indexed images) II. Εικόνες φωτεινότητας (Intensity images) III. Δυαδικές εικόνες (Binary images) IV. Εικόνες πραγματικού χρώματος (RGB images)
3. Εικόνες δείκτη. Οι εικόνες δείκτη (indexed images) αποτελούνται από έναν πίνακα Χ και από έναν πίνακα απεικόνισης χρώματος που ονομάζεται colormap. Ο πίνακας colormap είναι διαστάσεως m 3 και περιέχει πραγματικές τιμές με δυνατό εύρος στο διάστημα [0, 1]. Κάθε γραμμή του πίνακα καθορίζει τις εντάσεις των τριών βασικών χρωμάτων δηλαδή του κόκκινου, του μπλε και του κίτρινου, καθορίζοντας έτσι και πιο συνολικά χρώμα αντιστοιχεί στο επιλεγμένο pixel. Μια εικόνα δείκτη χρησιμοποιεί την άμεση απεικόνιση των pixels στον πίνακα colormap. Η τιμή του pixel χρησιμοποιείται για να δείξει τον δείκτη της γραμμής στον πίνακα colormap. Π.χ, η τιμή 1 δείχνει στην πρώτη γραμμή του πίνακα colormap, η τιμή 2 δείχνει στην δεύτερη γραμμή του πίνακα κ.λ.π. Αν και ο πίνακας colormap είναι συνήθως αποθηκευμένος μαζί με την εικόνα έχουμε την δυνατότητα να αλλάξουμε την σύνθεσή του. Η εικόνα 2 παρουσιάζει την δομή μιας εικόνας δείκτη. Όπως φαίνεται, η εικόνα έχει τιμές οι οποίες χρησιμοποιούνται σαν δείκτες. Δηλαδή δείχνουν την γραμμή του ήδη υπάρχοντος πίνακα colormap. Εικόνα 2. Δομή μιας εικόνας δείκτη. 3. ΙΙ. Εικόνες φωτεινότητας. Οι εικόνες φωτεινότητας αποτελούνται από έναν πίνακα δεδομένων Ι, του οποίων οι τιμές είναι ανάλογες με τις εντάσεις της φωτεινότητας της εικόνας. Κάθε στοιχείο του πίνακα αντιστοιχεί σε ένα pixel της εικόνας. Οι τύποι δεδομένων που υποστηρίζονται είναι unit8, uint16, double. Τα στοιχεία ενός πίνακα φωτεινότητας αναπαριστούν διάφορες διαβαθμίσεις του γκρίζου. Η τιμή 0 αναπαριστά το μαύρο ενώ οι τιμές (ανάλογα με τον τύπο των δεδομένων) 1, 255, 65535 αναπαριστούν την μέγιστη φωτεινότητα, δηλαδή το λευκό χρώμα. Η εικόνα 3 δείχνει μια εικόνα φωτεινότητας τύπου διπλής ακρίβειας (double). 2
Εικόνα 3. Δομή μιας εικόνας φωτεινότητας. 3. ΙΙΙ. Δυαδικές Εικόνες. Στις δυαδικές εικόνες κάθε pixel λαμβάνει είτε την τιμή 0 (μαύρο) είτε την τιμή 1 (λευκό). Μια δυαδική εικόνα μπορεί να θεωρηθεί ως μια ειδική περίπτωση της εικόνας φωτεινότητας όπου όλες οι τιμές είναι είτε 0 είτε 1. Η εικόνα 4 δείχνει ένα παράδειγμα μιας δυαδικής εικόνας. Εικόνα 4. Δυαδική εικόνα. 3. ΙV. Εικόνα πραγματικού χρώματος. Μια εικόνα πραγματικού χρώματος (ή αλλιώς μια RGB εικόνα) μπορεί να είναι είτε τύπου double, είτε τύπου uint8, είτε τύπου uint16. Π.χ σε μια RGB εικόνα τύπου double, κάθε στοιχείο χρώματος μπορεί να πάρει τιμές μεταξύ 0 και 1. Η τριάδα (0,0,0) αντιστοιχεί στο μαύρο χρώμα ενώ η τριάδα (1,1,1) αντιστοιχεί στο λευκό. Η πληροφορία των χρωμάτων υπάρχει στην τρίτη διεύθυνση του 3
τρισδιάστατου πίνακα. Έτσι η τιμή του χρώματος του pixel με συντεταγμένες (10,5) είναι αποθηκευμένη στα στοιχεία RGB(10,5,1), RGB(10,5,2), και RGB(10,5,3), αντίστοιχα. Η εικόνα 5 αντιστοιχεί σε μια εικόνα πραγματικού χρώματος. Παρατηρούμε ότι για να δούμε την τιμή του χρώματος στο σημείο (2,3) κοιτάμε την τριπλέτα σημείων (2,3,1:3). Έτσι, η τιμή του χρώματος στο συγκεκριμένο σημείο είναι: (0.5176 0.1608 0.0627). Εικόνα 5. RGB αναπαράσταση εικόνας. 4. Σύστημα αναφοράς εικονοστοιχείων (pixels). Οι θέσεις μιας εικόνας στο MATLAB μπορούν να εκφραστούν με την βοήθεια διαφόρων συστημάτων αναφοράς (συντεταγμένων). Το πιο εύχρηστο σύστημα αναφοράς είναι το σύστημα αναφοράς των εικονοστοιχείων (pixel coordinate system). Σε αυτό η εικόνα απεικονίζεται ως ένα πλέγμα διακριτών στοιχείων, διατεταγμένων από πάνω προς τα κάτω και από αριστερά προς τα δεξιά. Η εικόνα 6 για παράδειγμα παρουσιάζει το σύστημα αναφοράς εικονοστοιχείων: Εικόνα 6. Σύστημα αναφοράς εικονοστοιχείων. Στην παραπάνω εικόνα, η μεταβλητή r (γραμμή) αυξάνεται με φορά προς τα κάτω ενώ η μεταβλητή c (στήλη) αυξάνεται προς τα δεξιά. Οι συνιστώσες των pixels 4
έχουν πάντα ακέραιες τιμές από 1 μέχρι το ολικό μήκος της γραμμής και της στήλης. Σύμφωνα με τα παραπάνω, μπορούμε να καταλάβουμε ότι το δεδομένο του εικονοστοιχείου στην πέμπτη σειρά και στην δεύτερη στήλη θα είναι αποθηκευμένο στο στοιχείο (5,2) του εκάστοτε πίνακα αναπαράστασης της εικόνας. Για τον υπολογισμό της διάστασης του πίνακα μπορούμε να χρησιμοποιήσουμε την εντολή size() του MATLAB. 5. Συναρτήσεις εισόδου εξόδου. Το MATLAB παρέχει διάφορες εντολές οι οποίες: (α) διαβάζουν από τον δίσκο μια εικόνα, (β) εγγράφουν στον δίσκο μια εικόνα και (γ) εμφανίζουν τα περιεχόμενά της στην οθόνη. Τα πρότυπα που υποστηρίζει το ΜΑΤLAB είναι: BMP (Microsoft Windows Bitmap) HDF (Hierarchical Data Format) JPEG (Joint Photographic Experts Group) PCX (Paintbrush) PNG (Portable Network Graphics) TIFF (Tagged Image File Format) XWD (X Window Dump) Η ανάγνωση των εικόνων γίνεται χρησιμοποιώντας κυρίως την εντολή imread(). H σύνταξή της είναι: A = IMREAD(FILENAME,FMT) Όπου FILENAME είναι το όνομα του αρχείου εικόνας που θέλουμε να διαβάσουμε (πάντα ανάμεσα σε απλά εισαγωγικά) και FMT ο τύπος του προτύπου της εικόνας. Για παράδειγμα, η εντολή: RGB = imread('ngc6543a.jpg'); αναθέτει στον πίνακα με όνομα RGB το αποτέλεσμα της ανάγνωσης της εικόνας με όνομα αρχείου ngc6543a.jpg ενώ η εντολή: [x, map] = imread('clown.bmp'); αναθέτει στον πίνακα με όνομα x το αποτέλεσμα της ανάγνωσης της εικόνας με όνομα αρχείου clown.bmp και στον πίνακα με όνομα map τον πίνακα απεικόνισης χρώματος (colormap). Μια χρήσιμη συνάρτηση ανάγνωσης εικόνας είναι και η συνάρτηση bmpread(). Αναζητήστε πληροφορίες στο MATLAB με την χρήση της εντολής help. Για την αποθήκευση εικόνων σε ένα αρχείο μπορούμε να χρησιμοποιήσουμε την εντολή imwrite(). Η σύνταξή της έχει την μορφή: IMWRITE(A,FILENAME,FMT) όπου τα ορίσματα αντιπροσωπεύουν κατά σειρά τον πίνακα εικόνας, το όνομα του αρχείου και τον τύπο του προτύπου. Έτσι η εντολή imwrite(x,map,'c:\clown.bmp', 'bmp') 5
θα αποθηκεύσει στον βασικό κατάλογο του σκληρού δίσκου ένα αρχείο με όνομα clown.bmp που θα περιέχει την εικόνα δείκτη (X, map) κατά το πρότυπο windows bitmap. Μια πολύ χρήσιμη συνάρτηση στο MATLAB είναι η συνάρτηση imfinfo(). Η σύνταξή της έχει την μορφή: INFO = IMFINFO(FILENAME,FMT) Και παρέχει όλες τις απαραίτητες πληροφορίες για την εικόνα όπως: Όνομα αρχείου και κατάλογος τοποθεσίας. Τύπος εικόνας Αριθμός έκδοσης τύπου εικόνας Ημερομηνία τροποποίησης αρχείου Μέγεθος αρχείου σε bytes Μέγεθος εικόνας σε pixels Αριθμός bits ανά pixel. Η απεικόνιση μιας εικόνας στην οθόνη γίνεται με την βοήθεια της συνάρτησης imshow(). Ο πίνακας 1 παρουσιάζει τις δυνατές κλήσεις της imshow(). Κλήση Πίνακας 1. Δυνατοί τρόποι κλήσης της συνάρτησης imshow(). συνάρτησης imshow(x,map) imshow(i) imshow(rgb) imshow(r,g,b) imshow(bw) Λειτουργία Απεικόνιση στην οθόνη μιας εικόνας δείκτη. Απεικόνιση στην οθόνη μιας εικόνας φωτεινότητας Απεικόνιση στην οθόνη μιας εικόνας πραγματικού χρώματος είτε με την μορφή ενός τρισδιάστατου πίνακα είτε με την μορφή τριών δισδιάστατων πινάκων. Απεικόνιση στην οθόνη μιας δυαδικής εικόνας Χρήσιμη επίσης είναι και η συνάρτηση colorbar(). Χρησιμοποιείται για να απεικονίσει την αντιστοιχία τιμών και χρωμάτων. Π.χ, ο ακόλουθος κώδικας θα παρουσιάσει στην οθόνη το ακόλουθο αποτέλεσμα: clear all close all [x,map]=imread('trees.tif'); imshow(x,map), colorbar 6
6. Μετατροπές τύπων εικόνας. Κατά την επεξεργασία μιας εικόνας είναι χρήσιμο αρκετές φορές να μετατρέπουμε την αρχική μας εικόνα από έναν τύπο σε έναν άλλο. Για παράδειγμα, αν επιθυμούμε να επεξεργαστούμε μια εικόνα πραγματικού χρώματος η οποία είναι αποθηκευμένη σε ένα τύπο εικόνας δείκτη θα πρέπει να πρώτα να την μετατρέψουμε σε μια εικόνα τύπου πραγματικού χρώματος. Αν επιχειρήσουμε να επεξεργαστούμε (φιλτράρουμε) την αρχική εικόνα δείκτη απ ευθείας θα εφαρμόζαμε το σύστημα μας στις αντίστοιχες τιμές των δεικτών της εικόνας. Αυτό μπορεί να παράγει αποτελέσματα που δεν θα είχαν καμιά σχέση με το ζητούμενο αποτέλεσμα. Είναι προφανές ότι η διαδικασία μετατροπής ενός τύπου εικόνας σε έναν άλλο θα έχει ως αποτέλεσμα την αλλαγή της πληροφορίας της εικόνας. Π.χ, η μετατροπή μιας εικόνας πραγματικού χρώματος σε μια εικόνα φωτεινότητας θα μας δώσει μια εικόνα με διαβαθμίσεις του γκρίζου. Οι κυριότερες συναρτήσεις μετατροπής παρουσιάζονται στον πίνακα 2. Πίνακας 2. Συναρτήσεις μετατροπής τύπου εικόνας Συνάρτηση gray2ind ind2gray ind2rgb rgb2ind rgb2gray im2bw Λειτουργία Μετατρέπει μια εικόνα φωτεινότητας σε μια εικόνα δείκτη Μετατρέπει μια εικόνα δείκτη σε μια εικόνα φωτεινότητας Μετατρέπει μια εικόνα δείκτη σε μια εικόνα πραγματικού χρώματος Μετατρέπει μια εικόνα πραγματικού χρώματος σε μια εικόνα δείκτη Μετατρέπει μια εικόνα πραγματικού χρώματος σε μια εικόνα φωτεινότητας Μετατρέπει μια εικόνα φωτεινότητας σε μια δυαδική εικόνα 7
ΕΡΓΑΣΤΗΡΙΑΚΗ ΔΙΑΔΙΚΑΣΙΑ 1. Χρησιμοποιήστε την εντολή imfinfo και καταγράψτε συγκριτικά όλα τα στοιχεία των εικόνων του φάκελου images_for_lab ή lab_images. Χρησιμοποιήστε την συνάρτηση imshow και αναφέρατε ποιές από τις εικόνες παρουσιάζουν ασυνέπειες μεταξύ του τύπου δεδομένων και τις απεικόνισής τους. (Π.χ: μερικές εικόνες αν και είναι true - color απεικονίζονται στην οθόνη με αποχρώσεις του γκρί). 2. Χρησιμοποιείστε την εντολή load trees για να φορτώσετε στην μνήμη μια έτοιμη εικόνα τύπου δείκτη. α) Απεικονίστε την. β) Χρησιμοποιείστε την εντολή rand για να αλλάξετε τα χρώματα του πίνακα map ως εξής: i. Το 1% των χρωμάτων σε κάθε στήλη ξεχωριστά και ανεξάρτητα. ii. Το 1% των χρωμάτων και στις 3 στήλες. iii. Το 5% των χρωμάτων σε κάθε στήλη ξεχωριστά και ανεξάρτητα. iv. Το 5% των χρωμάτων και στις 3 στήλες. v. Το 10% των χρωμάτων σε κάθε στήλη ξεχωριστά και ανεξάρτητα. vi. Το 10% των χρωμάτων και στις 3 στήλες. vii. Το 20% των χρωμάτων σε κάθε στήλη ξεχωριστά και ανεξάρτητα. viii. Το 20% των χρωμάτων και στις 3 στήλες. ix. Το 100% των χρωμάτων σε κάθε στήλη ξεχωριστά και ανεξάρτητα. x. Το 100% των χρωμάτων και στις 3 στήλες. Απεικονίστε σε καθεμία από τις παραπάνω περιπτώσεις την προκύπτουσα εικόνα. 3. Φορτώστε την εικόνα einstein.bmp. i. Απεικονίστε το εικόνα με το επίπεδο του κόκκινου. ii. Απεικονίστε το εικόνα με το επίπεδο του πράσινου. iii. Απεικονίστε το εικόνα με το επίπεδο του μπλέ. iv. Αλλάξτε με την κατάλληλη χρήση της εντολή rand όλα τα pixel του επιπέδου του κόκκινου ώστε να απέχουν ±10% από την αρχική (κεντρική) τιμή του. v. Αλλάξτε με την κατάλληλη χρήση της εντολή rand όλα τα pixel του επιπέδου του πράσινου ώστε να απέχουν ±10% από την αρχική (κεντρική) τιμή του. vi. Αλλάξτε με την κατάλληλη χρήση της εντολή rand όλα τα pixel του επιπέδου του μπλε ώστε να απέχουν ±10% από την αρχική (κεντρική) τιμή του. vii. Εμφανίστε το τελικό αποτέλεσμα της εικόνας. 4. Φορτώστε την εικόνα one_drachma.bmp. Απομονώστε μόνο το ένα επίπεδο της. i. Σχεδιάστε τα 8 επίπεδα bitplanes της εικόνας. 8
ii. Μηδενίστε, ξεκινώντας από το επίπεδο που περιέχει το λιγότερο σημαντικό ψηφίο, ένα - ένα τα επίπεδα και ανασυνθέστε κάθε φορά την εικόνα. 5. Φορτώστε την εικόνα saturn.png. i. Υποδειγματοληπτείστε την κατά τον οριζόντιο άξονα με συντελεστή 2. Απεικονίστε την νέα εικόνα. ii. Υποδειγματοληπτείστε την κατά τον κατακόρυφο άξονα με συντελεστή 2. Απεικονίστε την νέα εικόνα. iii. Υποδειγματοληπτείστε την κατά τον οριζόντιο και κατακόρυφο άξονα με συντελεστή 2. Απεικονίστε την νέα εικόνα. 6. Φορτώστε την εικόνα lena.bmp. Απομονώστε μόνο το ένα επίπεδο της. i. Εμφανίστε την εικόνα όταν χρησιμοποιήσουμε κβάντιση 64 σταθμών. ii. Εμφανίστε την εικόνα όταν χρησιμοποιήσουμε κβάντιση 32 σταθμών. iii. Εμφανίστε την εικόνα όταν χρησιμοποιήσουμε κβάντιση 16 σταθμών. iv. Εμφανίστε την εικόνα όταν χρησιμοποιήσουμε κβάντιση 8 σταθμών. v. Εμφανίστε την εικόνα όταν χρησιμοποιήσουμε κβάντιση 4 σταθμών. vi. Εμφανίστε την εικόνα όταν χρησιμοποιήσουμε κβάντιση 2 σταθμών. 7. Δημιουργήστε κώδικα MATLAB που θα δημιουργεί εικόνα με θέμα: i. Μία τρίλιζα. ii. Μια σκακιέρα iii. Την ελληνική σημαία. iv. Ότι σας αρέσει. 9