ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΚΡΗΤΗΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΔΙΑΤΜΗΜΑΤΙΚΟ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ ΠΡΟΗΓΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΠΑΡΑΓΩΓΗΣ ΑΥΤΟΜΑΤΙΣΜΟΥ & ΡΟΜΠΟΤΙΚΗΣ ΜΗΧΑΝΙΚΗ ΟΡΑΣΗ 2η ΕΡΓΑΣΙΑ ΣΠΟΥΔΑΣΤΕΣ: ΕΙΣΗΓΗΤΗΣ ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΑΜ: ΜΗ62 ΔΡ ΜΑΚΡΗΣ ΑΛ. ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ ΑΜ: ΜΗ69 ΧΕΙΜΕΡΙΝΟ ΕΞΑΜΗΝΟ 2016-2017
ΑΣΚΗΣΗ 1 Στην παρούσα εργασία ζητείται να παρουσιαστούν διάφορα φίλτρα μέσω της εντολής Imfilter του Matlab. Το script που αναπτύχθηκε είναι το παρακάτω: clear all; clc; %Καθαρίζουμε το ιστορικό % Χρησιμοποιώντας την fspecial με τη βοήθεια του help στο Matlab % δημιουργούμε τα παρακάτω φίλτρα. %Ορίσματα για τα φίλτρα που θα ακολουθήσουν. radius=5; hsize=50; sigma=10; len=30; theta=45; Filter1 = fspecial('disk',radius); Filter2 = fspecial('gaussian',hsize,sigma); Filter3 = fspecial('motion',len,theta); Filter4 = fspecial('sobel'); Filter5 = (1/9)*ones(3); %Εκτυπώνουμε τις μορφές των φίλτρων σε ένα figure(10). figure(10) subplot(3,2,1); surf(filter1); title('disk filter') subplot(3,2,2); surf(filter2); title('gaussian filter') subplot(3,2,3); surf(filter3); title('motion filter') subplot(3,2,4); surf(filter4); title('sodel filter') subplot(3,2,5); surf(filter5); title('our filter') %Εκτυπώνουμε την κανονική εικόνα σε ένα figure(20). %I=imread('topio.jpg'); %I=imread('shapes.tiff'); I=imread('dice_06.jpg'); %I=rgb2gray(I); figure(20); imshow(i); %Εκτυπώνουμε την εικόνα με πέντε διαφορετικά φίλτρα. I1= imfilter(i,filter1); figure(1); imshow(i1); I2= imfilter(i,filter2); figure(2); imshow(i2); I3= imfilter(i,filter3); figure(3); imshow(i3); I4= imfilter(i,filter4); figure(4); imshow(i4); I5= imfilter(i,filter5); figure(5); imshow(i5); %Bλέπουμε και τον ανάστροφο του sodel filter (συγκρίνουμε fig4 - fig6) F6=Filter4'; I6= imfilter(i,f6); figure(6); imshow(i6); Όπως φαίνεται και στο παραπάνω script δοκιμάστηκαν διάφορες εικόνες. To αποτέλεσμα που πήραμε για την εικόνα dice_06. Jpg είναι το παρακάτω: ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 1
Figure 20 Αρχική εικόνα Figure 10 Οι μορφές των φίλτρων ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 2
Figure 1 To φίλτρο disc To φίλτρο Disk είναι ένα φίλτρο κυκλικό που λαμβάνει υπ όψιν του τα Μ.Ο. των τιμών στον τετραγωνικό πίνακα της πλευράς 2*ακτίνα+1. Προτεινόμενη ακτίνα είναι 5 Figure 2 Το φίλτρο Gaussian Το Gaussian φίλτρο επιστρέφει κυκλικά συμμετρική Gaussian χαμηλοπερατό φίλτρο του μεγέθους hsize με σταθερή απόκλιση σ. Το hsize μπορεί να είναι διάνυσμα που καθορίζει τα νούμερα των γραμμών και των στηλών. Η προτεινόμενη τιμή του hsize είναι [3 3] και της τυπικής απόκλισης 0,5 ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 3
Figure 3 Το φίλτρο Motion Το φίλτρο Motion προσεγγίζει μια συνέλιξη εικόνας, της γραμμικής κίνησης της κάμερας με len pixels, με γωνία θήτα μοιρών σε κατεύθυνση φοράς ρολογιού. Το φίλτρο γίνεται διάνυσμα για οριζόντιες και κάθετες κινήσεις. Προτεινώμενες τιμή len είναι 9 και θήτα είναι 0. Figure 4 Το φίλτρο sobel Το φίλτρο sobel είναι φίλτρο 3 by 3 που τονίζει τις οριζόντιες ακμές χρησιμοποιόντας το φαινόμενο της εξομάλυνσης προσεγγίζοντας μια κάθετη κλίση. Αν χρειαστεί να τονιστούν οι κάθετες ακμές παίρνουμε το h φίλτρο sobel ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 4
Figure 5 Το δικό μας φίλτρο Στο δικό μας φίλτρο κατασκευάσαμε έναν πίνακα 3Χ3 με τιμές 1/9 και μετατρέψαμε την αρχική εικόνα. figure 6 Το ανάστροφο του sobel ΑΣΚΗΣΗ 2 Σε αυτήν την άσκηση ζητήθηκε να συνταχτεί μια Function oriented_edges η οποία θα δέχεται μια εικόνα I, μια τιμή κατωφλίωσης (thresholding) thr, μια τιμή κατεύθυνσης a και μια γωνία da. Η function θα επιστρέφει έναν πίνακα λογικού αποτελέσματος με τιμή 1 όταν το pixel της εικόνας πληροί τις απαιτήσεις του χρήστη και τιμή 0 όταν δεν τις πληροί. Συντάχθηκε το παρακάτω script: clear all; clc; I=imread('shapes.tiff'); thr = 0.3; %η τιμή κατωφλίωσης που δίνει ο χρήστης a = 65; %η τιμή κατεύθυνσης σε μοίρες da = 5; %η γωνία απόκλισης σε μοίρες E= oriented_edges( I,thr,a,da ); % εισάγεται στην συνάρτηση figure(2) %ανοίγουμε ένα figure 2 imshow(e) %προβάλλεται το αποτέλεσμα του πίνακα Ε ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 5
Όπου η συνάρτηση Oriented_edges είναι η παρακάτω: function [ E ] = oriented_edges( I, thr, a, da ) Isize=size(I); if (length(isize)==3) I=rgb2gray(I); end I=im2double(I); a=deg2rad(a); da=deg2rad(da); Fg=fspecial('gaussian',[3 3],.5); Ig=imfilter(I,Fg); Fsx=fspecial('sobel'); Fsy=Fsx'; Iy=imfilter(Ig,Fsy); Ix=imfilter(Ig,Fsx); %Εάν η εικόνα έχει 3 επίπεδα είναι %RGB οπότε την μετατρέπουμε % ορίζεται το gausisian φίλτρο % γίνεται εξομάλυνση με αυτό %ορίζεται το sobel φίλτρο %και το ανάστροφό του (για τις %κάθετες ακμές) theta=atan(iy./ix); %βρίσκουμε την γωνία gradient της %εικόνας που εισήγαγε ο χρήστης Im = sqrt(ix.^2 + Iy.^2 ); %βρίσκουμε τις πλευρές της εικονας %σύμφωνα με το μέγεθος gradient E= (Im > thr) & ( (a-da) < theta < (a+da) ); %συγκρίνουμε το αποτέλεσμα %της εικόνας που επεξεργαστήκαμε %εάν είναι εντός των ορίων που %έδωσε ο χρήστης στο script και % καταχωρούμε 1 εάν είναι 0 εάν όχι end Για thr= 0.3, a=65 και da=5 πήραμε την παρακάτω εικόνα: ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 6
Για thr= 0.9, a=0 και da=5 πήραμε την παρακάτω εικόνα: Για thr= 2, a=40 και da=5 πήραμε την παρακάτω εικόνα: ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 7
ΑΣΚΗΣΗ 3 Σκοπός της άσκησης αυτής είναι να δημιουργήσουμε ένα Script το οποίο θα αναγνωρίζει τα ζάρια μέσα στην εικόνα, θα βρίσκει τα κέντρα τους και θα αναγνωρίζει τον αριθμό της ζαριάς. Για την υλοποίηση της άσκησης, συντάχθηκε το παρακάτω script: clear all; clc; Im=imread('dice_01.tiff'); Ed=im2double(Im); figure(1); imshow(ed); %εισάγουμε την εικόνα %την μετατρέπουμε σε double %εμφανίζουμε την εικόνα E=double(edge(Ed, 'sobel')); %βρίσκουμε τις ακμές με τον αλγόριθμο %sobel figure(2); imshow(e); %εμφανίζουμε την εικόνα filter=ones( 57,58 ); filter(3:54, 3:54)=0; %Μετρήσαμε το μέγεθος του ζαριού το οποίο είναι %κατά Μ.Ο. 57Χ58 pixel. Έτσι Δημιουργίσαμε ένα %φίλτρο στο μέγεθος αυτό %με 1 στην περίμετρο και 0 εσωτερικά I2=imfilter(E,filter); %Φιλτράρουμε την εικόνα με το παραπάνω φίλτρο I= (I2 > 150); %βάζουμε το κατάλληλο όριο threshold figure(3); imshow(i); %εμφανίζουμε την εικόνα S=regionprops(I,'centroid'); %Χρησιμοποιούμε την regionprops για να %βρούμε τα κέντρα των ζαριών centroids=cat(1,s.centroid); imshow(i); hold on; plot(centroids(:,1),centroids(:,2),'g*') %Απεικονίζουμε τα κέντρα των %ζαριών hold off ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 8
Η αρχική εικόνα που εισήγαμε είναι: Figure 1 Μετά την εύρεση των ακμών με την μέθοδο του sobel η εικόνα μας έγινε: figure 2 ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 9
Εφαρμόζοντας το φίλτρο στην εικόνα και το threshold η εικόνα μας γίνεται τελικά: Όπου με την regionprops παίρνουμε την τελική εικόνα που απεικονίζει τα κέντρα των ζαριών: Το τελευταίο βήμα της άσκησης ήταν να αναγνωριστεί και η ζαριά. Αυτό θα μπορούσε να επιτευχθεί μέσω της εύρεσης των γωνιών που έχει μέσα το ζάρι (άρα και αριθμών) μέσω της εντολής corner και της μεθόδου Harris που υπάρχει στο Matlab. Παρόλες τις προσπάθειές μας δεν καταφέραμε να την συντάξουμε σωστά ώστε να πάρουμε κάποιο σωστό αποτέλεσμα. ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 10
Δοκιμάσαμε το παραπάνω script και στις άλλες εικόνες για την σύγκριση των αποτελεσμάτων. Στις άλλες εικόνες υπήρχε η δυσκολία του φιλτραρίσματος που γινόταν με αποτέλεσμα να μην παίρνουμε σωστά αποτελέσματα όπως αυτά της πρώτης εικόνας. Θα έπρεπε λοιπόν πιθανόν να δοκιμαστούν άλλα φίλτρα. Στην εικόνα dice_04 χρησιμοποιώντας το ίδιο φίλτρο (sobel) και μεταβάλλοντας το δικό μας φίλτρο στα pixel του ζαριού (120Χ120 περίπου) καθώς επίσης και το threshold έγινε 950 (η εικόνα έχει χοντρές ακμές) το script μας έγινε ως ακολούθως: Im=imread('dice_04.jpg'); Isize=size(Im); if (length(isize)==3) Im=rgb2gray(Im); end Ed=im2double(Im); figure(1); imshow(ed); E=double(edge(Ed, 'sobel')); figure(2); imshow(e); filter=ones( 120,120 ); filter(10:110, 10:110)=0; I2=imfilter(E,filter); I= (I2 > 950); figure(3); imshow(i); S=regionprops(I,'centroid'); centroids=cat(1,s.centroid); imshow(i); hold on; plot(centroids(:,1),centroids(:,2),'g*') hold off Η εικόνα που εισήγαμε ήταν: ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 11
Μετά το φίλτρο η εικόνα έγινε: Και με την αναζήτηση του κέντρου πήραμε: ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 12