ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΚΡΗΤΗΣ ΔΠΜΣ ΠΡΟΗΓΜΕΝΑ ΣΥΣΤΗΜΑΤΑ ΠΑΡΑΓΩΓΗΣ ΑΥΤΟΜΑΤΙΣΜΟΥ ΚΑΙ ΡΟΜΠΟΤΙΚΗΣ ΕΡΓΑΣΙΑ 1 η ADVANCES IN DIGITAL AND COMPUTER VISION ΣΠΟΥΔΑΣΤΕΣ: ΓΕΡΜΕΝΗΣ ΕΥΑΓΓΕΛΟΣ (Α.Μ.: ΜΗ77) ΠΑΠΑΔΟΠΟΥΛΟΣ ΓΕΩΡΓΙΟΣ (Α.Μ.:ΜΗ79) ΕΠΙΒΛΕΠΩΝ ΚΑΘΗΓΗΤΗΣ: ΑΛΕΞΑΝΔΡΟΣ ΜΑΚΡΗΣ ΗΡΑΚΛΕΙΟ 2016 1
Exercise 1 (25%) Implement a function myhist that takes as input arguments a uint8 grayscale image (0-255) and the number of bins and returns the corresponding image histogram. The function call should be: H = myηist(i,n) where I is the input image, n the number of bins and H the histogram (n elements vector).to display the histogram you can use the stem function. To verify your results compare with the built-in matlab function imhist. Για την δημιουργία της συνάρτησης H = myηist(i,n) δημιουργήσαμε ένα βήμα step=256/n που μας δίνει την πληροφορία της χωρητικότητας του κάθε bin. Έπειτα ορίσαμε ζώνες (zone) με αριθμό ζώνης εξαρτώμενο κάθε φορά απ το step που υπολογίζεται. Το zone=floor (i/step +1) μας δίνει κάθε φορά το ακέραιο μέρος του υπολογισμού οπότε πέφτουμε πάντα μέσα στην ζώνη εωσότου το step= i.το δεύτερο μέρος είναι ο καθορισμός των ορίων της φωτεινότητας της κάθε ζώνης που θα ψάχνει κάθε φορά. Δηλαδή το upper level και το lower level. Εν τέλει δημιουργείται ο πίνακας (Η) που το μέγεθος του καθορίζεται από τον αριθμό των ζωνών (για κάθε n που εισάγεται απ τον χρήστη) και η τιμή του καθορίζεται από την συνθήκη I(r)<upl && I(r)>=lowl && I(r)==i.Ο (Η) είναι πίνακας αθροισμάτων pixel που βρίσκονται εντός των ορίων (upl,lowl) των φωτεινοτήτων (intensity values) για κάθε ζώνη (zone). Αναλυτικά στον κώδικα: function [H]=myHist(I,n) s=size(i); % Διαστάσεις εικόνας m,n [m n] sreal=s(1)*s(2); % Υπολογισμός συνολικού αριθμού pixel H=zeros(1,n); % Δημιουργία μηδενικού πίνακα γραμμής με μήκος n(αριθμός bins)που εισάγεται απ'τον χρήστη step=round(256/n); %Υπολογισμός βήματος για n(bins) που θέλει ο χρήστης για το ιστόγραμμα του.to step μας βοηθά έπειτα στην διαλογή ζώνης(δημιουργία ζώνης αναλόγως το step πάντα) for r=1:sreal; % για κάθε pixel( sreal αριθμός pixel) for i=0:255; % σκάλα φωτεινότητας (0: Μαύρο,255:Λευκό) zone=floor((i/step)+1); % Βασικός υπολογισμός ζώνης. Η ζώνη θα αλλάξει μόνον όταν το step=i. Δηλαδή ακριβώς στο όριο που θέλουμε για το ανάλογο step κάθε φορά. upl=zone*step; % Δημιουργία άνω ορίου το οποίο μας εξασφαλίζει την διαλογή των pixel μέχρι την συγκεκριμένη φωτεινότητα 2
lowl=(zone-1)*step;% Δημιουργία κάτω ορίου το οποίο μας εξασφαλίζει από που θα ξεκινήσει η διαλογή των pixel για κάθε ζώνη μέχρι το upper level. Το -1 βρίσκεται στην σχέση για την πρώτη ζώνη ώστε να συμπεριλάβει την τιμή 0 φωτεινότητα if I(r)<upl && I(r)>=lowl && I(r)==i; % Συνθήκη που μας εξασφαλίζει την διαλογή των εντός ζώνης pixel κάθε φορά χωρίς να παίρνει την τιμή του upper level δύο φορές διότι (I(r)<upl). H(zone)=H(zone)+1; % Ο πίνακας (Η) εδώ θα έχει διαστάσεις ανάλογα με τις ζώνες που προκύπτουν για κάθε n(bins) που δίδει ο χρήστης και θα δημιουργεί τα αθροίσματα των pixel που βρίσκονται εντός των ορίων φωτεινότητας stem(h) % Προβολή Ιστογράμματος Παρακάτω γίνεται η σύγκριση των αποτελεσμάτων με την myhist που δημιουργήσαμε και την imhist(built-in) του MatLab. Παρατηρούμε ότι τα αποτελέσματα βρίσκονται πολύ κοντά με κάποιες μικρές διαφορές που οφείλονται στον τρόπο λειτουργείας των δυο συναρτήσεων και πιο συγκεκριμένα στον τρόπο με τον οποίο επιλέγουν τα επίπεδα των bins. Στην myhist έγινε διαχωρισμός των ορίων βάση του step=256/n και του zone=floor((i/step)+1); Για barbara.tif, n=256 myhist imhist-matlab 3
Για barbara.tif, n=50. Παρατηρούμε ότι δουλεύει ανάλογα για κάθε αριθμό bins Imhist-Matlab myhist 4
Exercise 2 (25%) Implement a function mynormalize that attempts to normalize a uint8 grayscale image to the interval 0-255. For the normalization you should use the min-max intensity values of the input image to find the appropriate linear transformation. The function call should be: In = myνormalize(i); where Ι is the input image In is the output normalized image. Apply your function in several images (3-4) including under and over-exposed images and comment on the results. Additionally present the image histograms before and after the normalization. Στην συνάρτηση mynormalize από τα μαθηματικά έγινε χρήση τις παρακάτω σχέσης για Κανονικοποίηση στο διάστημα 0-255. Στην σχέση έπρεπε να μετατρέψουμε τους πίνακες (I), (mi),(ma-mi) σε μορφή double έτσι ώστε να επιτρέπονται οι αριθμητικές πράξεις. Αφαιρέσαμε απ όλες τις τιμές του (Ι) πίνακα την min τιμή έτσι ώστε να πάρουμε για το min = 0 εν συνεχεία διαιρέσαμε με το (max-min) έτσι ώστε η μέγιστη τιμή να πάρει την τιμή (1) και οι μηδενικές (0) τιμές να μην αλλάξουν καθόλου. Έπειτα πολλαπλασιάζουμε όλο το (Ι) πίνακα με * 255 αυξάνοντας ανάλογα όλα τα στοιχεία και φτιάχνουμε την μέγιστη τιμή max = 255. Αναλυτικά στον κώδικα: function [In]= mynormalize(i) mi=min(min(i)); % Υπολογισμός min του I ma=max(max(i)); % Υπολογισμός max του I %Τα Ι, max, min πρέπει να είναι double για να ορίζονται οι πράξεις και τέλος να γίνει η μετατροπή σε uint8, τυποποίηση που θέλουμε για την προβολή. In = uint8(255.* ((double(i)-double(mi)))./ double(ma-mi)) ; % Αφαιρούμε την min τιμ για να πετύχουμε την 0 φωτεινότητα. Έπειτα διαιρούμε στοιχείο προς στοιχείο(./) με το max-min για να πετύχουμε για την τιμή max=1 και εν συνεχεία πολλαπλασιάζουμε(*) με το 255 για max=255. Παρακάτω επιλέξαμε διάφορες εικόνες ώστε να γίνει αντιληπτή η επιρροή της συνάρτησης. Στα αριστερά φαίνονται πριν την Κανονικοποίηση και δεξιά μετά την Κανονικοποίηση έπειτα ακολουθούν αναλόγως τα ιστογράμματα για κάθε μία ξεχωριστά. Επίσης στο Script μας πριν καλέσουμε την συνάρτηση mynormalize κόβουμε τις υψηλές φωτεινότητες για κάθε φωτογραφία έτσι ώστε να είναι μεγάλη η επιρροή της κανονικοποίησης. Δημιουργούμε λογικό binary πίνακα (Ι1) και όπου η φωτεινότητα >100 τότε 1.Έπειτα χρησιμοποιούμε τον Ι1 πίνακα ως δείκτη του (Ι) και όπου =1 στον (Ι1) τότε =100 στον(ι). 5
clc Αναλυτικά στον κώδικα: clear all I2=imread( eagle.jpg'); I=rgb2gray(I2); % Μετατροπή κάθε εικόνας σε grayscale. I1=[I>100]; % κόψιμο υψηλών φωτεινοτήτων (λογικός πίνακας Ι1 binary με 1 όπου φωτεινότητα >100). I(I1)=100; % Χρήση Ι1 ως δείκτη και κάνω όλες τις φωτεινότητες στον πίνακα εικόνα Ι > 100, = 100. In=myNormalize(I); % Κανονικοποίηση 6
7
8
Exercise 3 (50%) (a) Implement a function that takes as inputs (i) the focal length of the camera f, (ii) the image dimensions in pixels im_size(width,height), and (iii) a vector P representing a 3d point (X,Y,Z) and returns: The image coordinates of the point (u,v) as a 2d vector p. A variable valid taking the value 1 if the point is within the image and 0 otherwise. The function call should be: [p, valid] = myproject(f,im_size,p) Assume that the optical center of the camera is at the center of the image. Apply the function to calculate the image coordinates of the 3d points of the file <3dpoints_a.mat>. Try different f and im_size values and comment on how these values influence the image coordinates of the same 3d points. (b) Implement a function that modifies the previous one so that instead of a single 3d point it takes as input n 3d points as a matrix P(3*n) (each column of the matrix represents the coordinates (X,Y,Z) of a point). The function should output a matrix p(2*n) with the image coordinates of these points and a vector valid(1*n). The function call should be: [p, valid] = myprojectm(f,im_size,p) Apply the function using a matrix containing some 3d points. 9
(c) Load the 3d points P from <3dpoints_b.mat, 3dpoints_c.mat> and project them in the image using myprojectm. Visualize these points. For the visualization you could create a uint8 matrix containing zeros and with dimensions equal to im_size and display in that matrix the projected points by giving the value 255 to the corresponding pixels. Display that matrix using imshow. Try to enhance the visualization by replacing the 255 value with a value that deps on Ζ of each 3d point. Present the obtained results using several f and im_size values. Για (a), (b) ερωτήματα Το οπτικό κέντρο βρίσκεται στο κέντρο της εικόνας οπότε προκύπτει u=w/2 και το v=h/2 Το width και το height της εικόνας το παίρνουμε από της διαστάσεις της εικόνας Η συνάρτηση φτιάχτηκε για να λειτουργεί για ένα σημείο αλλά και για πίνακα σημείων 3 x n. Το γινόμενο του intrinsic matrix με της ομογενής συντεταγμένες του 3D σημείου μας επιτρέπει να προβάλουμε τα ομογενή σημεία του τρισδιάστατου χώρου (3D) σε δύο διαστάσεις (2D). Παράλληλα δημιουργηθήκαν δύο ακόμα συναρτήσεις οι οποίες καλούνται εσωτερικά της συνάρτησης myproject,η tohom μετατρέπει από 3D συντεταγμένες σε ομογενής και η fromhom από ομογενής σε καρτεσιανές. Αναλυτικά οι κώδικες: function [P] = fromhom(ph) u1=ph(1,:); v1=ph(2,:); c=ph(3,:); u=u1./c; v=v1./c; P=[u;v]; % -------------------Solution_2-------- % s=size(ph); % s2=s(1)-1; % P2=Ph(1:s2,:); % q1=ph(s(1),:); % P3=bsxfun(@rdivide,Ph,q1); % Διαίρεση μίας γραμμής απ τα δεξιά με κάθε στοιχείο του πίνακα (για διαφορετικές διαστάσεις) % P=(P3(1:s2,:)); 10
function [Ph] = tohom(p) s=size(p); v=ones(1,s(2)); Ph=[P;v]; %vazw asous gian na ginoun omogenis function [ p,valid ] = myproject(f,im_size,p) sim=size(p);% Διαστάσεις σημείου colp=sim(2);% Στήλες του πίνακα σημείου w=im_size(1);% width της εικόνας h=im_size(2);% height της εικόνας u0=w/2; % Οπτικό κέντρο v0=h/2; % Οπτικό κέντρο intr=[f 0 u0 0;0 f v0 0;0 0 1 0]; % intrinsic matrix Homog=toHom(P);% συντεταγμένες Function μετατρέπη το σημείο P se ομογενής p2=intr*homog ;% προβολή του 3D σημείου σε 2D ομογενής p=fromhom(p2) valid=zeros(1,colp); % σημείου P colp είναι ο αριθμός των στηλών του πίνακα u=p(1,:); % Καρτεσιανό x v=p(2,:); % Καρτεσιανό y for i=1:sim(2); if u(i)<=w && v(i)<=h; % Επαλήθευση εάν βρίσκεται εντός εικόνας το σημείο else valid(i)=1; valid(i)=0; 11
Εφαρμογή για πίνακα σημείων Pmatrix=[P0 P1 P2 P3]; στο 3dpoint_a.mat για f=20 και im_size=200x200 Δοκιμάζουμε να μειώσουμε το focal length, για f=2. Τα σημεία φαίνεται ότι συγκλίνουν προς στο κέντρο.ενώ όταν αν μεγαλώσω το f=200 πολύ τότε κάποια φεύγουν εκτός ορίων της εικόνας. 12
Δοκιμάζουμε να κρατώντας σταθερό το focal length να μειώσουμε το im_size. Για f=200 και im_size=20x20. Παρατηρούμε ότι τα σημεία πέφτουν έξω απ την εικόνα. 13
(c) ερώτημα Το αποτέλεσμα πλησιάζει σαυτό της εικόνας από τα σημεία 3dpoints_c.mat. Αλλά δεν είναι το επιθυμητό. Πρέπει να χρησιμοποιήσουμε την πληροφορία του Ζ των τρισδιάστατων σημείων και να κανονικοποιήσουμε για PZmin=942 και PZmax=7287.Ανάλογος το Ζ να ρυθμίζουμε και την φωτεινότητα. Επίσης πρέπει να τοποθετήσουμε σε μια εικόνα 512x512 όπως η παρακάτω με μια συνθήκη όλα τα x,y ανάλογα με το Z. Προγραμματιστικά δεν μπορέσαμε να φτάσουμε σε κάποια λύση. Παρακάτω φαίνεται η προσέγγιση μας στην εικόνα. 14
Αναλυτικά ο κώδικας: clc clear all im_size=[512 512]; load('3dpoints_c.mat'); f=300; [ p,valid ] = myprojectm(f,im_size,p) p_ak=floor(p);% ακέραιο μέρος του P I=uint8(zeros(512)); % Δημιουργια πίνακα zeros αναλόγος το Im_size e1=p_ak(1,:); e2=p_ak(2,:); % Διαχωρισμός γραμμών του p_aκ for i=1:length(e1) I(e1(i),e2(i))=255; % Τα e1,e2 μας δίνουν συντεταγμένες στην εικόνα που πάμε και ασπρίζουε imshow(i') 15