Verfasst am: 09.06.2011, 10:28
Titel: Radius eines Kreises bestimmen
Hallo liebe Community,
da ich hier schon oft Hilfe gefunden hab, mir die Suchfunktion allerdings keine geeignete Lösung bieten konnte, eröffne ich mal ein neues Thema zu meinem Problem.
Wie die Überschrift schon besagt geht es nur um die Bestimmung des Radius eines Kreises.
kann ich mir den Mittelpunkt (X,Y-Koordinaten) des inneren Kreises (siehe Anhang) bestimmen.
Nun möchte ich für weitere Berechnungen den Radius ermitteln.
zu arbeiten. Als Plot wird mir ja wie auf dem Bild zu sehen der Kreis richtig angezeigt (grün), allerdings handelt es sich dabei um 1399 Koodinatenpunkte (X- und Y-Werte) die geplottet werden.
mit den Variablen z und z1 hab ich versucht aus den 1399 Koordinatenpaaren einen Vektor aufzustellen und aus diesem einem Abstand zu generieren. Leider ist mir dies nicht gelungen.
Ziel des ganzen ist es den Wert 155 der unter Figure 2 geplottet wird (was dem Radius entsprecht) durch eine Variable zu ersetzten die entweder aus den Wertepaaren der Funktion
Verfasst am: 10.06.2011, 01:22
Titel: Re: Radius eines Kreises bestimmen
Hallo Derak,
Ich verstehe Deine Frage nicht.
Was genau sind die Inputs, die Dir zur Verfügung stehen?
Was genau möchtest Du berechnen?
Woher stammen die Xm und Ym in Deinem Code-Beispiel?
Hast Du den Mittelpunkt und Punkte auf dem Rand eines Kreises und möchtest den mittleren Radius bestimmen?
berechnet. Wobei das schwarz-weiß-Bild dem label_image2 entspricht. Soweit so gut. Diese Funktion liefert mir 1399 Wertepaare (X und Y-Werte).
Da ich mit den X- und Y-werten nicht anfangen kann für spätere Berechnungen, benötige ich den Radius.
Den Mittelpunkt des großen grünen Kreises (auf dem Bild das blaue Kreuz) berechne ich mit der Funktion regionprops und lasse den plotten
Den blauen Kreis hab ich geplottet indem ich die Variable "radius" (siehe Code) berechnet hab.
Eigentlich sollte der blaue Kreis mit dem großen grünen Kreis übereinstimmen. Dies tut er aber nicht und ich weiß nicht warum.
Der Code für die Berechnung der Variable lautet:
Code:
z(:,1) = thisBoundary (:,1)- centroids2(2,1); % x-Werte der Boundariesfunktion minus dem Xm-Wert (Mittelpunkt) großer grüner Kreis
z1(1) = mean(z(:,1)); % mean (z(:,1)) Mittelung aller X-Xm Werte
z(:,2) = thisBoundary (:,2)- centroids2(2,2); % y-Werte der Boundariesfunktion minus dem Ym-Wert (Mittelpunkt) großer grüner Kreis
also wenn ich mich nicht irre müsste meine Berechnung genau deiner Formel entsprechen.
Das gleiche Problem mit der größe des Kreises hab ich mit den kleinen grünen Kreisen. Diese müssten so wie abgebildet durch jeweils 4 Punkte gehen. Ich musste bei dem Plot aber tricksen und den Radius der zwei kleinen Kreise jeweils mit 1,5 multiplizieren damit das passt und ich weiß auch hier nicht warum ich immer zu kleine Kreise bekomme......
Ich hoffe mich dieses mal verständlicher ausgedrückt zu haben und hoffe das mir jemand auf die Sprünge helfen kann.
Die Schilderung Deines Problems ist zu umfangreich, als dass ich ihr folgen könnte. Eigentlich hat das Problem gar nichts mit RegionProps etc zu tun, sondern Du hast einen Satz von Punkten, die auf einem Kreis liegen, und dazu suchst Du den Radius - oder?
[qutoe]
Code:
z(:,1) = thisBoundary (:,1)- centroids2(2,1); % x-Werte der Boundariesfunktion minus dem Xm-Wert (Mittelpunkt) großer grüner Kreis
z1(1) = mean(z(:,1)); % mean (z(:,1)) Mittelung aller X-Xm Werte
z(:,2) = thisBoundary (:,2)- centroids2(2,2); % y-Werte der Boundariesfunktion minus dem Ym-Wert (Mittelpunkt) großer grüner Kreis
erstmal noch vielen Dank für deine Unterstützung. Ich habe in der Zwischenzeit versucht meinen Code anzupassen. Leider ist mir das nicht geglückt.
Ich habe eine Idee wie ich das Problem der Radiusbestimmung lösen kann. Allerdings stehe ich derzeit vor einem eigentlich einfachen Problem.
Mein Code sieht derzeit so aus:
%detektieren des Kreismittelpunkts und der Größe der Fläche
s = regionprops(L, 'centroid','Area');
Area = cat(1, s.Area);
[dummy,ind]= sort(Area,'descend');
centroids = cat(1, s.Centroid);
% L=L(200:900,300:1000);
%Kreisumfang plotten
for k = 1 : numberOfBoundaries
thisBoundary = boundaries{k};
plot(thisBoundary(:,2), thisBoundary(:,1), 'g', 'LineWidth', 2);
hold on
end
%Mittelpunkte plotten
plot(centroids(:,1), centroids(:,2), 'b*') hold off
Mein Problem ist nun, dass wenn man sich das Bild im Anhang anschaut, das die Funktion boundaries nun mehr Linien detektiert als ich möchte.
Mein Ziel ist die Detektion des Kreises in der Mitte.
Boundaries liefert mir nun ein 929x1 cell-array. In diesem sind die Koordinatenpunkte (X- und Y-Werte) der grünen Punkte auf dem Bild gespeichert.
Meine Idee war das Cell-Array in einen einzelnen Vektor zusammen zufassen nach dem Musten
ich bekomme zwar jede cell rausgezogen aber er übrschreibt die mir im Vektor jedesmal. Hab also jedesmal nur die letzte Zelle im Vektor. Gibt es eine Möglichkeit die Zellen untereinander in einen Vektor zu schreiben?
Im Anschluss möchte ich den Vektor mit allen Koordinatenpunkten sortieren. Am besten erst der X-Werte nach. Versucht hab ich das folgender Maßen:
Dabei ordnet er mir aber sowohl die erste als auch die zweite Spalte der Größe nach. Danach passen natürlich die X-Koordinaten aus der ersten Spalte nicht mehr zu den y-Koordinaten aus der zweiten Spalte. Ich möchte halt erstmal nur die erste Spalte sortieren und die zweite Spalte anhand dessen nachsortieren das die Koordinatenpaare wieder passen.
da es sehr aufwendig ist, schaffe ich das irgend wie nicht allein. Vielleicht könntet ihr mir mal wieder unter die Arme greifen. Wäre euch sehr dankbar.
Ich hab nun zwar das Auswahlfester des Bildes verkleinert. Damit beinhaltet mein boundaries cell-array nun nur noch 47 Elemente. Ich kann jetzt aber schlecht alle 47 Elemente nach dem Codeschema aufschreiben, zumal sich die Anzahl mit jedem Bild auch ändern würde.
Wollte eine Schleife programmieren die mir je nach Anzahl diese Elemente in eine gemeinsame Matrix schreibt. Leider bekomme ich das nicht hin. Ich weiß nicht wie ich den Code ändern soll.
% Funktion bwlabel auf Bild anwenden
L = bwlabel(L);
imshow(L)
% Bildausschnitt % L=L(200:900,300:1000);
% detektieren des Kreismittelpunkts, der Größe der Fläche und der Radien
s = regionprops(L, 'centroid','Area','MajorAxisLength','MinorAxisLength');
centroids = cat(1, s.Centroid);
% absteigendes Sortieren von Area Area = cat(1, s.Area);
[dummy,ind]= sort(Area,'descend');
% anwenden der Funktion bwboundaries
boundaries = bwboundaries(L);
numberOfBoundaries = size(boundaries);
imshow(L);
hold on
% Kreisumfang plotten for k = 1 : numberOfBoundaries
thisBoundary = boundaries{k};
plot(thisBoundary(:,2), thisBoundary(:,1), 'g', 'LineWidth', 2);
hold on
end
% Mittelpunkte plotten plot(centroids(ind(1),1), centroids(ind(1),2), 'r*') hold off
% Boundaries in einen Vektor schreiben % boundaries2 = cell2mat(boundaries);
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.