2014-11-15 12 views
5

Her hücre için 4 komşu mahallenin ürününü hesaplamayı içeren bir görüntü işleme algoritması uygulamaya çalışıyorum. Yani, y[i, j] = x[i-1, j] * x[i, j-1] * x[i+1, j] * x[i, j+1]'un X için yeni bir matrisini hesaplamaktır. Sınır dışı komşular göz ardı edilmelidir.Her hücre için mahallenin ürününü numpy/scipy ile bir matris içinde hesaplayın

Şimdi sadece bu yaklaşımın düşünebilirsiniz: scipy.ndimage.filters.correlate kullanabilir ve sıfırlarla ağırlıkları geçmek ve bir 1 weight = [[0, 0, 0], [1, 0, 0], [1, 1]] geçen gibi her biri bir yöne her hücre için komşu içeren dört matris olsun ve ben a[i, j] = x[i-1, j] olsun ve Diğer ağırlıklar ile b[i, j] = x[i, j-1], c[i, j] = x[i+1, j], d[i, j] = x[i, j+1] elde edebilirim. Daha sonra bu dört matrisin ürününü hesaplamak için np.multiply kullanın. Ancak, bu yaklaşım biraz fazla yavaş ve sınırları göz ardı edemiyorum. Numpy/scipy ile yapmanın başka bir yolu var mı bu yüzden döngüler için başvurmak zorunda değilim?

+1

İlk önce günlükleri aldıysanız, bu bir ek olacaktır. – Paul

+0

2x2 konvolution Discrete Laplace operatörü, eklendikten sonra oldukça yakın olacaktır. Sadece merkezi terimini iptal etmeniz gerekiyor. http://en.wikipedia.org/wiki/Discrete_Laplace_operator http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.filters.laplace.html – Paul

+0

@Paul Yardımlarınız için teşekkürler, ancak matriste negatif sayılar olsun, bu yüzden önce günlükleri alamıyorum. – Joyee

cevap

3

ayrı ayrı kenarları yazmak gerekir, ancak bu size dizinin orta kısmı için sonra ne yapar ve daha hızlı korelasyon daha belirgin muhtemelen:

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

"y = numpy.ones_like" olmalı ve ikinci satır kaldırılmamalıdır? – Veedrac

3

Bence bu daha iyi maçlar neyi Eğer sorduğun: ekstra hız gerekiyorsa ilk *= atama olabilir

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]]) 

Not söyledi.

İlgili konular