2017-03-06 2 views
1

Gegeben 2D Bilddaten, wie kann ich für jedes Pixel P1 das folgende 3D-Array daraus bekommen?Wie kann ich Wert von 8 Nachbarn eines Bildes als die dritte Dimension in Numpy bekommen

P9 P2 P3 
P8 P1 P4 
P7 P6 P5 

img [x, y ,:] = [P2, P3, P4, P5, P6, P7, P8, P9, P2]

ohne forloop Verwendung nur numpy Betrieb (wegen der Leistungs Ausgabe)

+1

Wie möchten Sie mit den Grenzelementen umgehen? – Divakar

+0

Ich möchte ein 3D-Array, und Grenze kann entweder auf 0 oder verkleinern – Alvar

Antwort

1

Hier ist ein Ansatz mit zeros Polsterung für Randelemente und mit NumPy strides mit dem eingebauten in scikit-image's view_as_windows für eine effiziente Schiebefenster Extraktion -

from skimage.util import view_as_windows as viewW 

def patches(a, patch_shape):  
    side_size = patch_shape 
    ext_size = (side_size[0]-1)//2, (side_size[1]-1)//2 
    img = np.pad(a, ([ext_size[0]],[ext_size[1]]), 'constant', constant_values=(0)) 
    return viewW(img, patch_shape) 

Probendurchlauf -

In [98]: a = np.random.randint(0,255,(5,6)) 

In [99]: a 
Out[99]: 
array([[139, 176, 141, 172, 192, 81], 
     [163, 115, 7, 234, 72, 156], 
     [ 75, 60, 9, 81, 132, 12], 
     [106, 202, 158, 199, 128, 238], 
     [161, 33, 211, 233, 151, 52]]) 

In [100]: out = patches(a, [3,3]) # window size = [3,3] 

In [101]: out.shape 
Out[101]: (5, 6, 3, 3) 

In [102]: out[0,0] 
Out[102]: 
array([[ 0, 0, 0], 
     [ 0, 139, 176], 
     [ 0, 163, 115]]) 

In [103]: out[0,1] 
Out[103]: 
array([[ 0, 0, 0], 
     [139, 176, 141], 
     [163, 115, 7]]) 

In [104]: out[-1,-1] 
Out[104]: 
array([[128, 238, 0], 
     [151, 52, 0], 
     [ 0, 0, 0]]) 

Wenn Sie eine 3D Array wollen, können Sie eine reshape am Ende hinzufügen könnte, wie so -

out.reshape(a.shape + (9,)) 

aber bewusst sein, dass dies eine Kopie statt der schaffen würde Effiziente, schrittweite Ansichten würden wir von der Funktion selbst erhalten.

+0

Vielen Dank, Sie möchten wahrscheinlich "//" anstelle von "/" in der zweiten Zeile der Funktion eingeben – Alvar

+0

@Alvar Ah ja! Guter Fang. Bearbeitet, danke. – Divakar

Verwandte Themen