0

Ich arbeite an einem Algorithmus (in MATLAB), der Hu-Momente von überlappenden Blöcken in einem Bild finden muss. Ich konvertiere das Bild in der Spaltenmatrix (im2col (..., 'gleitend')) und berechne dann Hu-Moments für jede Spalte einzeln. Für die Berechnung der Hu-Momente für die Blöcke eines Bildes von 512X512 dauert mein System 14-15 Minuten. Code ist wie unten angegeben:Leistungsprobleme beim Auffinden von Hu-Momenten überlappender Blöcke in Bild

d=im2col(A,[m n],'sliding'); 

[mm nn]=size(d); 
for j=1:nn 
    d_temp=d(:,j); 
    d_pass_temp=col2im(d_temp,[n n], [n n], 'distinct'); 
    [mn_t vr_t]=new_hu_moment(d_pass_temp); 
    [mn]=[mn mn_t]; 
    [vr]=[vr vr_t]; 
end 

‚new_hu_moment‘ ist meine eigene gemacht Funktion Mittelwert und die Varianz von hu Momente für den jeweiligen Block zurück.

Meine Systemkonfiguration ist I3-Prozessor mit 6 GB RAM.

  1. schlagen Sie bitte für die Leistungssteigerung dieses Codes vor.
  2. Gibt es irgendeine Funktion in Matlab, die 7 Hu-Momente für überlappende Blöcke berechnen kann.

Antwort

0

1.preallocate mn und vr vor der Schleife, so etwas wie

% I suppose that new_hu_moment returns row of known length nvals 
mn=zeros(nn,nvals); 
vr=zeros(nn,nvals); 
for k=1:nn, 
    ... 
    [mn(k,:) vr(k,:)]=new_hu_moment(d_pass_temp); 
    ... 
end 

ich nicht stark empfehlen i und j als Variablennamen verwenden, wie sie Synonyme für imaginäre Einheit sind. In älteren MATLAB kann es zu Fehlern

2. Wenn Sie genügend Speicher und für Loop-Prozesse unabhängige Datenblöcke, verwenden parfor oder cellfun/arrayfun

3.Falls Code ist nicht so schnell Sie wollen, es muss sein Verwenden Sie profiler, um den Leistungsengpass

zu finden
Verwandte Themen