6

Belirli bir sayısal dizi yapısının çevresini hesaplamak istiyorum. Çevreyle, numpy dizisindeki yapının tam çevresini kastediyorum. Yapı delikler içerebilir. Eğer tüm komşu hücreleri görüntüler de görebileceğiniz gibiSayısal dizinin çevresini hesapla

import numpy 
a = numpy.zeros((6,6), dtype=numpy.int) 
a[1:5, 1:5] = 1;a[3,3] = 0 
# Way 1 
s = ndimage.generate_binary_structure(2,1) 
c = ndimage.binary_dilation(a,s).astype(a.dtype) 
b = c - a 
numpy.sum(b) # The result, however the hole is calculated as 1, although there are 4 edges 

# Way 2 
b = ndimage.distance_transform_cdt(a == 0,metric='taxicab') == 1 
b = b.astype(int) 
numpy.sum(b) # same as above 

enter image description here

Ancak bunların toplamı yama çevresini eşit değildir:

Benim şu anki yaklaşımın böyle bir şeydir. Örnek dizideki delik, doğru şekilde 4 kenarı olmasına rağmen 1 olarak hesaplanır. Farklı şekillerdeki daha büyük deliklerle benzer sorunlar var.

Geçmişte benzer soruları sordum, ancak sonuçta sonuçta doğru çıktı değerlerinde çözülmeyen çözümler sağlandı. Birisi bunu nasıl başarabilir? Numpy, scipy ve baz paketlerinden başka paketler yoktur.

+1

Bu örnekte ne değeri bekliyorsunuz? – Eric

+0

Tam sayı değeri. Yukarıdaki test verisi setinde, son değer 20 olmalıdır, çünkü 20 kenar vardır. – Curlew

cevap

4

Görüntüde, kırmızı renkli fayanslardan mavi rengi ayıran toplam uzunluk-1 kenar sayısı mı demek istiyorsunuz? Bu sayı yukarıdaki resimde 28 olacaktır. Kodda verdiğiniz örnekte (ki bu biraz farklıdır, 4 köşenin kenar taşlarının geri kalanından farklı olmaması gerekir) 20 olacaktır.

Eğer öyleyse (varsayar ikili görüntüsü)

numpy.sum(a[:,1:] != a[:,:-1]) + numpy.sum(a[1:,:] != a[:-1,:])

+0

görüntü, çizilen sonuç dizisidir (b). – Curlew

+0

Evet, işe yarıyor! Çözümünüzü seçiyorum çünkü önemli ölçüde daha küçük ve hızlı – Curlew

5

iç ve kenarlarında kenarları sayısını: hesaplamak istiyorum, şöyle bir şey yapabilirsiniz

n_interior = abs(diff(a, axis=0)).sum() + abs(diff(a, axis=1)).sum() 
n_boundary = a[0,:].sum() + a[:,0].sum() + a[-1,:].sum() + a[:,-1].sum() 
perimeter = n_interior + n_boundary 

sen eğer n_boundary dışarı bırakabilir görüntü uygun y sıfır doldurulmuş.