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

Geschwindigkeitshorror bei lokalen Imageoperationen

 

Ishildur
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 11.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2010, 19:42     Titel: Geschwindigkeitshorror bei lokalen Imageoperationen
  Antworten mit Zitat      
Hallo zusammen
Ich habe ein massives Geschwindigkeitsproblem bei der Implementierung von lokalen Imageoperationen (Kernelbasierte Operationen) weil ich diese nicht vektorisieren kann (oder es mir zumindest gerade nicht vorstellen kann, wie).

Frage Nr 1: Gibt es vielleicht doch eine Möglichkeit, lokale Imageoperationen wie bspw. einen gaussischen Filter zu vektorisieren? Das Hauptproblem besteht IMHO bei der Behandlung von Randpixeln (Der Kernel darf ja nicht über die Bildränder hinaus wirken sonst Aua...)
P.S. Ich weiss, dass es bereits vorgefertigte Funktionen dafür gibt, aber ich will ja den Umgang mit Matlab erlernen Wink

Frage Nr 2: Gibt es vielleicht andere Dinge, auf die ich Acht geben muss, damit ich die Geschwindigkeit erhöhen kann?

Ich habe mir zur Übung einen Bloom Filter in Matlab implementiert, aber er benötigt zwischen 5 - 6 Minuten um ein Bild (1600x1200x24) zu verarbeiten. Diese Zeit wird beinahe ausschliesslich vom Gaussian Blur verbraten, welchen ich als einzigen nicht zu vektorisieren vermochte. Ich sende hier mal den relevanten Ausschnitt aus dem Code:

Code:

% allocate memory used as image buffers
 imExt = zeros(1,s,'single'); % extracted image data (thresholding filter)
 imHgb = zeros(1,s,'single'); % horizontal gaussian blurred image data
 imVgb = zeros(1,s,'single'); % vertical gaussian blurred image data
 
 % read the entire raw image block into the original image buffer
 % and close the source image as we have now all information in memory
 imOri = fread(fSrc,s,'uint8=>single')./255.0;
 fclose(fSrc);
 
 % threshold the entire original image (vectorized code)
 imExt = max(0.0,imOri-thr)/(1.0-thr);
 
 % compute and normalize the entire kernel used for the gaussian blur
 % (only a 1D kernel is needed since we'll linearly separate the blurring process)
 arKrn = exp(-((floor(-szKrn/2):floor(szKrn/2)).^2.0)/(2.0*dev^2.0))/sqrt(2.0*pi*dev^2.0);
 arKrn = arKrn./sum(arKrn);
 
 % start a loop for walking each row
 for i=0:h-1
  % compute the index of the begin of the current row
  row = i*(3*w+a);
 
  % start a loop for walking each pixel of the current row
  for k=0:w-1
   % compute the index of the current pixel
   idx = row+3*k;
   
   % start a loop for walking each kernel slot for the current pixel
   for l=0:szKrn-1
    % compute the index of the current slot
    slt = idx+(3*(l-floor(szKrn/2)));
   
    % perform the local gaussian blur filter operation with respect of not exceeding
    % the borders of the image (in this case the most outer pixels will be used repeatetly
    if slt >= row && slt < row+3*w; imHgb(idx+1:idx+4) = imOri(slt+1:slt+4).*arKrn(l+1);
    else imHgb(idx+1:idx+4) = imOri(idx+1:idx+4).*arKrn(l+1); end
   end
  end
 end
 


Hat jemand eine Idee, wie man dies massiv beschleunigen könnte? Ich habe noch schnell ein C - Programm geschrieben, welches genau dasselbe macht, und dieses benötigt wenige Millisekunden für das gleiche Resultat...

P.S.
Bitte seid gnädig mit mir, ich habe erst heute morgen angefangen, mich mit Matlab zu beschäftigen und habe vermutlich dumme Fehler drinn...

Mfg Samuel
_________________

Samuel Lörtscher
Bern University of Applied Sciences (BFT-TI), Biel/Bienne
Private Nachricht senden Benutzer-Profile anzeigen


Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 12.01.2010, 10:14     Titel:
  Antworten mit Zitat      
Hallo,
erst mal sehe ich keine "echten" Fehler im Sinne "wie kann man nur" Wink. Was die Beurteilung des Programms selber angeht, ist es etwas schwierig, da man es selber nicht laufen lassen kann. Was mir wohl auffällt, ist, dass Du glaube ich erst das C-Programm und dann das MATLAB Programm geschrieben hast? Du arbeitest mit einem langen Vektor statt einem NxMx3 Bild? Das macht den Code erst mal aufwändiger (und tendenziell glaube ich auch langsamer) ...
Ich an Deiner Stelle (offensichtlich viel Erfahrung im Programmieren und (nach eigener Aussage) noch wenig mit MATLAB): probier das Programm umzustellen auf die 3D-Datenstruktur. Auch wenn es vielleicht nicht schneller wird (das wäre dann zu klären), wird es sicherlich leichter lesbar und verständlicher.
Zweiter Vorschlag: mache das Bild größer (um die Größe des Kerns) und lass dafür die if-Bedingung weg.

Ciao,
Titus

Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
Ishildur
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 11.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2010, 14:14     Titel:
  Antworten mit Zitat      
Hallo Titus
Vielen Dank, dass du dir die Mühe gemacht hast, dir mein Problem anzusehen! Smile

Für die 1D Matrix habe ich mich entschieden, weil eben das Bitmap Format ein 32-Bit Memory Alignment hat. Das bedeutet, dass am Ende jeder Bildzeile noch bis auf den nächsten vollen 32-Bit Integer mit nullen aufgefüllt wird. Ich müsste dann also zuerst noch vom Datenbuffer die effektiven Bilddaten rausrupfen und nochmal in eine neue Matrix kopieren, was wiederum bei einem 1600x1200x24 5MB mehr Arbeitsspeicher brauchen würde. Ist natürlich nicht viel, aber ich wollte eben die gleichen Bedingungen wie en äquivalentes C Programm schaffen für die Speicher/Performance/Entwicklungsfomfort Tests.

Das ist auch gleich der Grund, wieso es nicht so einfach sein dürfte, das Bild einfach um die Kernelgrösse grösser zu machen, auf jeden Fall nicht, ohne dass der Matlab Code schliesslich noch deutlich grösser und aufwändiger wird als der vergleichbare C Code...

Was ich mir allerdings überlegt habe ist, ob es vielleich eine "Clamp" Funktion in Matlab gibt. Habe zwar unter diesem Namen nichts gefunden, aber vielleicht heisst sie ja auch nur anders.

Die Funktion sollte 3 Argumente nehmen:
Code:
ret = Clamp(min,max,val)
 if val < min,  ret = min;
  else if val > max, ret = max;
  else ret = val;
 end


Gibt es sowas nativ implementiert in matlab? Weil bringt ja vermutlich nichts, wenn ich diese Funktion in ein *.m File schreibe, wo sie dann während der Ausführung x Millionenmal geparst wird (Also Performancetechnisch meine ich)

Wenn es die geben würde, würde die if Bedingung ja wegfallen und dann könnte ich es nochmal mit der Vektorisierung versuchen, obwohl ich ehrlich gesagt immer noch nicht genau weis, ob man das überhaupt vektorisieren kann...

Gruss Samuel
_________________

Samuel Lörtscher
Bern University of Applied Sciences (BFT-TI), Biel/Bienne
Private Nachricht senden Benutzer-Profile anzeigen
 
Tim
Forum-Century

Forum-Century



Beiträge: 140
Anmeldedatum: 03.11.07
Wohnort: Stuttgart
Version: 2011b+aktuellstes Release
     Beitrag Verfasst am: 12.01.2010, 14:28     Titel:
  Antworten mit Zitat      
Dich kenn ich doch Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Ishildur
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 11.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2010, 15:21     Titel:
  Antworten mit Zitat      
Hehe, abgemacht!! Surprised Verrätst du mir auch, woher?
_________________

Samuel Lörtscher
Bern University of Applied Sciences (BFT-TI), Biel/Bienne
Private Nachricht senden Benutzer-Profile anzeigen
 
Tim
Forum-Century

Forum-Century



Beiträge: 140
Anmeldedatum: 03.11.07
Wohnort: Stuttgart
Version: 2011b+aktuellstes Release
     Beitrag Verfasst am: 12.01.2010, 15:23     Titel:
  Antworten mit Zitat      
c-plusplus.de Wink
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.