eirinikp Δημοσ. 24 Μαρτίου 2010 Δημοσ. 24 Μαρτίου 2010 Γεια! Έχω βρει εδώ τον κώδικα ο οποίος εντοπίζει ποιο από τα σχήματα μίας εικόνας μοιάζει περισσότερο με κύκλο. Τον παραθέτω και εδώ για περισσότερη ευκολία: > %READ THE IMAGE RGB = imread('pillsetc.png'); I = rgb2gray(RGB); %THRESHOLD THE IMAGE threshold = graythresh(I); bw = im2bw(I,threshold); %REMOVE THE NOISE % remove all object containing fewer than 30 pixels bw = bwareaopen(bw,30); % fill a gap in the pen's cap se = strel('disk',2); bw = imclose(bw,se); % fill any holes, so that regionprops can be used to estimate % the area enclosed by each of the boundaries bw = imfill(bw,'holes'); %FIND THE BOUNDARIES [b,L] = bwboundaries(bw,'noholes'); % Display the label matrix and draw each boundary imshow(label2rgb(L, @jet, [.5 .5 .5])) hold on for k = 1:length( boundary = B{k}; plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2) end %DETERMINE WHICH OBJECTS ARE ROUND stats = regionprops(L,'Area','Centroid'); threshold = 0.94; % loop over the boundaries for k = 1:length( % obtain (X,Y) boundary coordinates corresponding to label 'k' boundary = B{k}; % compute a simple estimate of the object's perimeter delta_sq = diff(boundary).^2; perimeter = sum(sqrt(sum(delta_sq,2))); % obtain the area calculation corresponding to label 'k' area = stats(k).Area; % compute the roundness metric metric = 4*pi*area/perimeter^2; % display the results metric_string = sprintf('%2.2f',metric); % mark objects above the threshold with a black circle if metric > threshold centroid = stats(k).Centroid; plot(centroid(1),centroid(2),'ko'); end text(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','y',... 'FontSize',14,'FontWeight','bold'); end title(['Metrics closer to 1 indicate that ',... 'the object is approximately round']); Αυτό που θέλω όμως είναι να δω ποιο από αυτά μοιάζει περισσότερο με τετράγωνο... Υπάρχει καμιά ιδέα για το τι θα μπορούσα να κάνω? Παρατήρησα τη συνάρτηση regionprops, η οποία μπορεί να αναφερθεί σε πολλά χαρακτηριστικά: > 'Area' 'EulerNumber' 'Orientation' 'BoundingBox' 'Extent' 'Perimeter' 'Centroid' 'Extrema' 'PixelIdxList' 'ConvexArea' 'FilledArea' 'PixelList' 'ConvexHull' 'FilledImage' 'Solidity' 'ConvexImage' 'Image' 'SubarrayIdx' 'Eccentricity' 'MajorAxisLength' 'EquivDiameter' 'MinorAxisLength' αλλά δεν μπορώ να φανταστώ αν κάποιο από αυτά θα μπορούσε να με βοηθήσει και με ποιο τρόπο? Υπάρχει μήπως τρόπος από ένα boundary να πάρω τις ακμές και να βρω πόσες μοίρες είναι οι γωνίες στις οποίες αυτές οι ακμές τέμνονται? Επίσης θα μπορούσα να βρω το εμβαδόν των αντικειμένων, το μήκος και το πλάτος τους και μετά να δω πόσο κοντά στο 1 είναι το κλάσμα του εμβαδού δια το μήκος επί πλάτος. Το θέμα είναι ότι θεωρητικά έχω βρει τους τρόπους, αλλά πρακτικά δεν ξέρω με ποιες συναρτήσεις θα πάρω αυτά που χρειάζομαι... Ευχαριστώ!
Technology fan Δημοσ. 26 Μαρτίου 2010 Δημοσ. 26 Μαρτίου 2010 Νομίζω οτι δε χρειάζεσαι και πολλές αλλαγές απο αυτό που έχεις ήδη ποστάρει.. στο link που δωσες στο Step 5: Determine which Objects are Round υπολογίζει μία μετρηση που όπως λές πρέπει να είναι κοντά στο 1.. το μόνο που έχεις να κάνεις είναι να αλλάξεις το metric = 4*pi*area/perimeter^2; σε metric=16*area/perimeter^2; δοκίμασε και πές μου...
eirinikp Δημοσ. 26 Μαρτίου 2010 Μέλος Δημοσ. 26 Μαρτίου 2010 το μόνο που έχεις να κάνεις είναι να αλλάξεις το metric = 4*pi*area/perimeter^2; σε metric=16*area/perimeter^2; Δεν καταλαβαίνω γιατί βάζεις το 16. Στα αποτελέσματα που παίρνω με την αλλαγή δεν είναι πιο κοντά στο 1 το τετράγωνο, απλά θα ήθελα να μου εξηγήσεις γιατί σκέφτηκες να βάλεις το 16 για να καταλάβω τη λογική σου, μήπως το διορθώσουμε.
Technology fan Δημοσ. 26 Μαρτίου 2010 Δημοσ. 26 Μαρτίου 2010 έστω τετράγωνο με μήκος πλευράς α, τότε αν ειναι τετράγωνο το εμβαδόν του θα ναι α^2 και η περίμετρος θα ναι 4*α.. θέλουμε να βρούμε ένα λόγο ο οποίος να βγάζει μονάδα. Οπότε υψώνω στο τετράγωνο τη περίμετρο και βγάζει 16α^2 οπότε το μόνο που έχουμε να κάνουμε είναι να πολλαπλασιάσω και το εμβαδόν με 16. Αν είναι τετράγωνο τότε σίγουρα θα βγαίνει μονάδα.. το αντίθετο βέβαια δε ξέρω αν ισχύει...
eirinikp Δημοσ. 26 Μαρτίου 2010 Μέλος Δημοσ. 26 Μαρτίου 2010 Αν είναι τετράγωνο τότε σίγουρα θα βγαίνει μονάδα.. το αντίθετο βέβαια δε ξέρω αν ισχύει... Αν ίσχυε το αντίθετο θα έπρεπε ξεκινώντας από τη σχέση 16E^2 = T^2, όπου E και T το εμβαδόν και η περίμετρος οποιουδήποτε τυχαίου σχήματος, να καταλήξουμε ότι το σχήμα πρέπει να είναι τετράγωνο. Δεν μπορούμε όμως μόνο από αυτό να φτάσουμε σε τέτοιο συμπέρασμα... Το μόνο που συμπεραίνουμε όταν ισχύει αυτή η σχέση είναι ότι η περίμετρος είναι τετραπλάσια του εμβαδού... Από εκεί δεν έχουμε κανένα άλλο στοιχείο να προχωρήσουμε. Ευχαριστώ πάντως για την προσπάθεια!
Technology fan Δημοσ. 26 Μαρτίου 2010 Δημοσ. 26 Μαρτίου 2010 Βασικά να σε ρωτήσω που ακριβώς δοκίμασες οτι δε δουλεύει ? επειδή εγώ το δοκίμασα όπως στο link απλα με την αλλαγή που είπα και έβγαλε λογικά αποτελέσματα.. δηλαδή το ορθογώνιο ήταν περισσότερο τετράγωνο απο τους κύκλους και το άλλο το πολύγωνο... Όπως και ο υπολογισμός του κύκλου που υπολογίζεται στο link έχει ακριβώς αυτή τη λογική..
eirinikp Δημοσ. 26 Μαρτίου 2010 Μέλος Δημοσ. 26 Μαρτίου 2010 Σε αυτήν την εικόνα, η οποία έχει ένα ορθογώνιο και ένα τετράγωνο, πιο κοντά στο 1 βγαίνει το ορθογώνιο και όχι το τετράγωνο
Technology fan Δημοσ. 26 Μαρτίου 2010 Δημοσ. 26 Μαρτίου 2010 Δίκιο έχεις... και κρίνεται λοιπόν στο οτι πολλα σχήματα έχουν αυτή την ιδιότητα χωρίς απαραίτητα να είναι τετράγωνα.. αλλα μου κάνει μεγάλη εντύπωση.. γιατί εφόσον είναι τετράγωνο δεν το βγάζει κοντα στο 1... κάτι παίζει με τον υπολογισμό του εμβαδού και της περιμέτρου edit: Λοιπόν δε ξέρω πως υπολογίζει τη περίμετρο... αλλα υποθέτω οτι εκεί παίζει κάτι.. δοκίμασε τον υπολογισμό της περιμέτρου όπως υπολογίζει αυτός το εμβαδόν.. stats = regionprops(L,'Αrea','Centroid'); έχει και Parameter τώρα δε προλαβαίνω θα το δω αύριο αν όχι σήμερα το βραδάκι, πές μου αν έχεις καμια πρόοδο.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.