ΜΕΤΑΠΤΥΧΙΑΚΟ ΔΙΠΛΩΜΑ Assignment 2 ΟΜΑΔΑ 2 Δημήτρης Βοσκάκης (mth76@edu.teicrete.gr) Νικόλαος Βαρδάκης (mth75@edu.teicrete.gr) ΕΠΙΒΛΕΠΩΝ ΚΑΘΗΓΗΤΗΣ Κ.Αλέξανδρος Μακρής Page1
Contents Exercise 1... 3 Θεωρητική Ανάλυση... 3 Ανάπτυξη του Μαθηματικού Μοντέλου στο πρόγραμμα... 3 Εφαρμογές Αποτελέσματα... 4 Exercise 2... 9 Θεωρητική Ανάλυση... 9 Ανάπτυξη του Μαθηματικού Μοντέλου στο πρόγραμμα... 9 Εφαρμογές Αποτελέσματα... 11 Exercise 3... 14 Θεωρητική Ανάλυση... 14 Ανάπτυξη του Μαθηματικού Μοντέλου στο πρόγραμμα... 15 Άσκηση 3. Εφαρμογές - Αποτελέσματα... 18 Βιβλιογραφική Αναφορά:... 19 Page2
Exercise 1 ΔΠΜΣ-ΠΡΟΗΓΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΠΑΡΑΓΩΓΗΣ Experiment with the imfilter Matlab function using images of your choice. Present some (3-4) image filtering examples. For each example show which filter type you used and explain the purpose of filtering with that filter (e.g. smoothing, sharpening, edge). For each filter type use different parameter values (e.g. filter size, Gaussian filter standard deviation) and comment on how these parameters affect the result. To create the filter kernel creation, you can use the built-in fspecial function or directly set the appropriate matrix. Θεωρητική Ανάλυση Ένας τρόπος επεξεργασίας της εικόνας είναι το φιλτράρισμα. Η προσθήκη φίλτρο σε εικόνα της προσθέτει ή της αφαιρεί ιδιότητες, ανάλογα με τον τύπο του φίλτρου. Πχ κάποιο φίλτρο μπορεί να τη θολώσει, ενώ ένα άλλο να της αφαιρέσει θόρυβο. Επίσης κάποια φίλτρα μπορούν να την παραγωγίσουν ανά διεύθυνση κλπ. Ανάπτυξη του Μαθηματικού Μοντέλου στο πρόγραμμα Έστω το φίλτρο: h1=1/9*ones(3); Τοποθετεί στο κέντρο κάθε τετραγώνου 3x3 τον Μέσο Όρο της Φωτεινότητας όλων των pixel του. Περιμένουμε λοιπόν να θολώσει την εικόνα. Επειδή h =1 δε θα αλλοιώσει τη μέση Φωτεινότητα της εικόνας. h2=[1,0,-1;0,0,0;-1,0,1]; Επειδή παίρνει διαφορές και στον άξονα x και στον y, θα δώσει στην εικόνα μεγάλες τιμές εκεί που οι διαφορές Φωτεινότητας είναι μεγάλες, είτε στον άξονα x είτε στον y. Συνήθως στις ακμές υπάρχουν μεγάλες διαφορές Φωτεινότητας, άρα περιμένουμε να τονίσει τις ακμές. h3=[0,-1,0;-1,5,-1;0,-1,0]; Τονίσει τα κέντρα και υποτονεί τα γύρω σημεία, άρα περιμένουμε να κάνει πιο κοφτερή την εικόνα. h4 = fspecial('gaussian', [3 3], 0.5); Θολώνει την εικόνα όπως το h1, αλλά με Γκαουσιανή κατανομή. Ο πυρήνας που δημιουργεί είναι τετράγωνο 3x3 και η τυπική του απόκλιση σ=0.5. Ομοίως τα h5, h6, h7. h8=[-1 0 1;-2 0 2;-1 0 1]; Παραγωγίζει την εικόνα στον άξονα x. h9=[1 2 1;0 0 0;-1-2 -1]; Παραγωγίζει την εικόνα στον άξονα y. Page3
If6=filter2(h8,I,'full'); Βγάζει σαν μέγεθος εξόδου το άθροισμα των μεγεθών h8 (φίλτρο με τιμή h8=[-1 0 1;-2 0 2;-1 0 1]; ) και I. Εφαρμογές Αποτελέσματα Εκτελώ το πρόγραμμα Exercise1.m με εισόδους τις εικόνες: Α) cameran.tif, Β) barbara.tif και Γ) NationalGeographic1.jpg Και φαίνονται τα αποτελέσματα που περιμέναμε απότην προηγούμενη παράγραφο. A) cameraman.tif Page4
Page5
Β) barbara.tif Page6
Γ) NationalGeographic1.jpg Page7
Page8
Exercise 2 ΔΠΜΣ-ΠΡΟΗΓΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΠΑΡΑΓΩΓΗΣ The aim of this exercise is to detect the edges with a given direction in an image. To that create a function [ E ] = oriented_edges( I, thr, a, da ) that takes as input a double grayscale image Ι, a threshold value thr, a direction a, and an angle da. The output of the function should be a binary image Ε where the pixels that meet the following requirements should have the value 1: The pixel intensity gradient is higher than thr. The gradient direction (in rad) is inside the interval: (a-da,a+da) For the gradient calculation use the imfilter with an appropriate filter (e.g. Sobel). Apply the function using different values for the parameters (thr, a, da) on images of your choice (e.g. <shapes.tiff>) and present the results along with comments on how the parameters affect the output. Θεωρητική Ανάλυση Αποδοτικός τρόπος αναγνώρισης ακμών σε μία εικόνα είναι μέσω του Gradient και της διεύθυνσης του,ορίζοντας πάντα κάποιες παραμέτρους για να έχουμε το επιθυμητό αποτέλεσμα.δημιουργώντας λοιπόν σε αρχικό στάδιο Γκαουσιανό φίλτρο και τοποθετώντας το πάνω στην εικόνα θα μας οδηγήσει στην ανέυρεση των ακμών που επιθυμούμε. Ανάπτυξη του Μαθηματικού Μοντέλου στο πρόγραμμα Ορισμός συνάρτησης με το όνομα oriented_edges.μας ζητήθηκε να δώσουμε ορίσματα την εικόνα, το threshold (αποτελεσματικός τρόπος κατάτμησης της εικόνας απομονωνωτας τα αντικέιμενα),κατεύθυνση a και την γωνία da. function E = oriented_edges(i,threshold,a,da) Inew=im2double(I); Στο συγκεκριμένο σημείο παίρνουμε το μέγεθος της εικόνας και δημιουργούμεαρχικοποιούμε αντίστοιχο πίνακα με μηδενικά.στη συνέχεια φτιάχνουμε το Γκαουσιανό φίλτρο, αφού όπως ξέρουμε είναι ένας κυκλικό φίλτρο. Όπου R και C το κέντρο του πυρήνα και οι τιμές I και j καθορίζουν το μέγεθος γυρω από το κέντρο του φίλτρου. [r,c]=size(inew); h = zeros(r,c); R = (r+1)/2; C = (c+1)/2; sigma =1.3; for(i=1:r) for(j=1:c) Page9
h(i,j) = (1/2*pi*sigma*sigma)*exp(-((i-R)*(i- R)+(j-C)*(j-C))/(2*sigma*sigma)); Κάνουμε κανονικοποίηση και εφαρμόζουμε το Γκαουσιανό φίλτρο. hsum = h/(sum(sum(h))); %normalise GaussBlur = imfilter(i,hsum); sobx=[-1 0 1;-2 0 2;-1 0 1];%sobel παραγωγιση soby=[1 2 1;0 0 0;-1-2 -1];%sobel παραγωγιση %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N=im2double(GaussBlur); Grax=imfilter(N,sobx); Gray=imfilter(N,soby); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Όπως έχουμε διδαχθεί το Gradient έιναι διάνυσμα και δείχνει την μέγιστη μεταβολή έντασης κοιτάζοντας προς αυτή την διεύθυνση.το πόσο γρήγορα μεταβάλλεται το δείχνει το μέτρο του Gradient.Έτσι στην προκειμένη περίπτωση ορίσαμε τους παραγώγους Grax και Gray (Δημιουργήθηκαν με φίλτρο sobel).τέλος εφαρμόσαμε τον τύπο του μέτρου Gradient όπως βλέπετε παρακάτω και την κατεύθυνση του Gradient εφαρμόζοντας τον τύπο theta=((atan2(gray,grax)+pi)*180)/pi;, μετατρέποντας το σε μόίρες. Gradient=sqrt((Grax.*Grax)+(Gray.*Gray)); theta=((atan2(gray,grax)+pi)*180)/pi; %Μετατροπή του gradient direction σε μοίρες. Τέλος ορίζουμε την συνθήκη του threshold,της κατεύθυνσης a,της γωνίας da,με σκοπό να μας επιστρέψει τον δυαδικό πίνακα Ε που μας ζητήθηκε. [r2,c2]=size(inew); E= zeros(r2,c2); for(i=1:r) for(j=1:c) if (Gradient(i,j)>=threshold) && (theta(i,j)<=a+da) && (theta(i,j)>=a-da) E(i,j)=1; else E(i,j)=0;. Page10
Εφαρμογές Αποτελέσματα Εφαρμόζουμε τη συνάρτηση oriented_edges στις εικόνες: shapes.tiff και NationalGeographic1.jpg διάφορα Threshold, a και da = 2, 5 deg. A) Για το shapes.tiff: Page11
Παρατηρήσεις: Η συνάρτηση με αυξημένο threshold και μειωμένο εύρος γωνιών da λαμβάνει λιγότερα σημεία. Page12
B) Για το NationalGeographic1.jpg Παρατηρήσεις. Συγκρίνοντας τις 2 παραπάνω εικόνες βλέπουμε ότι η 1 η που λαμβάνει γωνίες 135 ο προσεγγίζει καλύτερα την αυθεντική από τη 2 η που λαμβάνει γωνίες 45 ο. Αυτό οφείλεται στο γεγονός ότι το εικονιζόμενο πρόσωπο είναι στραμμένο προς τα αριστερά και έτσι φαίνονται περισσότερες ακμές. Page13
Exercise 3 ΔΠΜΣ-ΠΡΟΗΓΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΠΑΡΑΓΩΓΗΣ The aim of this exercise is to detect dice of a known size and orientation in an image. The method should also be able to recognize the number on each detected dice. The assumption is that the dice in the image are almost parallel with the image axes (e.g. <dice_01.tiff>). For the recognition you are free to use corner and edge detection techniques, for instance you can use built-in Matlab functions. Edge detection will be useful to find the contour of each dice while corner detection on the appropriate scale will provide its number. Visualize the results by superimposing on the initial image the centers of each detected dice and its number. For the initial tests of the system use the simpler image provided: <dice_01.tiff>. Once the system's performance is verified with that image continue your tests with the rest of the provided images or other images of your choice containing dice and comment on the results. For each experiment provide and comment on the parameter values that you used to detect the dice. If your system fails try to explain why. The program should be properly structured using functions for each sub-problem. One possible strategy that you could use is the following: Edge detection to obtain the edge image Ε using the edge Matlab function. Creation of a filter kernel Β that if applied on E will output high response on the location of the possible dice centers. Filtering of the edge image E (after converting it to double) with the filter Β followed by thresholding to obtain a binary image, D, with the possible center locations. Localization of the centroid of each connected component of D using the function regionprops. The output S.Centroid are the possible dice center locations. To convert the output of regionprops to a matrix and visualize the result you can use the following lines of code: centroids = cat(1, S.Centroid); imshow(i); hold on; plot(centroids(:,1), centroids(:,2), 'g*'); hold off; Localization of the corners C at the appropriate scale using the built-in corner function (to adjust the scale change the function's parameter FilterCoefficients). The scale is correct if each dice dot is detected as a single corner. Θεωρητική Ανάλυση Για την επίλυση του προβλήματος στηριζόμαστε στα φίλτρα που αναγνωρίζουν ακμές και γωνίες. Οι ακμές έχουν την ιδιότητα να μην αλλάζουν φωτεινότητα όταν το πέρασμα του φίλτρου γίνει κατά τη φορά τους, ενώ οι γωνίες αλλάζουν φωτεινότητα κατά το πέρασμα του φίλτρου σε οποιαδήποτε διεύθυνση από πάνω τους. Με αυτό τον τρόπο αναγνωρίζεται σαν γωνία και μία κουκκίδα διαμέτρου μικρότερης της ακμής του φίλτρου. Page14
Ανάπτυξη του Μαθηματικού Μοντέλου στο πρόγραμμα Έστω το φίλτρο: B=ones(lz)/(lz^2);, όπου lz=54 η ακμή του ζαριού. Η μέτρηση έγινε με τo data cursor του Matlab. Το παραπάνω φίλτρο, επειδή έχει τις διαστάσεις του ζαριού και περιέχει μονάδες, καθώς σαρώνει το ζάρι, μένει περισσότερες θέσεις στο κέντρο του ζαριού. Οπότε είναι λογικό να φωτίζει περισσότερο το κέντρο του. Ο αλγόρθμος: thr=240; % Mhdenizei tis times katw apo to thr gia na afairesei thorivo for i=1:si(1) for j=1:si(2) if I3(i,j)<thr I3(i,j)=0; ci=corner(i3); μηδενίζει τελείως τη φωτεινότητα των σημείων που έχουν φωτεινότητα μικρότερη από 240, ώστε να φανούν καλύτερα τα κέντρα των ζαριών. Ο αλγόριθμος: figure(1) imshow(i3); ci=corner(i3); % Dies centers that are corners with B filter sci=size(ci); kx=ci(:,1); % Orizei se dianusmata tis syntetagmenes twn kentrwn ky=ci(:,2); hold on % Sxediazei ta kentra twn zariwn plot(ci(:,1), ci(:,2), '*', 'Color', 'm') title(sprintf('no of Dies = %d\nwith Threshold=%d',scI(1),thr)); hold off τοποθετεί τα κέντρα των ζαριών στο figure(1) που όπως φαίνεται στην παρακάτω εικόνα είναι ξεκάθαρα. Με το φίλτρο Β χωρίς το μηδενισμό τιμών κάτω από 240 Με το φίλτρο Β με το μηδενισμό τιμών κάτω από 240 Page15
Ο αλγόριθμος: figure(2) imshow(i); zdlx=zeros(sci(1)); %Arxikopoiisi oriwn. Down limit in x dimension zulx=zeros(sci(1)); % Upper limit in x dimension zdly=zeros(sci(1)); % Down limit in y dimension zuly=zeros(sci(1)); % Upper limit in y dimension scv=4; %Syntelesths Asfaleias gia na aporif8oyn alles kouukides kai n akrati8oun oi eikseis tou zariou for k=1:sci(1) % Sarwnei ta zaria zdlx(k)=kx(k)-lz/2 + scv; % Orizei ta oria ka8e zariou. To 4 zulx(k)=kx(k)+lz/2 - scv; zdly(k)=ky(k)-lz/2 + scv; zuly(k)=ky(k)+lz/2 - scv; hold on %Topo8tei ta perigrammata twn zariwn me anafora ta kentra tous rectangle('position',[ci(k,1)-lz/2,ci(k,2)- lz/2,lz,lz],'edgecolor','r','linewidth',2) text(ci(k,1),ci(k,2)-6, num2str(k)) % Anaferei ton auksonta ari8mo kathe zariou hold off ορίζει τα όρια του κάθε ζαριού με βάση το κέντρο και τη διάτασή του, που στη συγκεκριμένη περίπτωση lz=54. Το scv κάνει τα όρια του ζαριού λίγο μικρότερα, ώστε αργότερα στον έλεγχο για το ποιες γωνίες είναι μέσα στο ζάρι να δώσει ασφάλεια για να αποφευχθούν οι γωνίες που είναι κοντά στις ακμές του ζαριού. Επίσης αριθμεί τα ζάρια και σχεδιάζει και τα περιγράμματα τους, όπως δείχνει η εικόνα. Page16
Επειδή οι κουκκίδες του ζαριού είναι μέρος των γωνιών, φιλτράρεται η εικόνα με canny και στο διάνυσμα c έχουμε τις διαστάσεις όλων των γωνιών. I1=edge(I,'canny'); c=corner(i1); % All corners after canny filter sc=size(c); Ο αλγόριθμος: figure(3) imshow(i1); z=zeros(sci(1)); for m=1:sc(1) %Sarwnei oles tis gwnies for n=1:sci(1) %%Sarwnei ola ta zaria if (c(m,1)>zdlx(n) && c(m,1)<zulx(n) && c(m,2)>zdly(n) && c(m,2)<zuly(n)) %Elefxei ka8e fwnia an vrisketai mesa sto zari z(n)=z(n)+1; %Metraei tis koukkides pou einai se kathe zari hold on plot(c(m,1), c(m,2), '*', 'Color', 'r') %Topo8etei tis koukkides pou einai mesa sto zari hold off ελέγχει ποιες γωνίες είναι εντός των οριών κάθε ζαριού. Αυτές είναι και οι χρήσιμες κουκκίδες, τις οποίες σχεδιάζει και τις αριθμεί στο διάνυσμα z. Ο αλγόριθμος: for nn=1:sci(1) %Die Indices fprintf('\ndie No%d indicates %d',nn, z(nn)); δίνει τα αποτελέσματα του προγράμματος που είναι ο αριθμός των ζαριών και η ένδειξη του καθενός, όπως φαίνεται στην επόμενη παράγραφο. Page17
Άσκηση 3. Εφαρμογές - Αποτελέσματα Για την εικόνα dice_01.tiff έχουμε: Die No1 indicates 4 Die No2 indicates 1 Die No3 indicates 2 Die No4 indicates 6 (*Θα πρέπει απλά να σας ενημερώσουμε ότι στο συγκεκριμένο ζάρι στην κάτω αριστεή βούλα έβλεπε 2 γωνίες για αυτό τον λόγο βγάζει σαν αποτέλεσμα 6) Die No5 indicates 3 Die No6 indicates 6 Τα παραπάνω αποτελέσματα επαληθεύονται με οπτική αναγνώριση. Page18
Βιβλιογραφική Αναφορά: 1. Forsyth 5.1, 5.2, 5.3 2. Szeliski 4.1.1, 4.2 3. Lectures Alexandros Makris Page19