2016-09-21 32 views
1

我有一個大的numpy 2d(10000,10000)與許多區域(具有相同單元格值的聚簇單元格)。我想要的是合併顯示超過35%邊界重疊的鄰近區域。這種重疊應該通過將共同邊界的大小與鄰居的大小除以該區域的總邊界大小來測量。測量numpy 2d區域之間的邊界重疊

我知道如何檢測相鄰區域(Look here),但我不知道如何測量邊界重疊。

由於我正在處理大型數組,矢量化解決方案將是最優化的。


#input 
region_arr=np.array([[1,1,3,3],[1,2,2,3],[2,2,4,4],[5,5,4,4]]) 

enter image description here

鄰居檢測腳本的輸出是一個numpy的2-d陣列,以在所述第一區域和所述第二列中的鄰居。

#result of neighbour detection 
>>> region_neighbour=detect_neighbours(region_arr) 
>>> region_neighbour 
array([[1, 2], 
     [1, 3], 
     [2, 1], 
     [2, 3], 
     [2, 4], 
     [2, 5], 
     [3, 1], 
     [3, 2], 
     [3, 4], 
     [4, 2], 
     [4, 3], 
     [4, 5], 
     [5, 2], 
     [5, 4]]) 

我想添加一列到鄰居檢測的結果,其中包含該區域與其鄰居之間的百分比重疊。區域1和3 = 1/8 = 0.125 =共同邊界大小/區域1.

的總邊框大小之間percentual的重疊在該實例中所需的輸出是這樣的:

#output 
>>> percentual_overlap=measure_border_overlap(region_arr,region_neighbour) 
>>> percentual_overlap 
array([[ 1.  , 3.  , 0.125 ], 
     [ 1.  , 2.  , 0.375 ], 
     [ 2.  , 1.  , 0.3  ], 
     [ 2.  , 3.  , 0.3  ], 
     [ 2.  , 4.  , 0.2  ], 
     [ 2.  , 5.  , 0.2  ], 
     [ 3.  , 1.  , 0.125 ], 
     [ 3.  , 2.  , 0.25 ], 
     [ 3.  , 4.  , 0.125 ], 
     [ 4.  , 2.  , 0.375 ], 
     [ 4.  , 3.  , 0.125 ], 
     [ 4.  , 5.  , 0.125 ], 
     [ 5.  , 2.  , 0.333333], 
     [ 5.  , 4.  , 0.166667]])  

隨着這個輸出比較容易合併重疊超過35%的區域(區域1和2;區域4和2)。該區域合併的新陣列將這個樣子後:

enter image description here

編輯

可以通過應用的pv.函數計算出每個區域的周長。

回答

1

看看這個Count cells of adjacent numpy regions的靈感。根據這些信息決定如何合併是一個我認爲有多個答案的問題;它可能不會有一個獨特的解決方案,取決於您進行的順序...

import numpy_indexed as npi 

neighbors = np.concatenate([x[:, :-1].flatten(), x[:, +1:].flatten(), x[+1:, :].flatten(), x[:-1, :].flatten()]) 
centers = np.concatenate([x[:, +1:].flatten(), x[:, :-1].flatten(), x[:-1, :].flatten(), x[+1:, :].flatten()]) 
border = neighbors != centers 

(neighbors, centers), counts = npi.count((neighbors[border], centers[border])) 
region_group = group_by(centers) 
regions, neighbors_per_region = region_group.sum(counts) 
fractions = counts/neighbors_per_region[region_group.inverse] 
for result in zip(centers, neighbors, fractions): 
    print(result) 
+0

非常感謝。輸出結果並不完全相似,但我絕對可以在我的代碼中實現這種方法! –

+0

答案中的一個小錯誤是返回的分數是整數(全部爲0)。我認爲它應該是這樣的: fractions = counts/neighbors_per_region [region_group.inverse] .astype(float) –

+0

是的;它在python3下工作,但實際上我認爲這在2中是不同的 –