2012-10-12 149 views
1

這是由此solution產生的後續問題。 除非在數組中有多個修補程序,否則對相鄰單元格進行計數的解決方案工作得很好。numpy陣列中多個單元格貼片的相鄰單元

所以這次這個數組看起來像這樣。

import numpy 
from scipy import ndimage 

s = ndimage.generate_binary_structure(2,2) 
a = numpy.zeros((6,6), dtype=numpy.int) # example array 
a[1:3, 1:3] = 1;a[2:4,4:5] = 1 
print a 
[0 0 0 0 0 0] 
[0 1 1 0 0 0] 
[0 1 1 0 1 0] 
[0 0 0 0 1 0] 
[0 0 0 0 0 0] 
[0 0 0 0 0 0] 

# Number of nonoverlapping cells 
c = ndimage.binary_dilation(a,s).astype(a.dtype) 
b = c - a 
numpy.sum(b) # returns 19 
# However the correct number of non overlapping cells should be 22 (12+10) 

是否有任何聰明的解決方案來解決這個困境,而不使用任何循環或迭代通過數組?原因是陣列可能相當大。

思路1:

只是想在它和辦法做到這一點可能是檢查的迭代結構中一個以上的補丁。爲了使總計數正確,下面的單元在擴張中必須等於2(或更多)。任何人都知道如何將這個想法變成代碼?

[1 1 1 1 0 0] 
[1 0 0 2 1 1] 
[1 0 0 2 0 1] 
[1 1 1 2 0 1] 
[0 0 0 1 1 1] 
[0 0 0 0 0 0] 
+0

你得到的是不重疊的單元格嗎?你是否真的希望每個補丁都單獨使用它們? IE瀏覽器。如果你在你的'a'上添加'a [1,3:5] = 1',你甚至會想要什麼? – seberg

+0

請參閱其他問題的答案。上面的數組僅僅是一個例子。我真正的數組非常大,幷包含許多值的單元格修補程序 – Curlew

+0

我很困惑,因爲您指出'scipy.signal.convolve2d'解決了您以前的問題 - 但是它計算所有重疊值。現在看來你不希望重疊計數,只有當這些重疊是由非連續的'1'塊產生時。這是完全不同的要求。所以你之前的問題並沒有真正解釋你現在想要的。 – senderle

回答

4

您可以使用labelndimage到段的人的每個補丁。

然後你只需問哪裏返回數組等於1,2,3等,並在其上執行的algoritm(或者你只是使用ndimage.distance_transform_cdt但反轉的forground /背景每個標記段。

編輯1:

此代碼將您的陣列a,做什麼你問:

b, c = ndimage.label(a) 
e = numpy.zeros(a.shape) 
for i in xrange(c): 

    e += ndimage.distance_transform_cdt((b == i + 1) == 0) == 1 

print e 

我意識到這是一個有點難看,與所有的平等有但它輸出:

In [41]: print e 
[[ 1. 1. 1. 1. 0. 0.] 
[ 1. 0. 0. 2. 1. 1.] 
[ 1. 0. 0. 2. 0. 1.] 
[ 1. 1. 1. 2. 0. 1.] 
[ 0. 0. 0. 1. 1. 1.] 
[ 0. 0. 0. 0. 0. 0.]] 

編輯2(替代解決方案):

此代碼應做同樣的東西,並希望更快(但它會找到其中 兩個補丁只接觸角)。

b = ndimage.binary_closing(a) - a 
b = ndimage.binary_dilation(b.astype(bool)) 

c = ndimage.distance_transform_cdt(a == 0) == 1 

e = c.astype(numpy.int) * b + c 

print e 
+0

,並且您希望距離轉換的棋盤設置(默認)爲btw。 – deinonychusaur

+0

mhh,我知道標籤功能。 Iam只是閱讀'ndimage.distance_transform_cdt'的文檔。你能舉一個例子嗎?我現在的問題是,'numpy.sum'計數值不會計算相鄰單元的拼接 – Curlew

+0

是的,這工作完全像我想要的那樣。謝謝。雖然我仍然不知道'distance_transform_cdt'是做什麼的:-) – Curlew

相關問題