2016-05-06 4 views
0

Ich habe ein Bild, auf dem ich 81 * 81 Fenster schieben muss, um den Intensitätsabstand (Unterschied) zwischen Mittelpixel und jedem der anwesenden Pixel zu finden im umgebenden 81 * 81-Fenster muss ich auch die Ortsdistanz herausfinden, dh den Unterschied zwischen den zentralen Pixelkoordinaten und den Koordinaten der Pixel im umgebenden Fenster. Wenn ich for-Schleifen verwende, muss ich 4 verschachtelte For-Schleifen für diese Operation verwenden, die fast einen ganzen Tag für ein einzelnes Bild benötigt. Ich möchte 81 * 81 Intensitätsdifferenzen für jedes Pixel in einem Bild speichern und ebenfalls für die Entfernungsdistanz, die dazu neigt, eine 4D-Variable zu erzeugen. kann jemand mir einen effizienten Weg vorschlagen, dies zu tun. Hier ist, wie ich diesen Code geschrieben habe:Wie beschleunigt man die gleitende Fensterfunktion in Matlab für ein Bild

I = imread('House.tiff'); 
YCbCr = rgb2ycbcr(I); 
YCbCr = double(YCbCr); 
YCbCr = imresize(YCbCr,[200 200]); 
[m n v] = size(YCbCr); 
Y = YCbCr(:,:,1); Cb = YCbCr(:,:,2); Cr =YCbCr(:,:,3); 
Y1 = padarray(Y,[20,20]); 
Cb1 = padarray(Cb,[20,20]); 
Cr1 = padarray(Cr,[20,20]); 
window_size = 41; 
p = (window_size-1)/2; 
Dl = zeros(m,n,41,41); Df = zeros(m,n,41,41); 
for x = 1:1:m 
    for y = 1:1:n 
     for a = -p:1:p 
      for b = -p:1:p 
Df(x,y,a+p+1,b+p+1)= abs(Y(x,y)-Y1(x+a+p,y+b+p))+ abs(Cb(x,y)- Cb1(x+a+p,y+b+p))+ abs(Cr(x,y)- Cr1(x+a+p,y+b+p));%% intensity distance 
Dl(x,y,a+p+1,b+p+1) = max(abs((x+p)-(x+a+p)),abs((y+p)-(y+b+p)));%% location distance 
      end 
     end 
    end 
end 

Antwort

0

Für diese 81 x 81 Schiebefenster haben Sie wahrscheinlich eine X und Y "anfängliche" Punkt. Angenommen, dass ein neues temporäres Fenster erstellt wird, das das ursprüngliche Bild zwischen diesen Schwerpunkten in einem 80x80-Fenster zuschneidet.

new_image = image(X-40:X+40,Y-40:Y+40); 

dies wird Ihnen die neue temporäre Bild in einer schnellen Art und Weise erstellen.

den Wert der Pixel speichern den ganzen Weg

for i=1:length(images) 
currentImage=image(i,1); 
new_image(i)=currentImage(X-40:X+40,Y-40:Y+40); 
end 
+0

Vielen Dank für Ihren Vorschlag ... Ihr Hinweis ist sehr hilfreich ... können Sie mir eine Möglichkeit vorschlagen, alle 81 * 81 Werte für jedes Pixel zu speichern..dadurch, dass jedes Mal, wenn das Fenster verschoben wird, unterschiedliche Werte angezeigt werden. ..thanks noch einmal ... –

+0

Vielen Dank @ 16per9 das funktioniert wirklich gut ..... –

+0

@GauriDeshpande wenn meine Antwort half Ihnen bitte vergessen Sie nicht, es als richtig zu markieren :) danke und viel Glück – 16per9

0

a) Matrix Ihr Standort Unterschied ist immer das gleiche - es auf Y. hängt nicht nur eine einzelne 81x81 Instanz davon erstellen.

b) Warum müssen Sie alle diese Ausgänge speichern? Die lange Zeit, die ausgegeben werden kann, kann leicht daran liegen, dass die RAM-Nutzung einer so großen Matrix bedeutet, dass Sie auf/von der Festplatte lesen und schreiben (Auslagerungsdatei) anstatt RAM, was die Dinge sehr verlangsamen wird. Es ist wahrscheinlich besser, auf der "nächsten Stufe" dieses Algorithmus zu optimieren und die Berechnungen zu reduzieren, was Sie tatsächlich mit dieser Matrix tun. Abhängig von Ihrer nächsten Stufe könnte die Verwendung von imfilter der richtige Weg sein.

+0

danke Sie für Ihre Vorschläge ... eigentlich muss ich alle Werte verwenden, um die Wahrscheinlichkeit des Auftretens jedes Pixels und der Pixel zu berechnen, die im umgebenden Fenster vorhanden sind ... das heißt, für ein gegebenes Pixel ist die Wahrscheinlichkeit, dass die umgebenden Pixel sind im umgebenden Fenster vorhanden, deshalb muss ich alle Werte beibehalten. –