Title: Επεξεργασία Εικόνας Post by: chggr005 on September 05, 2006, 00:34:17 am Στο τόπικ αυτό θα παρουσιάσω μερικά δισδιάστατα φίλτρα και τα αποτελέσματά της εφαρμογής τους σε μία εικόνα. Νομίζω πως στο μάθημα "Ψηφιακά φίλτρα" ασχολούμαστε πολύ λίγο με την επεξεργασία εικόνας και συγκεκριμένα εξετάζουμε μονάχα το θεωρητικό κομμάτι και όχι το πρακτικό. Αυτή η έλλειψη είναι κατά την γνώμη μου πολύ σημαντική, διότι μονάχα με την πράξη μπορεί κανείς να καταλάβει την θεωρία. Το τόπικ αυτό έχει ως στόχο την κάλυψη αυτής της έλλειψης.
Η εικόνα που θα χρησιμοποιηθεί για επεξεργασία επισυνάπτεται παρακάτω. Στην εικόνα φαίνεται ο Όλυμπος... Για την επεξεργασία θα χρησιμοποιηθεί το πρόγραμμα Matlab. Οι εντολές που χρησιμοποιούνται θα αναγράφονται σε κάθε βήμα. Title: Re: Επεξεργασία Εικόνας Post by: chggr005 on September 05, 2006, 00:35:47 am Ένα πρώτο "εύκολο" φίλτρο που μπορεί να εφαρμοστεί σε μία εικόνα, είναι η αύξηση της τιμής του κάθε pixel κατά μία σταθερά. Αυτό μπορεί να υλοποιηθεί πολύ εύκολα ως εξής: M(i,j) = M(i,j) + k, όπου k η σταθερά που θέλουμε. Όσο μεγαλύτερο το k τόσο πιο φωτεινή θα είναι η εικόνα μας.
Μία παραλαγή του φίλτρου αυτού είναι η εξής: M(i,j) = M(i,j) + k*i ή M(i,j) = M(i,j) + k*j. Όπως θα έχετε καταλάβει, τα δύο αυτά φίλτρα εισάγουν μεταβλητή φωτεινότητα στην εικόνα οριζοντίως και καθέτως. Για παράδειγμα μπορεί η εικόνα να είναι πιο σκοτεινή στα αριστερά και καθώς κινούμαστε προς τα δεξιά να γίνεται φωτεινότερη. Επειδή τα φίλτρα αυτά είναι πολύ απλά και εύκολα, δεν δημοσιεύω φωτογραφίες. Ας δούμε πιο "σοβαρά" φίλτρα... Title: Re: Επεξεργασία Εικόνας Post by: chggr005 on September 05, 2006, 00:39:20 am Τα ψηφιακά φίλτρα που μπορούν να εφαρμοστούν σε εικόνες είναι πολλών ειδών και διαφορετικών μεγεθών. Τα πιο δημοφιλή είναι εκείνα που έχουν μέγεθος 3x3, κι αυτό γιατί μπορούν να χρησιμοποιηθούν εύκολα και γρήγορα. Τέτοιου είδους φίλτρα θα εξετάσουμε εδώ.
Ένα ψηφιακό φίλτρο 3x3 που μπορεί να εφαρμοστεί στην παραπάνω εικόνα είναι το εξής: 0, 0, 0 0, 1, 0 0, 0, -0.8 Ουσιαστικά δηλαδή, σε κάθε πίξελ M(i,j) αφαιρούμε το 0.8 της τιμής του πίξελ που βρίσκεται στην θέση M(i+1,j+1). Τα αποτελέσματα της επεξεργασίας αυτής φαίνονται στην παρακάτω εικόνα. Όπως βλέπουμε η διεργασία αυτή παράγει την οπτική ψευδαίσθηση ότι η φωτογραφία γίνεται τρισδιάστατη και μερικά αντικείμενά της είναι πιο κοντά απο κάποια άλλα. Αρκετά εντυπωσιακό. Ο κώδικας MATLAB που χρησιμοποιήθηκε είναι: M = imread('C:\Initial Image.jpg'); test = M; for k=1:3 for i=1:510 for j=1:767 test (i,j,k) = M(i,j,k) - 0.8*M(i+1, j+1, k) + 40; end end end imwrite(test,'C:\3D Effect.jpg','jpg'); Aρχικά διαβάζεται το αρχείο της εικόνας και δημιουργείται ο τρισδιάστατος πίνακας Μ. Ο πίνακας αυτός περιέχει την εικόνα μας σε μορφή RGB, δηλαδή ουσιαστικά τρεις διαφορετικές εκδόσεις της ίδιας εικόνας για κάθε βασικό χρώμα (Red, Green, Blue) που εάν συνδιαστούν μας δίνουν την αρχική εικόνα. Η επεξεργασία θα γίνει σε έναν βοηθητικό πίνακα με το όνομα test που αρχικά τίθεται ίσος με τον Μ. Ο πρώτος βρόγχος for υποδηλώνει ότι η επεξεργασία θα γίνει και στις τρεις "υποεικόνες" Red, Green, Blue, ενώ οι δύο άλλοι βρόγχοι διατρέχουν την εικόνα κατά μήκος - 1 και κατά πλάτος - 1. Το -1 είναι απαραίτητο για να μην εμφανιστούν λάθη στους δείκτες των πινάκων. Όπως βλέπουμε το φίλτρο αυτό υλοποιείται πολύ εύκολα και στο τέλος προσθέτουμε τον αριθμό 40 για να αυξηθεί η φωτεινότητα της τελικής φωτογραφίας (σύμφωνα και με το προηγούμενο ποστ) Φιλική συμβουλή: Οι εικόνες που χρησιμοποιείτε καλό θα είναι να μην είναι πολύ μεγάλες, διότι ο χρόνος εκτέλεσης του προγράμματος Matlab θα αυξηθεί πολύ. Το συγκεκριμένο πρόγραμμα σε έναν υπολογιστή Pentium 2,4 GHz χρειάστηκε 2 λεπτά περίπου. Title: Re: Επεξεργασία Εικόνας Post by: chggr005 on September 05, 2006, 00:43:52 am Ένα άλλο φίλτρο που μπορεί να χρησιμοποιηθεί είναι το εξής:
-1/8, -1/8, -1/8 -1/8, 1, -1/8 -1/8, -1/8, -1/8 Πρόκειται ουσιαστικά για ένα χαμηλοπερατό φίλτρο, το οποίο "αφαιρεί" λεπτομέρειες από την εικόνα. Όπως ξέρουμε οι λεπτομέρειες κάθε εικόνας βρίσκονται στις υψηλές συχνότητες. Η μονάδα στο παραπάνω φίλτρο μπορεί να αντικατασταθεί και με διαφορετικές τιμές, όπως για παράδειγμα 0.6 (εικόνα Lpf 2) ή 0.2 (εικόνα Lpf 3). Στην τελική εικόνα έχει αφαιρεθεί σχεδόν όλη η πληροφορία!! Ο κώδικας Matlab που χρησιμοποιήθηκε είναι: M = imread('C:\Initial Image.jpg'); test = M; for k=1:3 for i=2:510 for j=2:767 test(i,j,k) = M(i,j,k) - 1/8*(M(i-1,j-1,k)+ M(i-1,j,k)+M(i-1,j+1,k) + M(i,j-1,k) + M(i,j+1,k) + M(i+1,j-1,k) + M (i+1,j,k) + M(i+1,j+1,k)) ; end end end imwrite(test,'C:\Lpf 1.jpg','jpg') end Title: Re: Επεξεργασία Εικόνας Post by: chggr005 on September 05, 2006, 00:45:48 am Τέλος, θα δούμε και ένα HPF, δηλαδή υψιπερατό φίλτρο που ουσιαστικά αναδεικνείει τις ακμές της εικόνας μας (Edge Enhancement). Το φίλτρο προκύπτει από το προηγούμενο, αρκεί να αυξήσουμε τον συντελεστή του M(i,j) σε κάτι μεγαλύτερο από 1, πχ
-1/8, -1/8, -1/8 -1/8, 1.2, -1/8 -1/8, -1/8, -1/8 Ο κώδικας Matlab προκύπτει απευθείας από τον προηγούμενο με μικρές αυτονόητες αλλαγές. Η τελική εικόνα που προκύπτει φαίνεται παρακάτω. Τα αποτελέσματα δεν είναι τόσο εντυπωσιακά στην συγκεκριμένη εικόνα... Title: Απ: Επεξεργασία Εικόνας Post by: Aurelius on September 05, 2006, 09:29:30 am Γαματο πορωση....
Λεω να φτιαξουμε λεσχη Ελληνων φθλων των ψηφιακων φιλτρων Title: Re: Επεξεργασία Εικόνας Post by: poly1 on September 05, 2006, 09:52:59 am Γαματο πορωση.... Λεω να φτιαξουμε λεσχη Ελληνων φθλων των ψηφιακων φιλτρων μέσα!!! ^wav^ Title: Απ: Επεξεργασία Εικόνας Post by: JAs0n-X on September 05, 2006, 17:46:11 pm Εχει δικιο ο Χρηστος!
Εκτος απο την πρωτη εργασια οι υπολοιπες θα επρεπε να κινουνται σε αυτο το κλιμα! Ευτυχως και η τελευταια και κοψαμε κανα μπασο και ειδαμε τι εστι φιλτρο! Προσπαθω να βρω και γω μια εικονα που ειχα φιλτραρει για αφαιρεση θορυβου αλλα δεν μπορω ρε γμτ! Ειχε πολυ ικανοποιητικα αποτελεσματα! Title: Απ: Επεξεργασία Εικόνας Post by: Axel on September 07, 2006, 15:37:06 pm Υπαρχει και μαθημα Ψηφιακη Επεξεργασια Εικονας στο 9ο εξαμηνο. Μην αγχωνεστε. :P
Title: Re: Επεξεργασία Εικόνας Post by: chggr005 on September 09, 2006, 01:00:30 am Καλησπέρα και πάλι συνάδελφοι!
Μετά το πέρας των εξετάσεων και αφού έχουμε χαλαρώσει πλέον όλοι, είπα να ποστάρω ακόμη μερικά -απλά- ψηφιακά φίλτρα για επεξεργασία εικόνας. Αυτήν την φορά θα αλλάξω εικόνα και θα χρησιμοποιήσω αυτήν που βρίσκεται επισυναπτόμενη. Την έχω τραβήξει εγώ ο ίδιος πριν από λίγο καιρό στην γειτονιά μου... ;) :o Title: Re: Επεξεργασία Εικόνας Post by: chggr005 on September 09, 2006, 01:02:47 am Το πρώτο πράγμα που θα κάνουμε με την εικόνα αυτή είναι αυτό που είχα αναφέρει στο δεύτερο ποστ μου. Όπως θα δείτε, η τελική εικόνα είναι από την μία μεριά εντελώς μαύρη και σιγά σιγά αρχίζει να φωτίζει μέχρις ότου να φτάσει στην κανονική της φωτεινότητα. Εάν αυτό γίνει κατά τον κατακόρυφο άξονα, θα προκύψουν οι δύο φωτογραφίες που επισυνάπτονται. Ο κώδικας αντίστοιχα για κάθε μία είναι ο ακόλουθος.
Dark-Down.jpg: for k=1:3 for i=1:461 for j=1:615 test(i,j,k) = M(i,j,k) - i/4; end end end Dark Up.jpg: for k=1:3 for i=1:461 for j=1:615 test(i,j,k) = M(i,j,k) - (461-i)/4; end end end Title: Re: Επεξεργασία Εικόνας Post by: chggr005 on September 09, 2006, 01:05:19 am Εάν αυτό το τρικ το εφαρμόσουμε κατά τον οριζόντιο άξονα, τα αποτελέσματα θα είναι παρόμοια και απεικονίζονται στις φωτογραφίες που ακολουθούν. Ο κώδικας Matlab προκύπτει αντίστοιχα με προηγουμένως, μόνο που τώρα αφορά τον οριζόντιο άξονα και κατά συνέπεια την μεταβλητή j. Ο κώδικας που χρησιμοποίησα είναι ο εξής:
Dark Left.jpg: for k=1:3 for i=1:461 for j=1:615 test(i,j,k) = M(i,j,k) - (615-j)/5; end end end Dark Right.jpg: for k=1:3 for i=1:461 for j=1:615 test(i,j,k) = M(i,j,k) - j/5; end end end Title: Re: Επεξεργασία Εικόνας Post by: chggr005 on September 09, 2006, 01:07:46 am Σε πολλές περιπτώσεις τυχαίνει να έχουμε τραβήξει μία αρκετά σκοτεινή φωτογραφία και να θέλουμε να της δώσουμε λίγη φωτεινότητα. Αυτό γίνεται πολύ απλά, εάν σε κάθε ένα στοιχείο στους τρεις πίνακες χρωμάτων (Red, Green, Blue) προσθέσουμε μία σταθερά. Ο κώδικας για την πρόσθεση φωτεινότητας σε μία φωτογραφία παρουσιάζεται παρακάτω και τα αποτελέσματά του είναι εμφανή στην πρώτη επισυναπτόμενη φωτογραφία. Με αντίστοιχο τρόπο προκύπτει ο κώδικας για την ελάτωση της φωτεινότητας.
More Light.jpg: for k=1:3 for i=1:461 for j=1:615 test(i,j,k) = M(i,j,k) + 50; end end end Less Light.jpg: for k=1:3 for i=1:461 for j=1:615 test(i,j,k) = M(i,j,k) - 50; end end end Title: Re: Επεξεργασία Εικόνας Post by: chggr005 on September 09, 2006, 01:09:51 am Ένα πολύ ενδιαφέρον φίλτρο κατά την γνώμη μου είναι εκείνο που σου δίνει τα αρνητικά χρώματα. Η υλοποίησή του είναι απλή και φαίνεται στον κώδικα που παραθέτω. Ουσιασικά σε κάθε στοιχείο αντιστρέφουμε το χρώμα αφαιρώντας την τιμή που είχε από το 255 (μέγιστη τιμή).
Negative Colors.jpg: for k=1:3 for i=1:461 for j=1:615 test(i,j,k) = 255 - M(i,j,k); end end end Title: Re: Επεξεργασία Εικόνας Post by: chggr005 on September 09, 2006, 01:12:03 am Έχουμε ήδη πει ότι μία φωτογραφία αποτελείται ουσιαστικά από τρεις πίνακες ίδιων διαστάσεων, κάθε ένας από τους οποίους περιλαμβάνει την συνιστώσα ενός από τα βασικά χρώματα: Red, Green, Blue (RGB).
Μία ενδιαφέρουσα ιδέα είναι να πειράξουμε μονάχα τον πίνακα εκείνον που αντιστοιχεί στο κόκκινο χρώμα (1ος πίνακας) και συγκεκριμένα σε κάθε στοιχείο του να προσθέσουμε κάποια συγκεκριμένη τιμή. Αυτό μπορεί να υλοποιηθεί με τον εξής κώδικα: Red.jpg: for i=1:461 for j=1:615 test(i,j,1) = M(i,j,1) + 50; end end Τα αποτελέσματα φαίνονται στην εικόνα που επισυνάπτεται. Title: Re: Επεξεργασία Εικόνας Post by: chggr005 on September 09, 2006, 01:15:44 am Εάν αντί για τον πίνακα του κόκκινου αποφασίσουμε να "πειράξουμε" τον πίνακα του μπλε (2ος πίνακας) ή του πράσινου (3ος πίνακας), θα προκύψουν αντίστοιχα αποτελέσματα. Ουσιαστικά με την τεχνική αυτή τονίζουμε κάποιο χρώμα της φωτογραφίας και αναδεικνύνουμε ενδεχομένως κάποια ιδιαίτερα χαρακτηριστικά της.
Blue.jpg: for i=1:461 for j=1:615 test(i,j,3) = M(i,j,3) + 100; end end Green.jpg: for i=1:461 for j=1:615 test(i,j,2) = M(i,j,2) + 50; end end Title: Re: Επεξεργασία Εικόνας Post by: chggr005 on September 09, 2006, 01:20:28 am Εύλογα όμως προκύπτει η απορία:
Μπορώ να αναδείξω με την τεχνική αυτή οποιοδήποτε χρώμα ή μονάχα ένα από τα τρία βασικά (Μπλε, Κόκκινο, Πράσινο)? Η απάντηση είναι ότι πράγματι μπορούμε να τονίσουμε οποιοδήποτε χρώμα θέλουμε, αρκεί να συνδυάσουμε κατάλληλα τα τρία βασικά χρώματα. Στην πρώτη εικόνα βλέπουμε ότι έχει τονιστεί το μωβ. Αυτό έγινε αυξάνοντας την κόκκινη συνιστώσα κατά 50 και ταυτόχρονα μειώνοντας την μπλε συνιστώσα κατά 20. Ο κώδικας που χρησιμοποιήθηκε είναι ο εξης: Mwb.jpg: for i=1:461 for j=1:615 test(i,j,1) = M(i,j,1) + 50; test(i,j,2) = M(i,j,2) - 20; end end Αντίστοιχα, στην δεύτερη φωτογραφία ενισχύσαμε την συνιστώσα του κόκκινου κατά 50, την συνιστώσα του μπλε κατά 35 και αφαιρέσαμε 30 από την συνιστώσα του πράσινου. Με αυτόν τον συνδυασμό πετύχαμε να τονιστεί το καφέ χρώμα, όπως φαίνεται και στην εικόνα. Kafe.jpg: for i=1:461 for j=1:615 test(i,j,1) = M(i,j,1) + 50; test(i,j,2) = M(i,j,2) + 35; test(i,j,3) = M(i,j,3) - 30; end end Title: Re: Επεξεργασία Εικόνας Post by: chggr005 on September 09, 2006, 01:23:26 am Η συγκεκριμένη φωτογραφία έχει ένα αξιοπερίεργο: Ένα σεντόνι κρέμεται από τα καλώδια της ΔΕΗ (με μια βροχούλα, σίγουρα θα είχε προκαλέσει βραχυκύκλωμα ...χε χε χε!! ;) ).
Πολλές φορές θέλουμε με κάποιον τρόπο να τονίσουμε το αξιοπερίεργο στην εικόνα, ούτως ώστε το μάτι του θεατή να πέσει απ' ευθείας σε αυτό και όχι να παρατηρεί διάφορες ανούσιες λεπτομέρειες. Αυτό μπορεί να γίνει εάν ταυτόχρονα: α) αυξήσουμε ελάχιστα την φωτεινότητα σε μία περιοχή γύρω από το αξιοπερίεργο και β) μειώσουμε αρκετά την φωτεινότητα στο υπόλοιπο μέρος της φωτογραφίας. Η περιοχή αυτή μπορεί να είναι παραλληλόγραμμο, κύκλος, έλλειψη και γενικότερα ό,τι θέλουμε. Ο κώδικας για παραλληλόγραμμο και τα αποτελέσματα της εφαρμογής του στην αρχική φωτογραφία φαίνονται παρακάτω: Focus Square.jpg: for k=1:3 for i=1:461 for j=1:615 if (i>150) & (i<320) & (j>250) & (j<350) test(i,j,k) = 1.2*M(i,j,k); else test(i,j,k) = 0.5*M(i,j,k); end end end end Εάν το 0.5 στον παραπάνω κώδικα το κάνουμε 0.3, τότε θα προκύψει η δεύτερη εικόνα. Title: Re: Επεξεργασία Εικόνας Post by: chggr005 on September 09, 2006, 01:24:52 am Για κύκλο θα έχουμε αντίστοιχα:
Focus Circle: for k=1:3 for i=1:461 for j=1:615 if (i-230)^2 + (j-300)^2 < 8000 test(i,j,k) = 1.2*M(i,j,k); else test(i,j,k) = 0.5*M(i,j,k); end end end end Title: Re: Επεξεργασία Εικόνας Post by: Megawatt on December 26, 2006, 03:20:38 am Συγχαρητήρια Πλανητάρχη για το τόπικ!!!! :)
Θα επανέλθω για τυχόν σχόλια ή παρατηρήσεις. ::) Title: Re: Επεξεργασία Εικόνας Post by: Megawatt on December 26, 2006, 17:36:36 pm Έχω 2 απορίες: ::)
Έχουμε ήδη πει ότι μία φωτογραφία αποτελείται ουσιαστικά από τρεις πίνακες ίδιων διαστάσεων, κάθε ένας από τους οποίους περιλαμβάνει την συνιστώσα ενός από τα βασικά χρώματα: Red, Green, Blue (RGB). Σε εμένα γιατί δεν βγαίνει κοκκινη η φωτό αλλά ασπρόμαυρη-όπως επισυνάπτω-?Μία ενδιαφέρουσα ιδέα είναι να πειράξουμε μονάχα τον πίνακα εκείνον που αντιστοιχεί στο κόκκινο χρώμα (1ος πίνακας) και συγκεκριμένα σε κάθε στοιχείο του να προσθέσουμε κάποια συγκεκριμένη τιμή. Αυτό μπορεί να υλοποιηθεί με τον εξής κώδικα: Red.jpg: for i=1:461 for j=1:615 test(i,j,1) = M(i,j,1) + 50; end end Τα αποτελέσματα φαίνονται στην εικόνα που επισυνάπτεται. 2η απορία: Αν αντί των εντολών για το χαμηλοπερατό φίλτρο που αναφέρεις στην προηγούμενη σελίδα: ol=imread('olympos.jpg'); for k=1:3 for i=2:510 for j=2:767 test(i,j,k) = ol(i,j,k) - 1/8*(ol(i-1,j-1,k)+ ol(i-1,j,k)+ol(i-1,j+1,k) + ol(i,j-1,k) + ol(i,j+1,k) + ol(i+1,j-1,k) + ol (i+1,j,k) + ol(i+1,j+1,k)) ; end end end figure imshow(test) χρησιμοποιήσω την imfilter : test=ol; H=[-1/8 -1/8 -1/8; -1/8 1 -1/8; -1/8 -1/8 -1/8]; lpf1=imfilter(test,H); figure imshow(lpf1) γιατί παίρνω μια απολύτως μαύρη εικόνα??????? Title: Re: Επεξεργασία Εικόνας Post by: chggr005 on December 27, 2006, 23:37:44 pm Σε εμένα γιατί δεν βγαίνει κοκκινη η φωτό αλλά ασπρόμαυρη-όπως επισυνάπτω-? Μπορεί η συνάρτηση προβολής της εικόνας που χρησιμοποιείς να την μετατρέπει πρώτα σε grayscale... Αυτό είναι το μοναδικό που μου έρχεται τώρα στο μυαλό.γιατί παίρνω μια απολύτως μαύρη εικόνα??????? Κάτι λάθος παίζει με την εντολή imfilter. Βασικά την εντολή αυτή δεν την έχω υπόψη μου. Θα πρέπει να την μελετήσω όταν βρω χρόνο και να σου πω.Title: Re: Επεξεργασία Εικόνας Post by: Megawatt on January 25, 2007, 03:48:35 am Σε εμένα γιατί δεν βγαίνει κοκκινη η φωτό αλλά ασπρόμαυρη-όπως επισυνάπτω-? Μπορεί η συνάρτηση προβολής της εικόνας που χρησιμοποιείς να την μετατρέπει πρώτα σε grayscale... Αυτό είναι το μοναδικό που μου έρχεται τώρα στο μυαλό.γιατί παίρνω μια απολύτως μαύρη εικόνα??????? Κάτι λάθος παίζει με την εντολή imfilter. Βασικά την εντολή αυτή δεν την έχω υπόψη μου. Θα πρέπει να την μελετήσω όταν βρω χρόνο και να σου πω. |