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

Quellcode Optimierung Region Growing, Performance problem!

 

Hilbert86
Forum-Century

Forum-Century


Beiträge: 113
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.08.2011, 08:44     Titel: Quellcode Optimierung Region Growing, Performance problem!
  Antworten mit Zitat      
Hallo Leute

ich beschäftige mich jetzt seit einigen Wochen mit dem Thema Region Growing und habe einige Implementationen darüber gefunden. Hatte auch hier ein Thema dazu doch das bin ich falsch bzw zu kompliziert angeganen. Nun habe ich es anders implementiert so wie ich es wollte aber habe ein starkes Performance Problem. Bei kleinen Bilder 70X40 dauert die Berechnung etwa 8 Minuten aber bei Größeren Bilder keine Chance.
Ich habe es so Programmiert Pseudo Code:
Bild wird eingelesen-> GrauwertBild -> Kantendetektion mit Laplace.
1.Kantenpunkte als SeedPoints für den Start.
2.Seedpoints mit 8 Nachbarschaft-Operrator prüfen wenn Nachbarn größer als Threshold setzte Nachbarn 1.
3.Wiederhole das für alle Punkte des Kantenbild->
4.Neues Binärbild das aus dem Kantenbild entstand
5.Wiederhole schritt 2-3
6.Abbruchbedingung wenn die Anzahl der der SeedPoints nach 2 Durchläufen gleich bleibt ende Growing

Hier der Code der Schleife in der Berechnet wird ich hoffe ihr seht verbesserungsmöglichkeiten
Code:
while 1

%Seedpoints aus Binärbild/Kantenbild
[Y_seed X_seed]=find(pS);
%NR of Seedpoints
SeedPointsNr=size(Y_seed,1);

%Wenn anzahl der Seedpoints gleich wie im vorigen Durchlauf
%Stop Growing
if (isequal(SeedPointsNr,oldSeedPointNR)==1)
    break;
%Weitermachen
else
    oldSeedPointNR=oldSeedPointNR+1;
%Grow all Seedpoints by 8 Neighbours
for k=1:SeedPointsNr

           
i=Y_seed(k);
j=X_seed(k);
% Threshold wert für regiongrowing
threshold=pF(i,j);
threshold=threshold-((threshold/100)*thres_percentage);
%Neighbouroperator
iN = [i-1;i-1;i-1;i;i;i+1;i+1;i+1];
jN = [j-1;j;j+1;j-1;j+1;j-1;j;j+1];

idx = sub2ind(size(pS), iN, jN);
%Werte der 8 Nachbarn
Werte=pF(idx);
%Wenn alle Nachbarn mindestens eine 0 haben mache Regiongrow
if (ismember(0,pS(idx))==1)
%Index der Pixel die Threshold erfüllen
idx2=find(pF(idx)>=threshold);
neuerThreshold=mean(Werte(idx2));

pS(idx(idx2))=1;
pF(idx(idx2))=neuerThreshold;

%Wenn alle Nachbarn = 1 mache nix gehe zum nächsten Punkt
else
   
end
end

end

end


Danke für jeden Tipp
_________________

MMAAAAAATTTTTLLAAAAABBBB
Private Nachricht senden Benutzer-Profile anzeigen


eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 27.08.2011, 08:58     Titel:
  Antworten mit Zitat      
Hallo Hilbert86,

schau mal im MATLAB FileCentral, ich habe dort vor etwa 2 Wochen einen Region Growing Algorithmus gepostet, der einfach gehalten und sehr gut kommentiert ist:

http://www.mathworks.com/matlabcent.....on-growing-2d3d-grayscale
Private Nachricht senden Benutzer-Profile anzeigen
 
Hilbert86
Themenstarter

Forum-Century

Forum-Century


Beiträge: 113
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.08.2011, 10:49     Titel:
  Antworten mit Zitat      
Ok danke ich kenn diesen Code, aber ich wollte eigentlich meinen Code etwas verbessern und wollte fragen ob ihr irgendwelche groben Programmiertschnischen Fehler entdeckt habt die die Performance meines Codes beeinträchtigen?
_________________

MMAAAAAATTTTTLLAAAAABBBB
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 27.08.2011, 14:18     Titel:
  Antworten mit Zitat      
Schau dir doch die Funktion mal mit Hilfe des Profilers durch, dann siehst du genau, an welchen Stellen viel Rechenzeit verloren geht!
Private Nachricht senden Benutzer-Profile anzeigen
 
Hilbert86
Themenstarter

Forum-Century

Forum-Century


Beiträge: 113
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.08.2011, 15:01     Titel:
  Antworten mit Zitat      
Ah das kannte ich bis jetzt nicht cool danke eupho Smile.
Jetzt hab ich den Bösewicht er heisst ismember diese Funktion frisst am meisten Zeit gibt es vlt eine alternative für ismember?

Code:
iN = [i-1;i-1;i-1;i;i;i+1;i+1;i+1];
jN = [j-1;j;j+1;j-1;j+1;j-1;j;j+1];

idx = sub2ind(size(pS), iN, jN);
%Werte der 8 Nachbarn
Werte=pF(idx);


if (ismember(0,pS(idx))==1)


Es soll überprüft werden ob einer der 8 Nachbar pixel = 0 ist!

Kann man das anders/schneller lösen als mit ismember?
_________________

MMAAAAAATTTTTLLAAAAABBBB
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabNooB
Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.08.2011, 16:19     Titel:
  Antworten mit Zitat      
vielleicht hilft es direkt das mex-file zu benutzen?

http://undocumentedmatlab.com/blog/.....cumented-helper-function/
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: 27.08.2011, 16:30     Titel:
  Antworten mit Zitat      
Hallo Hilbert86,

Code:
% if (ismember(0,pS(idx))==1)
% Schneller:
if all(ps(idx)) == 0

Zudem kannst Du noch, wie wohl auch von MLint empfohlen (?!), das FIND by idx2 weglassen:
Code:
% idx2=find(pF(idx)>=threshold);  =>  logical indexing
idx2 = pF(idx)>=threshold;

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

Forum-Century

Forum-Century


Beiträge: 113
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.08.2011, 17:37     Titel:
  Antworten mit Zitat      
Danke Jan habe auch das sub2ind ersetzt mit

Code:
idx = iN + (jN-1)*size(pS,1);


jetzt wäre das mean dran-> auch erledigt 1/n * (WertederTabelle)
_________________

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