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

Vektorisierung von for-Schleifen bei der Bildbearbeitung

 

Chaos391
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2017, 11:59     Titel: Vektorisierung von for-Schleifen bei der Bildbearbeitung
  Antworten mit Zitat      
Hallo ihr Lieben!
Ich bin ein Neuling in Sachen Programmierung+ Matlab und würde mich deshalb sehr über Hilfe von Euch freuen.
Mein momentanes Projekt dreht sich um Bilverarbeitungen und ich bin gerade dabei ein bestehendes Programm zu verbessern/verschnellern. Ich habe gelesen, dass for-Schleifen von Matlab meist sehr langsam bearbeitet werden, weshalb ich gern den folgenden Code vektorisieren würde. Leider weiß ich noch nicht genau wie das funktioniert.
Der Code lautet:
Code:

for i=1:frames_y
  if i<=frames_x
     
    sum_col_x=sum(roi_rotate_volume_x(:,:,i));
    norm_sum_x=sum_col_x/quantile(sum_col_x,0.70);
    matrix_sum_x=repmat(norm_sum_x,1000,1);
    matrix_sum_x=matrix_sum_x./max(max(matrix_sum_x));
    summe_x(:,:,i)=double(roi_rotate_volume_x(:,:,i))./(matrix_sum_x);
    ...
 end
...
end
 


Könnte mir jemand erklären, wie ich dabei am besten vorgehe?

Liebe Grüße
Chaos391
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: 25.02.2017, 19:41     Titel: Re: Vektorisierung von for-Schleifen bei der Bildbearbeitung
  Antworten mit Zitat      
Hallo Chaos391,

Zitat:
Ich habe gelesen, dass for-Schleifen von Matlab meist sehr langsam bearbeitet werden, ...

Das ist ein Gerücht, dass sich wohl noch lange halten wird. Seit Matlab 6.5 beschleunigt Matlabs JIT Schleifen deutlich. Es hängt seit dem vom einzelfall ab, ob der Overhead für die Schleife oder der zum Erzeugen temporärer Arrays überwiegt.


Code:
   matrix_sum_x=repmat(norm_sum_x,1000,1);
    matrix_sum_x=matrix_sum_x./max(max(matrix_sum_x));
    summe_x(:,:,i)=double(roi_rotate_volume_x(:,:,i))./(matrix_sum_x);

Dies lässt sich deutlich beschleunigen: Hier wird ein Vector zunächst zu einer Matrix aufgeblasen, und danach der maximale Wert gesucht. Es ist billiger, gleich im Vektor zu suchen und die Division per BSXFUN durchzuführen:
Code:
   matrix_sum_x = norm_sum_x;
    matrix_sum_x = matrix_sum_x ./ max(matrix_sum_x);
    summe_x(:,:,i) = double(bsxfun(@ldivide, roi_rotate_volume_x(:,:,i)), matrix_sum_x);

Ist summe_x pre-alloziert vor der Schleife? Das iterative Vergrößern eines Arrays vergeudet jede Menge Resourcen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2017, 10:07     Titel:
  Antworten mit Zitat      
Vielen Dank für die Antwort. Ich habe Deinen Vorschlag, Jan S, heute ausprobiert. Leider hat dieser nichts verbessert. Mein Code dauert 1,34 Sekunden, während dein Code 1,37 Sekunden braucht. Summe_x wurde vor der Schleife in ihrer Größe vordefiniert. Also daran kann es nicht liegen. Hat jemand vielleicht noch eine andere Idee?
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.02.2017, 14:29     Titel:
  Antworten mit Zitat      
Hallo Chaos391,

Optimierungen lassen sich kaum im Blindflug leisten. Kannst Du ein lauffähiges Programm zusammen mit typischen Inputs posten?
Was sagt der Profiler zum Bottleneck des Codes?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2017, 09:32     Titel:
  Antworten mit Zitat      
Guten Morgen,
die Schleife, die ich optimieren möchte, ist ein Teil eines größeren Programms. Ich weiß nicht genau, wie ich das posten soll, damit ihr damit etwas anfangen könnt. Ich poste einfach mal die Funktion, in der die Schleife zu finden ist. Vielleicht reicht das ja schon?

Code:

function [ vorderkante_x, hinterkante_x, columns_x,frames_x] = edgedetection_donorcorneaVOCT(roi_rotate_volume_x, opening_threshold, maxarea, center_threshold )
%
[rows_x, columns_x, frames_x] = size(roi_rotate_volume_x);
structure_elem1 = strel('disk',10);                          
SE_tophat = strel('disk',45);                                
vorderkante_x = zeros(frames_x, columns_x+44, 'double');    
hinterkante_x=vorderkante_x;
summe_x = roi_rotate_volume_x;

for i=20:220
    sum_col_x=sum(roi_rotate_volume_x(:,:,i));
    norm_sum_x=sum_col_x/quantile(sum_col_x,0.70);
    matrix_sum_x=repmat(norm_sum_x,1000,1);
    matrix_sum_x=matrix_sum_x./max(max(matrix_sum_x));
    summe_x(:,:,i)=double(roi_rotate_volume_x(:,:,i))./(matrix_sum_x);

    % background noise elimination
    filt_x = medfilt2(summe_x(:,:,i), [10 10]);
   
    % contrast range adjustment: 0-65535 --> 0-1
    filt_adjusted_x = imadjust(filt_x,[min(min(double(filt_x)))/65535; max(max(double(filt_x)))/65535],[0; 1]);
   
    % opening: dilation(erosion)  
    erode_x = imerode(filt_adjusted_x,structure_elem1);
    opening_x = imdilate(erode_x,structure_elem1);
   
    % remove steady component (opening_threshold) in the opening picture
    mean_opening_x = mean(mean(opening_x(:,:)));
    opening_x(opening_x(:,:) < mean_opening_x*opening_threshold) = 0;
           
    % remove small particle noise (< maxarea) in the opening picture
    open_x = uint16(bwareaopen(opening_x, maxarea)).*opening_x;
   
    % remove central reflection brightness
    mean_open_x = mean(open_x(:,(ceil(columns_x/2)-200):(ceil(columns_x/2)+200)));
    rep_open_x= repmat(mean_open_x,rows_x,1);
    indx_x = open_x(:,(ceil(columns_x/2)-200):(ceil(columns_x/2)+200)) > rep_open_x.*center_threshold;
    indx_x=uint16(indx_x);
    open_new_x = open_x;
    open_new_x(:,(ceil(columns_x/2)-200):(ceil(columns_x/2)+200)) = open_x(:,(ceil(columns_x/2)-200):(ceil(columns_x/2)+200)).*indx_x;
   
    % noise elimination & edge preservation  
    open_filt_x = medfilt2(open_new_x,[10 10]);
    open_filt_adjusted_x = imadjust(open_filt_x);
         
    % fill up depleted corneal areas
    fill_x = imfill(open_filt_adjusted_x,'holes');
         
    % Tophat-transformation: closing of shadowed areas
    % padding
    padded_x = padarray(fill_x,[22 22]);

    % Tophat-transformation of complement image: opening of the shadowings
    tophat_x = imtophat(imcomplement(padded_x),SE_tophat);
   
    % subtract opened shadowings from the original image
    tophat2_x = padded_x+tophat_x;
         
    % Canny edge detection
    canny_x = edge(tophat2_x, 'Canny', [0 0.25]);
   
    % assembling of the edges as surface data
    [vorderkante_x(i,:), hinterkante_x(i,:)] = kanteVOCT(canny_x);
end

end
 


Das entsprechende Workspace habe als Datei angehängt. Funktioniert es so?
Liebe Grüße
Chaos391
Private Nachricht senden Benutzer-Profile anzeigen
 
Chaos391
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2017, 09:35     Titel:
  Antworten mit Zitat      
Das mit der Datei anhängen hat leider nicht funktioniert. Deshalb hier die wichtigsten Werte:
roi_rotate_volume_x=1000x1200x256 uint16
opening_threshold=1.1
maxarea=100
center_threshold=1.1

Bei den Thresholds bin ich mir noch nicht ganz sicher, ob diese so bleiben.
Liebe Grüße
Chaos391
Private Nachricht senden Benutzer-Profile anzeigen
 
Chaos391
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2017, 11:10     Titel:
  Antworten mit Zitat      
Niemand eine Idee? Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
Chaos391
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2017, 15:38     Titel:
  Antworten mit Zitat      
Laut dem Profiler ist wohl der Median Filter der Bösewicht Twisted Evil Aber den muss ich ja nutzen?
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 - 2024 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.