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

Kreise im Bild finden, Forschleifen vermeiden

 

skyforce
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 82
Anmeldedatum: 04.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2012, 16:18     Titel: Kreise im Bild finden, Forschleifen vermeiden
  Antworten mit Zitat      
hallo zusammen,

ich möchte in einem Bild Kreis-Paare finden, die Folgende Eigenschaften haben:

- nur Runde Kreise
- Nur Kreise-Paare finden, bei den das Verhältnis= Radius / Abstand der beiden Kreise nahe bei 0.5 ist.

Hab soweit auch schon hinbekommen, möchte aber gern die Geschwindigkeit erhöhen:

Code:
ver=0.5                                                           % Ideal-Verhältnis

anfang=imread('kreise.png');

bild=rgb2gray(anfang);                                              % Grau-stufe
bild=imadjust(bild);                                                    % Kontrast erhöhen
bild=im2bw(bild,0.5);                                                 % Binarisieren
bild=bwareaopen(bild,30);                                         % Entferne objekte mit weniger als 30 pixel  
bild=imclearborder(bild,8);                                         % Alle zusammenhängende Punkte am Rand werden entfernt

% Fläche, Zentrum, Durchmesser, Umfang der Objekte auslesen:

daten=regionprops(bild,'Area','Centroid',...                
             'EquivDiameter','Perimeter');
                         
% Nur Kreise nehmen, die rund genug sind.

rund_obj=daten(4*pi.*[daten.Area]./[daten.Perimeter].^2 >=0.9);

subplot(1,2,1);
imshow(anfang)

subplot(1,2,2);
imshow(bild);
hold on;

for i=1:length(rund_obj)-1
    for j=i+1:length(rund_obj)

        m1=rund_obj(i).Centroid;    

        radius1=rund_obj(i).EquivDiameter/2;

        m2=rund_obj(j).Centroid;    
 
        radius2=rund_obj(j).EquivDiameter/2;

        alpha=atand((m1(2)-m2(2))/(m2(1)-m1(1)));                 % Winkel um den Abstand auszurechnen

        abstand=abs((m2(2)-m1(2))/sind(alpha));

        ver1=radius1/diff;                                                          % Verhältnis des 1.Kreises zu Abstand

        ver2=radius2/diff;                                                          % Verhältnis des 2.Kreises zu Abstand

        if(abs(ver1-ver)<=0.03 && abs(ver2-ver)<=0.03)
            % Kreise werden markiert
            rectangle('Position',[m1(1)-radius1,m1(2)-radius1,2*radius1,2*radius1],'EdgeColor','y','LineWidth',1.5);          
            rectangle('Position' [m2(1)-radius2,m2(2)-radius2,2*radius2,2*radius2],'EdgeColor','y','LineWidth',1.5);          

        end
    end
end

hold off;


Ich hab das über 2 For-Schleifen gelöst, wenn in einem Bild 10 Objekte sind, dann sind das 45 Vergleiche die ich machen muss! Für den gesammte Berechnung braucht Matlab ca. 2.936s

Wie könnte man die beiden for-schleifen vermeiden?

Warum braucht Matlab für folgende Zeilen so lang, es sind doch nur einfache Rechnungen:

Code:

        m1=rund_obj(i).Centroid;    

        radius1=rund_obj(i).EquivDiameter/2;

        m2=rund_obj(j).Centroid;    
 
        radius2=rund_obj(j).EquivDiameter/2;

        alpha=atand((m1(2)-m2(2))/(m2(1)-m1(1)));                 % Winkel um den Abstand auszurechnen

        abstand=abs((m2(2)-m1(2))/sind(alpha));

        ver1=radius1/diff;                                                          % Verhältnis des 1.Kreises zu Abstand

        ver2=radius2/diff;                                                          % Verhältnis des 2.Kreises zu Abstand


die ersten 4 Zeilen sind nur Umspeicherungen damit das Programm übersichtlicher wird, für die ersten 4 Zeilen braucht matlab ca 0.004 s und für den gesammten 2. Programmcode 0.010134 s

mfg
skyforce
Private Nachricht senden Benutzer-Profile anzeigen


dmjr
Forum-Century

Forum-Century


Beiträge: 199
Anmeldedatum: 02.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2012, 16:47     Titel:
  Antworten mit Zitat      
Den Abstand kannst du auch mittels Pythagoras ausrechnen, das geht bestimmt schneller.
Private Nachricht senden Benutzer-Profile anzeigen
 
skyforce
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 82
Anmeldedatum: 04.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2012, 16:56     Titel:
  Antworten mit Zitat      
vielen Dank für dein Tipp

ich brauch den Winkel Alpha für weitere Rechnungen, die hier nicht explizit stehen. Aber ich kann die Zeile mit dem Abstand mal mit Pythagoras ausprobieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
skyforce
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 82
Anmeldedatum: 04.09.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2012, 17:00     Titel:
  Antworten mit Zitat      
für die Abstand-Zeile mit Winkel: 0.00028s
mit Pythagoras: 0.000004s

Krass, zwar für den gesamten Code nicht viel Änderung aber trotzdem intersant zu sehen
Private Nachricht senden Benutzer-Profile anzeigen
 
dmjr
Forum-Century

Forum-Century


Beiträge: 199
Anmeldedatum: 02.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2012, 01:57     Titel:
  Antworten mit Zitat      
Mir ist gerade noch ein weiterer Gedanke zu dem Problem gekommen
Du hast schranken für R1/Abstand und R2/Abstand. Daraus müsste sich doch auch eine notwendige Schranke für R1/R2 herleiten lassen, die auf relativ einfacher Mathematik basiert und einige Kreise vorab ausschließen kann:
0,47<r1/distance<0,53
0,47<r2/distance<0,53
=>
0,47/0,53<r1/r2<0,53/0,47

Damit kannst du je nach Eingabe einen Großteil der Kreise ausschließen.
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.