2014-11-15 7 views
5

Sto cercando di implementare un algoritmo di elaborazione delle immagini che prevede il calcolo del prodotto di 4 quarti adiacenti per ogni cella. Cioè, per calcolare una nuova matrice Y per X dove y[i, j] = x[i-1, j] * x[i, j-1] * x[i+1, j] * x[i, j+1]. I vicini fuori dal comune dovrebbero essere ignorati.Calcola il prodotto del quartiere per ogni cella in una matrice con numpy/scipy

Ora posso solo pensare di questo approccio: usare scipy.ndimage.filters.correlate e passare pesi con zeri e uno 1 per ottenere quattro matrici, ciascuna contenente il vicino per ogni cella in una direzione, come passando weight = [[0, 0, 0], [1, 0, 0], [1, 1]] e ottengo a[i, j] = x[i-1, j], e con altri pesi posso ottenere b[i, j] = x[i, j-1], c[i, j] = x[i+1, j], d[i, j] = x[i, j+1]. Quindi uso np.multiply per calcolare il prodotto di queste quattro matrici.

Tuttavia, questo approccio è un po 'troppo lento e non posso ignorare i limiti. C'è un altro modo per farlo con numpy/scipy quindi non devo ricorrere a loop per?

+1

Se si sono presi i registri prima, quindi sarebbe un'aggiunta. – Paul

+0

L'operatore di Laplace discreto 2x2 sarebbe molto vicino una volta aggiunto. Ho solo bisogno di cancellare il termine centrale. http://en.wikipedia.org/wiki/Discrete_Laplace_operator http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.filters.laplace.html – Paul

+0

@Paul Grazie per l'aiuto, ma potrebbe essere numeri negativi nella matrice, quindi non posso prendere i log prima. – Joyee

risposta

3

Avrete bisogno di scrivere i bordi separatamente, ma questo non fa che cosa siete dopo per la parte centrale del vostro array, ed è probabilmente notevolmente più veloce di correlazione:

y = np.empty_like(x) 
y[1:-1, 1:-1] = x[1:-1, 1:-1] 
y[1:-1, 1:-1] *= x[:-2, 1:-1] 
y[1:-1, 1:-1] *= x[2:, 1:-1] 
y[1:-1, 1:-1] *= x[1:-1, :-2] 
y[1:-1, 1:-1] *= x[1:-1, 2:] 
+0

Non dovrebbe essere 'y = numpy.ones_like' e la seconda linea rimossa? – Veedrac

3

Credo che questo le partite meglio cosa stai chiedendo:

import numpy as np 

x = np.array([ 
    [1, 2, 3, 4, 5], 
    [6, 7, 8, 9, 1], 
    [2, 3, 4, 5, 6], 
    [7, 8, 9, 1, 2] 
]) 

y = np.ones_like(x) 
y[+1:, :] *= x[:-1, :] 
y[:-1, :] *= x[+1:, :] 
y[:, +1:] *= x[:, :-1] 
y[:, :-1] *= x[:, +1:] 

y 
#>>> array([[ 12, 21, 64, 135, 4], 
#>>>  [ 14, 288, 756, 160, 270], 
#>>>  [ 126, 448, 1080, 216, 10], 
#>>>  [ 16, 189, 32, 90, 6]]) 

Nota che il primo *= può essere un incarico se avete bisogno di maggiore velocità.

Problemi correlati