ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΚΡΗΤΗΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΔΙΑΤΜΗΜΑΤΙΚΟ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ ΠΡΟΗΓΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΠΑΡΑΓΩΓΗΣ ΑΥΤΟΜΑΤΙΣΜΟΥ & ΡΟΜΠΟΤΙΚΗΣ 01 ΜΗΧΑΝΙΚΗ ΟΡΑΣΗ 3η ΕΡΓΑΣΙΑ ΣΠΟΥΔΑΣΤΕΣ: ΕΙΣΗΓΗΤΗΣ ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΑΜ: ΜΗ62 ΔΡ ΜΑΚΡΗΣ ΑΛ. ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ ΑΜ: ΜΗ69 ΧΕΙΜΕΡΙΝΟ ΕΞΑΜΗΝΟ 2016-2017
02 ΑΣΚΗΣΗ 1 a) Στην παρούσα εργασία ζητείται να συνταχθεί ένας απλός blob detector μέσω μιας function. Η συνάρτηση του ανιχνευτή αυτού θα έχει ως είσοδο μια εικόνα και μια ακτίνα του κύκλου και θα επιστρέφει τους κύκλους της εικόνα που έχουν την συγκεκριμένη ακτίνα. Εν αντιθέση με την εκφώνηση της άσκησης που ζητάει η συνάρτηση να επιστρέφει τις συντεταγμένες των κέντρων του κύκλου, επιλέχθηκε να γίνει οπτικοποίηση του αποτελέσματος στην εικόνα. Το script που αναπτύχθηκε είναι το παρακάτω: clear all; clc; %καθαραρίζουμε το ιστορικό I=imread('black_dots.jpg'); %εισάγουμε την εικόνα r=50; %ορίζουμε την ακτίνα των κύκλων C=blobdetector(I,r) %εισάγουμε τα δεδομένα στην function C; %ζητάμε να εκτυπωθούν τα κέντρα Η function blobdetector είναι η παρακάτω: function [ C ] = blobdetector( I, r ) I_gr = rgb2gray(i); %μετατρέπουμε την εικόνα I_gr=im2uint8(I_gr); %μετατρέπουμε την εικόνα sigma=r/sqrt(2); %ορίζουμε το σ= r 2 hsize=[10, 10]; %ορίζουμε το μέγεθος του φίλτρου I_double=double(I_gr); %μετατρέπουμε την εικόνα figure(1); imshow(i); %εμφανίζουμε την αρχική εικόνα Fsx=sigma^2*fspecial('log',hsize,sigma); %δημιουργούμε το φίλτρο I_fil = imfilter(i_double,fsx); %φιλτράρουμε την εικόνα I_fil_thr=I_fil>0.22; %εφαρμόζουμε κατωφλίωση figure(2); imshow(i_fil_thr); %εμφανίζουμε την κατωφλιωμένη εικόνα S=regionprops(I_fil_thr,'centroid'); %βρίσκουμε τα κέντρα των κύκλων centroids=cat(1,s.centroid); %και τα εμφανίζουμε imshow(i_fil_thr); hold on C=[centroids(:,1),centroids(:,2)]; plot(centroids(:,1),centroids(:,2),'g*') ; R(1:size(centroids,1),1) = r; %σχεδιάζουμε κόκκινους κύκλους PTS = int16([c R]); %γύρω από τα σημεία που βρήκαμε red = uint8([255 0 0]); %σαν κέντρα των κύκλων J = vision.shapeinserter('shape', 'Circles', 'BorderColor','Custom','CustomBorderColor', red); Y = step(j, I, PTS); imshow(y); %εμφανίζουμε το αποτέλεσμα ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 1
Οι εικόνες που πήραμε για την πάνω συνάρτηση είναι οι παρακάτω δύο εικόνες: Για την εικόνα circles_01 δηλώσαμε: r=45, hsize=2*r και I_fil_thr=I_fil>20 και πήραμε: Για την εικόνα circles_02 δηλώσαμε: r=15, hsize=2*r και I_fil_thr=I_fil>30 και πήραμε: ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 2
Η ίδια διαδικασία έγινε και με τις υπόλοιπες εικόνες. b) Στο δεύτερο ερώτημα ζητείται να προστεθεί μια επιπλέων παράμετρος που ο χρήστης θα επιλέγει αν θέλει να εμφανίζονται οι σκούροι κύκλοι (επιλογή =1), οι ανοιχτόχρωμοι κύκλοι (επιλογή=2) ή όλοι οι κύκλοι (επιλογή 3) Το script και η function τροποποιήθηκε ως κάτωθι: clear all; clc; I=imread('white_dots.jpg'); r=25; t=2 C=blobdetector2(I,r,t) 03 I_gr = rgb2gray(i); I_gr=im2uint8(I_gr); sigma=r/sqrt(2); hsize=2*r; I_double=double(I_gr); figure(1); imshow(i); Fsx=sigma^2*fspecial('log',hsize,sigma); I_fil = imfilter(i_double,fsx); if t==1 I_fil_thr=I_fil>25; else if t==2 I_fil_thr=I_fil<-25; else I_fil_thr=(I_fil<-0.22 & I_fil>0.22); figure(2); imshow(i_fil_thr); S=regionprops(I_fil_thr,'centroid'); centroids=cat(1,s.centroid); imshow(i_fil_thr); hold on C=[centroids(:,1),centroids(:,2)]; plot(centroids(:,1),centroids(:,2),'g*') ; R(1:size(centroids,1),1) = r; PTS = int16([c R]); red = uint8([255 0 0]); J = vision.shapeinserter('shape', 'Circles', 'BorderColor','Custom','CustomBorderColor', red); Y = step(j, I, PTS); imshow(y); 04 Τα αποτελέσματα που πήραμε για όταν τρέξαμε το παραπάνω script ήταν οι εξής δύο εικόνες: ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 3
Επαναλήφθηκε η ίδια διαδικασία με όλες τις εικόνες όπως στο προηγούμενο ερώτημα και πήραμε τα ίδια αποτελέσματα. c) Στο τρίτο ερώτημα ζητείται να δίνει ο χρήστης ένα εύρος τιμών ακτινών και η function να επιστρέφει όλους τους κύκλους που εντοπίζονται στην εικόνα 05 clear all; clc; I=imread('coins.jpg'); I_gr=im2uint8(I); Isize=size(I_gr); if (length(isize)==3) I_gr=rgb2gray(I_gr); r_min=25; r_max=30; I_double=double(I_gr); figure(1); imshow(i); count=1; for i=r_min:r_max r=i; sigma=r/sqrt(2); hsize=2*r; Fsx=sigma^2*fspecial('log',hsize,sigma); I_fil = imfilter(i_double,fsx); I_fil_thr=I_fil<-20; E(:,:,count)=I_fil_thr; count=count+1; S = regionprops(e, 'centroid'); centroids=cat(1,s.centroid); figure(3) imshow(i); hold on C=[centroids(:,1),centroids(:,2)]; ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 4
plot(centroids(:,1),centroids(:,2),'g*') ; R(1:size(centroids,1),1) = r; PTS = int16([c R]); red = uint8([255 0 0]); J = vision.shapeinserter('shape', 'Circles', 'BorderColor','Custom','CustomBorderColor', red); RGB = repmat(i,[1,1,3]); Y = step(j, I, PTS); figure(4) imshow(y); 06 Οι τρείς εικόνες που πήραμε είναι: ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 5
07 ΑΣΚΗΣΗ 2 Στην παρούσα άσκηση ζητήθηκε να εντοπιστούν κύκλοι σε εικόνες με δεδομένη ακτίνα μέσω του μετασχηματισμού Hough και να οπτοικοποιηθεί το αποτέλεσμα. Συντάχθηκε το παρακάτω script: clear all; clc; %καθαρίζουμε το ιστορικό I=imread('circles_05.jpg'); %εισάγουμε την εικόνα r=18; %θέτουμε την ακτίνα των κύκλων Isize=size(I); %μετατρέπουμε την εικόνα if (length(isize)==3) I=rgb2gray(I); I_d=double(I); %μετατρέπουμε την εικόνα σε double a=min(min(i_d)); %βρίσκουμε το ελάχιστο b=max(max(i_d)); %και το μέγιστο In=(I_d - a) * 255 / (b - a); %για να κάνουμε κανονικοποίηση fsxg=fspecial('gaussian',[3,3],0.5); % ορίζουμε το Gaussian φίλτρο fsxs= fspecial('sobel'); %ορίζουμε το sobel φίλτρο Ix=imfilter(fsxg,fsxs); %φίλτρο παραγώγισης ως προς x Iy=imfilter(fsxg,fsxs') ; %Φίλτρο παραγώγισης ως προς y Im1=imfilter(In,Ix); Im2=imfilter(In,Iy); Im3=sqrt(Im1.^2+Im2.^2); Im3=Im3>235; figure(1) %εμφανίζουμε την εικόνα imshow(im3) hough=im3.*0; %φτιάχνουμε έναν μηδενικό πίνακα [K2,K1]=find(Im3); x=length(k1); for i=1:x hough=addcircle(hough,r,k1(i),k2(i),0.011); %ψηφίζουμε figure(2) imshow(hough) hough=hough>0.30; %κατωφλιώση S = regionprops(hough, 'centroid'); centroids=cat(1,s.centroid); figure(3) imshow(i); hold on C=[centroids(:,1),centroids(:,2)]; plot(centroids(:,1),centroids(:,2),'g*') ; R(1:size(centroids,1),1) = r; PTS = int16([c R]); red = uint8([255 0 0]); J = vision.shapeinserter('shape', 'Circles', 'BorderColor','Custom','CustomBorderColor', red); RGB = repmat(i,[1,1,3]); Y = step(j, RGB, PTS); figure(4) imshow(y); ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 6
Πήραμε τις παρακάτω εικόνες: Επαναλάβαμε το script με την εικόνα black_dots με r=50 και threshold= 0.65 και πήραμε: ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 7
Επαναλάβαμε το script με την εικόνα circle_03 με r=75 και threshold= 0.70 και πήραμε: Κάναμε την ίδια διαδικασία με τις υπόλοιπες εικόνες και πήραμε το ίδιο αποτέλεσμα. ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 8
b) Στο δεύτερο ερώτημα ζητείται να γίνει η ίδια διαδικασία με διάφορες τιμές ακτίνων: Συντάχθηκε το παρακάτω script: clear all; clc; I=imread('coins.jpg'); I=im2uint8(I); Isize=size(I); if (length(isize)==3) I=rgb2gray(I); r_min=25; r_max=30; count=1; for r=r_min:r_max I_d=double(I); a=min(min(i_d)); b=max(max(i_d)); In=(I_d - a) * 255 / (b - a); fsxg=fspecial('gaussian',[3,3],0.5); fsxs= fspecial('sobel'); Ix=imfilter(fsxg,fsxs); Iy=imfilter(fsxg,fsxs') ; Im1=imfilter(In,Ix); Im2=imfilter(In,Iy); Im3=sqrt(Im1.^2+Im2.^2); Im3=Im3>235; figure(1) imshow(im3) hough=im3.*0; [K2,K1]=find(Im3); x=length(k1); for i=1:x hough=addcircle(hough,r,k1(i),k2(i),0.011); figure(2) imshow(hough) hough=hough>0.9; E(:,:,count)=hough; count=count+1; S = regionprops(e, 'centroid'); centroids=cat(1,s.centroid); figure(3) imshow(i); hold on C=[centroids(:,1),centroids(:,2)]; plot(centroids(:,1),centroids(:,2),'g*') ; R(1:size(centroids,1),1) = r; PTS = int16([c R]); red = uint8([255 0 0]); J = vision.shapeinserter('shape', 'Circles', 'BorderColor','Custom','CustomBorderColor', red); RGB = repmat(i,[1,1,3]); Y = step(j, RGB, PTS); figure(4) imshow(y); ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 9
08 Ουσιαστικά είναι επανάληψη του πρώτου script με την διαφορά ότι μπαίνει σε μια επανάληψη η διαδικασία προκειμένου να γίνει ανάλυση για κάθε τιμή της ακτίνας. Τα αποτελέσματα που πήραμε είναι τα παρακάτω: Επαναλάβαμε το ίδιο script για την εικόνα circles_04.jpg με r_min=20 και r_max=35 καθώς και threshold 0.33 και πήραμε τις παρακάτω εικόνες: ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 10
c) Στο τρίτο ερώτημα ζητείται να χρησιμοποιηθεί η διεύθυνση gradient προκειμένου να μειωθεί ο θόρυβος. Συντάχθηκε το παρακάτω script: clear all;clc; I=imread('circles_05.jpg') r=18; Isize=size(I); if (length(isize)==3) I=rgb2gray(I); I_d=double(I); a=min(min(i_d)); b=max(max(i_d)); In=(I_d - a) * 255 / (b - a); fsxg=fspecial('gaussian',[3,3],0.5); fsxs= fspecial('sobel'); Ix=imfilter(fsxg,fsxs); Iy=imfilter(fsxg,fsxs') ; Im1=imfilter(In,Ix); Im2=imfilter(In,Iy); Im3=sqrt(Im1.^2+Im2.^2); theta=atan(im2./im1); Im3=Im3>240; figure(1) imshow(im3) dx=floor(r.*cos(theta)); dy=floor(r.*sin(theta)); hough=im3.*0; [K2,K1]=find(Im3); x=length(k1) for i=1:x q1=k2(i)+dx(k2(i),k1(i)) q2=k1(i)+dy(k2(i),k1(i)); q3=k2(i)-dx(k2(i),k1(i)); q4=k1(i)-dy(k2(i),k1(i)); if (((q1<size(im3,1)) && (q2>0)) && (q2<size(im3,2))) hough(q1,q2)=hough(q1,q2)+0.1; if ((q3>0) && (q4>0) && (q4<size(im3,1))) hough(q3,q4)=hough(q3,q4)+0.1; ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 11
hf= fspecial('average'); hough=imfilter(hough,hf); figure(2) imshow(hough) hough=hough>0.20; S = regionprops(hough, 'centroid'); centroids=cat(1,s.centroid); figure(3) imshow(i); hold on C=[centroids(:,1),centroids(:,2)]; plot(centroids(:,1),centroids(:,2),'g*') ; R(1:size(centroids,1),1) = r; PTS = int16([c R]); red = uint8([255 0 0]); J = vision.shapeinserter('shape', 'Circles', 'BorderColor','Custom','CustomBorderColor', red); RGB = repmat(i,[1,1,3]); Y = step(j, RGB, PTS); figure(4) imshow(y); Οι εικόνες που πήραμε: ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 12
Για την εικόνα ciracles_02.jpg και για r=15 πήραμε: Έγινε η ίδια διαδικασία και με τις υπόλοιπες εικόνες και πήραμε παρόμοια αποτελέσματα. ΔΗΜΟΠΟΥΛΟΣ ΑΝΔΡΕΑΣ ΧΑΡΚΙΟΛΑΚΗΣ ΜΙΧΑΛΗΣ 13
Annotations Μηχανικη οραση 3 01 Page 1 10/2/2017 10:52 B: 8/10 02 Page 2 10/2/2017 10:36 2/3 03 Page 4 10/2/2017 10:25 To threshold edw den fainetai swsto, giati einai diaforetiko stin 3i periptwsi; 04 Page 4 10/2/2017 10:27 Edw den fainetai an douleuoun oi 3 epiloges. 05 Page 5 10/2/2017 10:36 To threshold edw sas diagrafei oli tin pliroforia gia to megethos tou kathe 'peak'. 06 Page 6 10/2/2017 10:29 Ta kentra einai ok alla oi aktines twn blobs lathos. 07 Page 7 10/2/2017 10:51 6/7 08 Page 11 10/2/2017 10:51 Kai edw fainetai oti i aktina den exei ektimithei swsta, pithanotata gia ton idio logo me prin.