Προς το περιεχόμενο

Ανάγνωση δυαδικής εικόνας και εντοπισμός τετραγώνου σε Matlab


eirinikp

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια!

Έχω βρει εδώ τον κώδικα ο οποίος εντοπίζει ποιο από τα σχήματα μίας εικόνας μοιάζει περισσότερο με κύκλο.

Τον παραθέτω και εδώ για περισσότερη ευκολία:

>
%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 είναι το κλάσμα του εμβαδού δια το μήκος επί πλάτος.

Το θέμα είναι ότι θεωρητικά έχω βρει τους τρόπους, αλλά πρακτικά δεν ξέρω με ποιες συναρτήσεις θα πάρω αυτά που χρειάζομαι...

 

Ευχαριστώ!

Δημοσ.

Νομίζω οτι δε χρειάζεσαι και πολλές αλλαγές απο αυτό που έχεις ήδη ποστάρει..

στο link που δωσες στο Step 5: Determine which Objects are Round

υπολογίζει μία μετρηση που όπως λές πρέπει να είναι κοντά στο 1..

το μόνο που έχεις να κάνεις είναι να αλλάξεις το metric = 4*pi*area/perimeter^2; σε metric=16*area/perimeter^2;

 

δοκίμασε και πές μου...

Δημοσ.

το μόνο που έχεις να κάνεις είναι να αλλάξεις το metric = 4*pi*area/perimeter^2; σε metric=16*area/perimeter^2;

 

Δεν καταλαβαίνω γιατί βάζεις το 16. Στα αποτελέσματα που παίρνω με την αλλαγή δεν είναι πιο κοντά στο 1 το τετράγωνο, απλά θα ήθελα να μου εξηγήσεις γιατί σκέφτηκες να βάλεις το 16 για να καταλάβω τη λογική σου, μήπως το διορθώσουμε.

Δημοσ.

έστω τετράγωνο με μήκος πλευράς α, τότε αν ειναι τετράγωνο το εμβαδόν του θα ναι α^2 και η περίμετρος θα ναι 4*α..

 

θέλουμε να βρούμε ένα λόγο ο οποίος να βγάζει μονάδα. Οπότε υψώνω στο τετράγωνο τη περίμετρο και βγάζει 16α^2 οπότε το μόνο που έχουμε να κάνουμε είναι να πολλαπλασιάσω και το εμβαδόν με 16.

Αν είναι τετράγωνο τότε σίγουρα θα βγαίνει μονάδα.. το αντίθετο βέβαια δε ξέρω αν ισχύει...

Δημοσ.

Αν είναι τετράγωνο τότε σίγουρα θα βγαίνει μονάδα.. το αντίθετο βέβαια δε ξέρω αν ισχύει...

 

Αν ίσχυε το αντίθετο θα έπρεπε ξεκινώντας από τη σχέση 16E^2 = T^2, όπου E και T το εμβαδόν και η περίμετρος οποιουδήποτε τυχαίου σχήματος, να καταλήξουμε ότι το σχήμα πρέπει να είναι τετράγωνο. Δεν μπορούμε όμως μόνο από αυτό να φτάσουμε σε τέτοιο συμπέρασμα... Το μόνο που συμπεραίνουμε όταν ισχύει αυτή η σχέση είναι ότι η περίμετρος είναι τετραπλάσια του εμβαδού... Από εκεί δεν έχουμε κανένα άλλο στοιχείο να προχωρήσουμε.

 

Ευχαριστώ πάντως για την προσπάθεια! ;)

Δημοσ.

Βασικά να σε ρωτήσω που ακριβώς δοκίμασες οτι δε δουλεύει ? επειδή εγώ το δοκίμασα όπως στο link απλα με την αλλαγή που είπα και έβγαλε λογικά αποτελέσματα.. δηλαδή το ορθογώνιο ήταν περισσότερο τετράγωνο απο τους κύκλους και το άλλο το πολύγωνο...

 

Όπως και ο υπολογισμός του κύκλου που υπολογίζεται στο link έχει ακριβώς αυτή τη λογική..

Δημοσ.

Δίκιο έχεις... και κρίνεται λοιπόν στο οτι πολλα σχήματα έχουν αυτή την ιδιότητα χωρίς απαραίτητα να είναι τετράγωνα.. αλλα μου κάνει μεγάλη εντύπωση.. γιατί εφόσον είναι τετράγωνο δεν το βγάζει κοντα στο 1... κάτι παίζει με τον υπολογισμό του εμβαδού και της περιμέτρου

 

edit:

Λοιπόν δε ξέρω πως υπολογίζει τη περίμετρο... αλλα υποθέτω οτι εκεί παίζει κάτι..

δοκίμασε τον υπολογισμό της περιμέτρου όπως υπολογίζει αυτός το εμβαδόν.. stats = regionprops(L,'Αrea','Centroid'); έχει και Parameter

τώρα δε προλαβαίνω θα το δω αύριο αν όχι σήμερα το βραδάκι, πές μου αν έχεις καμια πρόοδο.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...