ΜΕΤΑΠΤΥΧΙΑΚΟ ΔΙΠΛΩΜΑ 01 10/02/2017 Unknown Assignment 3 ΟΜΑΔΑ 2 Δημήτρης Βοσκάκης (mth76@edu.teicrete.gr) Νικόλαος Βαρδάκης (mth75@edu.teicrete.gr) ΕΠΙΒΛΕΠΩΝ ΚΑΘΗΓΗΤΗΣ Κ.Αλέξανδρος Μακρής Page1
Contents Exercise 1... 3 Θεωρητική Ανάλυση... 3 Ανάπτυξη του Μαθηματικού Μοντέλου και ερμηνεία του προγράμματος... 3 Εφαρμογές Αποτελέσματα... 6 Exercise 2... 12 Θεωρητική Ανάλυση... 12 Ανάπτυξη του Μαθηματικού Μοντέλου στο πρόγραμμα... 12 Εφαρμογές Αποτελέσματα... 16 Βιβλιογραφική Αναφορά:... 25 Page2
02 10/02/2017 Unknown Exercise 1 a) Develop a simple 'blob' detector. The detector takes as arguments an image and the blob radius and return the detected blob positions. The detector should use the LoG filter so the possible detections are the local minima and maxima of the filter response. b) Add an extra parameter to the detector to select either: i) dark blobs, ii) light blobs, or iii) both. c) Ext the detector so instead of a single radius it accepts a range (min, max). Test the detector firstly in the images 'black_dots.jpg', 'white_dots.jpg' and then also in 'coins.tiff' and 'circles_%%.jpg'. Present the results by showing the detected blobs in the initial images. Θεωρητική Ανάλυση Η αρχή ανίχνευσης των Blob βασίζεται στο φιλτράρισμα της εικόνας με την συνάρτηση Λαπλασιανή της Γκαουσιανής LoG με διάφορες Τυπικές Αποκλίσεις. Η ακτίνα που αντιστοιχεί στην Τυπική Απόκλιση που δίνει μέγιστη απόκριση του φιλτραρίσματος είναι και ακτίνα ενός Blob. Για ευκολότερη σύγκριση των αποκρίσεων, κάθε φιλτράρισμα με την LoG τοποθετείται πάνω από το προηγούμενο έτσι ώστε να δημιρουργηθεί ένας τρισδιάστατος πίνακας. Ανάπτυξη του Μαθηματικού Μοντέλου και ερμηνεία του προγράμματος Ο παρακάτω βρόγχος ορίζει την εικόνα I όπου πρόκειται να ανιχνευθούν τα Blob με τη μορφή μενού. Σε κάθε εικόνα έχει οριστεί ένα διάνυσμα r=rmin:rstep:rmax και ένας συντελεστής ct που θα χρησιμοποιηθεί αργότερα για το threshold, έτσι ώστε να ανιχνευθούν περισσότερα Blob. Έπειτα καλεί τη συνάρτηση BlobDetector(I, r, ct) που ανιχνεύει τα Blob. while (1) button = menu('choose image:', 'circles_01.jpg', 'circles_02.jpg', 'circles_03.jpg',... 'circles_04.jpg','circles_05.jpg', 'black_dots.jpg', 'white_dots.jpg',... 'coin_01.tiff', 'coin_02.tiff','coins.tiff', 'CLOSE'); switch button case 1 clear, close all, basefilename = 'circles_01.jpg'; rmin=8; rmax=80; rstep=4; ct=0.2; % Threshold coefficient case 2 clear, close all, basefilename = 'circles_02.jpg'; rmin=8; rmax=80; rstep=4; ct=0.2; % Threshold coefficient case 3 clear, close all, basefilename = 'circles_03.jpg'; rmin=8; rmax=112; Page3
rstep=8; ct=0.2; % Threshold coefficient case 4 clear, close all, basefilename = 'circles_04.jpg'; rmin=8; rmax=80; rstep=4; ct=0.88; % Threshold coefficient case 5 clear, close all, basefilename = 'circles_05.jpg'; rmin=8; rmax=80; rstep=4; ct=0.2; % Threshold coefficient case 6 clear, close all, basefilename = 'black_dots.jpg'; rmin=6; rmax=56; rstep=10; ct=0.8; % Threshold coefficient case 7 clear, close all, basefilename = 'white_dots.jpg'; rmin=18; rmax=48; rstep=10; ct=0.8; % Threshold coefficient case 8 clear, close all, basefilename = 'coin_01.tiff'; rmin=2; rmax=34; rstep=1; ct=0.8; % Threshold coefficient case 9 clear, close all, basefilename = 'coin_02.tiff'; rmin=2; rmax=34; rstep=1; ct=0.8; % Threshold coefficient case 10 clear, close all, basefilename = 'coins.tiff'; rmin=2; rmax=58; rstep=1; ct=0.8; % Threshold coefficient case 11 break; r=rmin:rstep:rmax; I = imread(basefilename); BlobDetector(I, r, ct); Για την BlobDetector(I, r, ct): rmin=r(1); rstep=r(2)-r(1); rmax=r(numel(r)); si=size(i); nsi=numel(si); switch nsi case 3 Ig = double(rgb2gray(i)); case 2 Ig = double(i); % Filter image with LoG sig=size(ig); Page4
sigx=sig(1); sigy=sig(2); Μετατρέπει την εικόνα σε Gray Scale και λαμβάνει τις διαστάσεις της. nr = numel(r); s=r/sqrt(2); Ορίζει μια Τυπική Απόκλιση για κάθε ακτίνα σύμφωνα με τον τύπο: σ=r/sqrt(2). Ο βρόγχος: hsize = 6*[round(max(s)) round(max(s))]; for k=1:nr; % Ftiaxnei se ka8e epipedo thn LoG h = (s(k).^2).*fspecial('log', hsize, s(k)); Igb(:,:,k) = imfilter(ig,h); %Gray Image with LoG Filter φιλτράρει με την LoG την εικόνα με διάφορες Τυπικές Αποκλίσεις. Τα αποτελέσματα τα τοποθετεί στον πίνακα Igb, όπου κάθε επίπεδό του αντιστοιχεί στο φιλτράρισμα μιας τυπικής Απόκλισης, και κατά συνέπεια μιας ακτίνας Blob. Με την εντολή: button2 = menu('choose Blob type:', 'Light Blobs', 'Dark Blobs', 'All Blobs',... 'All cases in subplot'); και τον έλεγχο: switch button2 ο χρήστης μπορεί να επιλέξει αν ο BlobDetectror θα του εμφανίσει τα Φωτεινά Blob, τα Σκούρα Blob, όλα τα Blob ή όλα τα παραπάνω υπό μορφή subplot. Σε περίπτωση που το button2 = 1, δηλαδή ο χρήστης έχει επιλέξει τα φωτεινά Blob τρέχουν οι παρακάτω εντολές: figure(1) imshow(i); title('original Image.'); figure(2) BW = logical(igb<-thr); Στον πίνακα BW βάζει 1 όπου ισχύει: Igb<-thr. Αυτά τα σημεία είναι τα Φωτεινά Blob ss = regionprops(bw, 'centroid'); centroids = cat(1, ss.centroid); Φτιάχνει τα κέντρα Βάρους των κοντινών φωτεινών Blob. imshow(bw(:,:,1)) Εμφανίζει τα κέντρα. hold on plot(centroids(:,1), centroids(:,2), 'b*') hold off Εμφανίζει τα κέντρα των Blob. kc=round(centroids(:,3)); rc=rmin+(kc-1)*rstep; Βρίσκει το επίπεδο που ανήκουν τα κέντρα και σε ποια ακτίνα αντιστοιχούν title('light blobs centers'); figure(3) circ = insertshape(i,'circle',[centroids(:,1), centroids(:,2), rc],'color','y'); imshow(circ); title(sprintf('light Blobs from rmin=%d to rmax=%d with rstep=%d', rmin,rmax, rstep)); Σχεδιάζει κύκλους με τα παραπάνω κέντρα και τις αντίστοιχες ακτίνες. Ομοίως και για τις άλλες περιπτώσεις: Η συνθήκη «BW = logical(igb>thr);» βρίσκει τα σκοτεινά Blob και η συνθήκη «BW = logical(igb>thr Igb<-thr);» τα βρίσκει όλα. Page5
Εφαρμογές Αποτελέσματα Για την εικόνα: circles_01.jpg Page6
Για την εικόνα: circles_02.jpg Για την εικόνα: circles_03.jpg Page7
Για την εικόνα: circles_04.jpg Για την εικόνα: circles_05.jpg Για την εικόνα: black_dots.jpg Page8
Για την εικόνα: white_dots.jpg Page9
Για την εικόνα: coin_01.tiff Για την εικόνα: coin_02.tiff Page10
Για την εικόνα: coins.tiff Page11
03 10/02/2017 Unknown Exercise 2 a) Develop a system that detects circular objects of known radius r in an image. For their detection you should implement the Hough transform. Visualize the detected objects on the initial image. Test your system using the images 'coins.tiff' and 'circles_%%.jpg'. b) Ext your system to detect circular objects within a given radius interval rmin-rmax. c) Use the gradient orientation to rer your system more robust to noise. Θεωρητική Ανάλυση O μετασχηματισμός Ηough είναι μια αποδοτική μέθοδος εξαγωγής χαρακτηριστικών γνωρισμάτων που χρησιμοποιούνται στην ανάλυση εικόνας. Σκοπός της συγκεκριμένης τεχνικής είναι η εύρεση λεπτομερειών μιας εικόνας με την διαδικασία της ψηφοφορίας. Η διαδικασία αυτή λαμβάνει μέρος σε ένα χώρο παραμέτρων όπου τα τοπικά μέγιστα στην εικόνας λαμβάνουν το μεγαλύτερο ποσοστό ψήφου. Ανάπτυξη του Μαθηματικού Μοντέλου στο πρόγραμμα. clear all;close all;clc img=imread('coins.tiff');%circles_01.jpg % img=rgb2gray(img); Imbin=edge(img); rmin=30;rmax=30; r=rmin:rmax; %r=50; thresh=rmax+pi; Όπως βλέπουμε από τον κώδικα παραπάνω διαβάζει την εικόνα στην πορεία μέσω της εντολής edge βρίσκει τις ακμές της εικόνας και τέλος ορίζει το διάνυσμα της εικονας που θέλουμε να του δώσουμε μάζι με το threshold που θα το χρησιμοποίησουμε παρακάτω. Μετά ορίζουμε το Gradient Orientation της εικόνας κάνοντας τις ίδιες ενέργειες που διδαχθήκαμε στο προηγούμενο μάθημα. %%%% Iplogismos Gradient magnitude & direcrtion %%%%%% % h=fspecial('gaussian',6,1); % I=im2double(img); % I=imfilter(I,h,'conv'); % sobx=[-1 0 1;-2 0 2;-1 0 1];%sobel παραγωγιση % soby=[1 2 1;0 0 0;-1-2 -1];%sobel παραγωγιση % N=im2double(I); % Grax=imfilter(N,sobx); % Gray=imfilter(N,soby); % Gradient=sqrt((Grax.*Grax)+(Gray.*Gray)); % theta=((atan2(gray,grax))*180)/pi; %Μετατροπή του gradient direction σε μοίρες. % [a b]=size(gradient); % for i=1:a Page12
% for j=1:b % if Gradient(i,j)>0.7 % NG(i,j)=1; % else % NG(i,j)=0; % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Το συγκεκριμένο κομμάτι της άσκησης είναι το πιο νευραλγικό γιατί εδώ αρχικοποιούμε τον πίνακα Hough όπου εκεί μέσα θα ψηφίσει αργότερα το πρόγραμμα με σκοπό να βρούμε τα τοπικά μέγιστα.πιο συγκεκριμένα: Α)Παίρνει τις συτεταγμένες των άσσων από τον πίνακα των ακμών. Β)Ορίζει το όριο ώστε να μην βγεί εκτός εικόνας κατά τη μέτρηση Γ)Χρησιμοποιεί τον τύπο του κύκλου χ^2+y^2=r^2 και βρίσκει τις πιθανά κέτρα της εικόνας ψηφίζοντας στον πίνακα Hough Δ)Στην πορεία βρίσκει τα τοπικά μέγιστα από τον πίνακα Hough και τα συγκρίνει,αυτά που πληρούν την συνθήκη είναι τα κέντρα της εικόνας for rad=1:length(r) %Psifizei Accumulator = zeros(size(imbin)); % arxikopoiei ton pinaka hough [yim xim] = find(imbin); % find x,y of edge pixels %%%[yim xim] = find(ng); numrow = size(imbin,1); % arithmos grammwn numcol = size(imbin,2); % arithmow sthlwn r2 = r.^2; % kanei tin praksi apeuthias for cnt = 1:numel(xIm) low=xim(cnt)-r(rad); high=xim(cnt)+r(rad); if (low<1) low=1; if (high>numcol) high=numcol; for x0 = low:high Page13
yoffset = sqrt(r2(rad)-(xim(cnt)-x0)^2); y01 = round(yim(cnt)-yoffset); y02 = round(yim(cnt)+yoffset); if y01 < numrow && y01 >= 1 Accumulator(y01,x0) = Accumulator(y01,x0)+1; if y02 < numrow && y02 >= 1 Accumulator(y02,x0) = Accumulator(y02,x0)+1; % VRiskei topika megista y0detect = []; x0detect = []; AccumulatorbinaryMax = imregionalmax(accumulator); [Potential_y0 Potential_x0] = find(accumulatorbinarymax == 1); Accumulatortemp = Accumulator - thresh; %vazei to threshold for cnt = 1:numel(Potential_y0) if Accumulatortemp(Potential_y0(cnt),Potential_x0(cnt)) >= 0 y0detect = [y0detect;potential_y0(cnt)]; x0detect = [x0detect;potential_x0(cnt)]; Στο παρακάτω κομμάτι του κώδικα επειδή είναι λογικό ο κώδικας να έβρισκε και άλλα κέντρα κοντά στα υπόλοιπα τότε ορίσαμε μια συνθήκη όπου τοποθετεί στα υπόλοιπα κέντρα την τιμή -1 με σκοπό να κρατήσουμε ένα μόνο κέντρο. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [a b]=size(x0detect); j=1; for i=1:(a-1) if abs(x0detect(i+1)-x0detect(i))<8 && abs(y0detect(i+1)-y0detect(i))<8 T(j,1)=x0detect(i); T(j,2)=y0detect(i); x0detect(i)=-1; Page14
y0detect(i)=-1; j=j+1; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Για τον εντοπισμό των κύκλων ορίσαμε συνθήκη έτσι ώστε αν η τετμημένη και η τεταγμένη των κέντρων είναι διάφορο του -1 τότε να εμφανίζει τα κέντρα που βρήκαμε παραπάνω.στη συνέχεια αφαιρεί τις αρνητικές τιμές και δημιουργεί πίνακα ακτίνων ίσο με τον αριθμό των κέντρων που βρίσκει κάθε φορά. %%%%%%%%-----entopismos twn blobs-----%%%%%%%%%%%%% x0detect1=[];y0detect1=[]; for t=1:numel(x0detect) if (y0detect(t) > 0 && x0detect(t) > 0) % Afairei tis arnitikes times x0detect1= [x0detect1;x0detect(t)]; y0detect1= [y0detect1;y0detect(t)]; rr=0; for d=1:length(x0detect1) rr(d)=r(rad); rr=rr'; Τέλος στο συγκεκριμένο κομμάτι της άσκησης για δική μας επαλήθευση εμφανίζουμε τα κέντρα που βρίσκει ανάλογα με την ακτίνα που ψάχνει κάθε φορά,την εικόνα του πίνακα Hough με τα τοπικά μέγιστα που έχει βρει και τους κυκλους με την εκαστοτε ακτινα. % %%%%%%%%-----entopismos kentrwn kiklwn KAI emfanisi hough pinaka-----%%%%%%%%%%%%% figure(); imshow(imbinary),title(sprintf('kentra me akrina r=%d',r(rad))); hold on; plot(x0detect(:),y0detect(:),'x','linewidth',2,'color','r '); % figure; % imagesc(accumulator); figure circ = insertshape(img,'circle',[x0detect1(:), y0detect1(:), rr(:)],'color','r'); imshow(circ),title(sprintf('kentra me akrina r=%d',r(rad))); Page15
Εφαρμογές Αποτελέσματα A)Για την εικόνα: coins.tiff 04 10/02/2017 Unknown Εκτίμηση κέντρων και εμφάνιση κύκλων για ακτίνα r=30 Εκτίμηση κέντρων και εμφάνιση κύκλων για ακτίνα r=29 Page16
Εκτίμηση κέντρων και εμφάνιση κύκλων για ακτίνα r=28 B)Για την εικόνα circles_01.jpg Εκτίμηση κέντρων και εμφάνιση κύκλων για ακτίνα r=48 Page17
Εκτίμηση κέντρων και εμφάνιση κύκλων για ακτίνα r=47 Εκτίμηση κέντρων και εμφάνιση κύκλων για ακτίνα r=46 Page18
Εκτίμηση κέντρων και εμφάνιση κύκλων για ακτίνα r=45 Γ)Για την εικόνα circles_03.jpg Εκτίμηση κέντρων και εμφάνιση κύκλων για ακτίνα r=69 Page19
Εκτίμηση κέντρων και εμφάνιση κύκλων για ακτίνα r=68 Page20
Δ) Στην παρακάτων εικόνα (circles_01.jpg) βλέπουμε εμφάνιση του κέντρου του κυκλου μέσω του Gradient όπουμας ζητήθηκε στο 3 ο υποερώτημα ορίζοντας κάποιες παραμέτρους όπως: -Gauss size(6 ) Και sigma(1) αφού γνωρίζουμε ότι το μέγεθος πρέπει να είναι 6 φορές μεγαλύτερο του sigma -Threshold του Gradient >0.7 -Τέλος με διάνυσμα ακτίνας 44-46 Εκτίμηση κέντρων και εμφάνιση κύκλων για ακτίνα r=46 Εκτίμηση κέντρων και εμφάνιση κύκλων για ακτίνα r=45 Page21
Εκτίμηση κέντρων και εμφάνιση κύκλων για ακτίνα r=44 Page22
E)Στην παρακάτων εικόνα (circles_03.jpg)βλέπουμε εμφάνιση του κέντρου του κυκλου μέσω του Gradient όπουμας ζητήθηκε στο 3 ο υποερώτημα ορίζοντας κάποιες παραμέτρους όπως: -Gauss size(12 ) Και sigma(2) αφού γνωρίζουμε ότι το μέγεθος πρέπει να είναι 6 φορές μεγαλύτερο του sigma -Threshold του Gradient >0.3 -Τέλος με εύρος ακτίνας 78-80 Εκτίμηση κέντρων και εμφάνιση κύκλων για ακτίνα r=80 Page23
Εκτίμηση κέντρων και εμφάνιση κύκλων για ακτίνα r=79 Εκτίμηση κέντρων και εμφάνιση κύκλων για ακτίνα r=78 Page24
Βιβλιογραφική Αναφορά: 1. Forsyth 22.1, 10.1-10.4 2. Szeliski A.2, 4.3.2, 6.1.4 3. Lectures Alexandros Makris Page25
Annotations ΕΙΔΙΚΕΥΣΗΣ Assignment 3 Ρομποτικησ, Αυτοματισμου Κ Α Ι 01 Unknown Unknown Page 1 10/2/2017 11:13 B:8.5/10 02 Unknown Unknown Page 3 10/2/2017 11:00 3/3 03 Unknown Unknown Page 12 10/2/2017 11:13 5.5/7 04 Unknown Unknown Page 16 10/2/2017 11:10 -Me ton tropo pou entopizete tous kuklous (local max gia kathe r xwrista) den einai dunato na ginei swsta se diafores aktines to opoio fainetai sta peiramata. -Leipei i optikopoiisi tou xwrou Hough.