WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Radius eines Kreises bestimmen

 

Derak
Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.10.08
Wohnort: BZ
Version: R14
     Beitrag Verfasst am: 09.06.2011, 10:28     Titel: Radius eines Kreises bestimmen
  Antworten mit Zitat      
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.

Mit der Funktion
Code:
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.

Ich habe versucht mit der Funktion
Code:
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
Code:
oder einer anderen Funktion berechnet werden kann.

Code:


j= figure (2);
         s  = regionprops(label_image2, 'Centroid');
         centroids2 = cat(1, s.Centroid);
         imshow (image1);
         hold on
         s2 = regionprops(label_image2, 'MajorAxisLength');
         centroids3 = cat(1, s2.MajorAxisLength);
         q = centroids3(1)-1280;
         plot(centroids2(2,1), centroids2(2,2), 'b*','Color','r')
      plot(centroids2(2,1),centroids2(2,2),'o','MarkerSize',155,'MarkerEdgeColor','b');
         hold on
         set(j, 'Resize','off')

boundaries = bwboundaries(label_image2);  
imshow (label_image2);
numberOfBoundaries = size(boundaries);
for k = 1 : numberOfBoundaries
   thisBoundary = boundaries{2};
   plot(thisBoundary(:,2), thisBoundary(:,1), 'g', 'LineWidth', 2);
end
z(:,1) = [abs(thisBoundary (:,1)- Xm)];
z1(1) = mean(z(:,1));
z(:,2) = [abs(thisBoundary (:,2)- Ym)];
z1(2) = mean(z(:,2));


 


vielleicht stelle ich mich auch einfach zu doof an oder verwende die falschen funktionen Rolling Eyes .....

Vielleicht kann mir ja einer helfen.[/code]

Kreis.JPG
 Beschreibung:

Download
 Dateiname:  Kreis.JPG
 Dateigröße:  35.51 KB
 Heruntergeladen:  1003 mal
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 10.06.2011, 01:22     Titel: Re: Radius eines Kreises bestimmen
  Antworten mit Zitat      
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?
Code:
Radius = mean(sqrt((X - Xm)^2 + (Y - Ym)^2));

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Derak
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.10.08
Wohnort: BZ
Version: R14
     Beitrag Verfasst am: 10.06.2011, 14:43     Titel:
  Antworten mit Zitat      
Hallo,

also im Anhang mal das Bild was mir Matlab momentan alles anzeigt.

Also der große grüne Kreis wird mit der Funktion

Code:

boundaries = bwboundaries(label_image2);  
numberOfBoundaries = size(boundaries);
for k = 1 : numberOfBoundaries
   thisBoundary = boundaries{2};
   plot(thisBoundary(:,2), thisBoundary(:,1), 'g', 'LineWidth', 2);
end
 


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

Code:

j= figure (2);

s  = regionprops(label_image2, 'Centroid');
centroids2 = cat(1, s.Centroid);
imshow (label_image2);
hold on

plot(centroids2(2,1), centroids2(2,2), 'b*','Color','r')  % Mittelpunkt großer Kreis

plot(centroids2(2,1),centroids2(2,2),'o','MarkerSize',radius,'MarkerEdgeColor','b'); % blauer Kreis
hold on
set(j, 'Resize','off')
 


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

z1(2) = mean(z(:,2));                                   % mean (z(:,2)) Mittelung

radius=sqrt(z1(1)^2+z1(2)^2);  % entspricht radius des blauen Kreises
 


@Jan S

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......
Shocked

Ich hoffe mich dieses mal verständlicher ausgedrückt zu haben und hoffe das mir jemand auf die Sprünge helfen kann.

Danke euch schon mal

Kreis2.JPG
 Beschreibung:

Download
 Dateiname:  Kreis2.JPG
 Dateigröße:  46.11 KB
 Heruntergeladen:  934 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 10.06.2011, 15:40     Titel:
  Antworten mit Zitat      
Hallo Derak,

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

z1(2) = mean(z(:,2));                                   % mean (z(:,2)) Mittelung

radius=sqrt(z1(1)^2+z1(2)^2);  % entspricht radius des blauen Kreises
 

also wenn ich mich nicht irre müsste meine Berechnung genau deiner Formel entsprechen.[/quote]
So weit ich sehe, irrst Du Dich.
Meine Berechnung war:
Code:
Radius = mean(sqrt((X - Xm)^2 + (Y - Ym)^2))

Deine entspricht aber:
Code:
Radius = sqrt((mean(X - Xm))^2 + (mean(Y - Ym))^2))

Das ist ein Unterschied.
Z.B. würde ich erwarten, dass "mean(X-Xm)" gleich Null ist, denn so ist ja der Mittelpunkt definiert.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Derak
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.10.08
Wohnort: BZ
Version: R14
     Beitrag Verfasst am: 25.08.2011, 14:16     Titel:
  Antworten mit Zitat      
Hallo Jan,

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:

Code:

clc
clear all
close all

im = imread('bild.tif');

figure(2)
%Bild in Grauwertbild umwandeln
im=rgb2gray(im);
imshow (im);

%Bereich mit dem entsprechenden Grauwert auswählen
L = im < 50;

%störende Bereiche elliminieren
L(440:620,540:740)=1;

%Funktion bwlabel auf Bild anwenden
L = bwlabel(L);
imshow(L)

%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);

%anwenden der Funktion bwboundaries
boundaries = bwboundaries(L);  
imshow (L);
hold on
numberOfBoundaries = size(boundaries);

%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

Code:

M=[1 2 3 4 5; 6 7 8 9 10]'
 


Wobei 1-5 für die X-Werte und 6-10 für die dazugehörigen Y-Werte steht.


So habe ich versucht das cell-array auszulesen:

Code:

%Boundaries in einen Vektor schreiben
for n = 1: length(boundaries);
    boundaries2 = boundaries(n);
end


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:

Code:

%Boundaries sortieren
boundaries{1}=sort(boundaries{1})


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.

Derak

boundaries.JPG
 Beschreibung:

Download
 Dateiname:  boundaries.JPG
 Dateigröße:  62.58 KB
 Heruntergeladen:  952 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Derak
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.10.08
Wohnort: BZ
Version: R14
     Beitrag Verfasst am: 25.08.2011, 16:25     Titel:
  Antworten mit Zitat      
Ich habe nun herrausgefunden wie ich die Vektoren aus den Cell-Array in einer Matrix schreiben kann.

Code:


%Boundaries in eine Matrix schreiben
boundaries2 = [boundaries{1} boundaries{2} boundaries{3} boundaries{4} boundaries{5} boundaries{6} ....boundaries{n}];

 


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.

Bin weiterhin für Ratschläge dankbar.
Private Nachricht senden Benutzer-Profile anzeigen
 
Derak
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.10.08
Wohnort: BZ
Version: R14
     Beitrag Verfasst am: 26.08.2011, 11:41     Titel:
  Antworten mit Zitat      
Ok hab es nun hinbekommen.


um eine Cell-Array zu einem einzigen Vektor/Matrix zusammen zufügen, benutzt man einfach:

Code:

boundaries2 = cell2mat(boundaries);
 


Aus meinem Cell-Array (boundaries) mit 47 Elementen wird so ein Vektor mit 2450x2 Werten.
Private Nachricht senden Benutzer-Profile anzeigen
 
Derak
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.10.08
Wohnort: BZ
Version: R14
     Beitrag Verfasst am: 26.08.2011, 11:59     Titel:
  Antworten mit Zitat      
Ok ich habe mein Problem gelöst. Allerdings benutze ich zur Radiusbestimmung nicht mehr die Funktion

Code:


sondern gehe gleich üder die Funktion

Code:


Ich habe diese um 'MajorAxisLength' und 'MinorAxisLength' erweitert. Damit kann ich zwei Radien des Kreises bestimmen.

Zur Vollständigkeit hier nocheinmal mein kompletter Code:


Code:

clc
clear all
close all

im = imread('bild.tif');

figure(2)
% Bild in Grauwertbild umwandeln
im=rgb2gray(im);
imshow (im);
colorbar

% Bereich mit dem entsprechenden Grauwert auswählen
L = im < 50;

% störende Bereiche elliminieren
L(440:620,540:740)=1;

% 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');

% absteigendes Sortieren von MajorAxisLength
majorAxisLength = cat(1, s.MajorAxisLength);
[majorAxisLength, ind2] = sort (majorAxisLength, 'descend');

% absteigendes Sortieren von MinorAxisLength
minorAxisLength = cat(1, s.MinorAxisLength);
[minorAxisLength, ind3] = sort (minorAxisLength, '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);


radius = ((minorAxisLength(1)+majorAxisLength(1))/2)/2
Mittelpunkt = [centroids(ind(1),1) centroids(ind(1),2)]

 


Auch wenn ich Alleinunterhalter war, so hoffe ich das der Code am Ende vielleicht jemanden anders auch hilft Wink

boundaries.JPG
 Beschreibung:

Download
 Dateiname:  boundaries.JPG
 Dateigröße:  62.69 KB
 Heruntergeladen:  966 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.