2012-01-09 32 views
2

我有一組標有scipy.ndimage.measurements.label的對象,名爲Labels。我有其他陣列Data包含與Labels相關的東西。我怎樣才能使第三陣列Neighbourhoods這可能有助於繪製最近的標籤 X,Y大號Scipy標籤的鄰域

鑑於LabelsData,我怎麼可以使用Python/numpy的/ SciPy的獲得Neighbourhoods

Labels = array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
       [0, 1, 1, 1, 1, 0, 0, 0, 0, 0], 
       [0, 1, 1, 1, 1, 0, 0, 0, 0, 0], 
       [0, 1, 1, 1, 1, 0, 0, 0, 0, 0], 
       [0, 1, 1, 1, 1, 0, 0, 0, 0, 0], 
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
       [0, 0, 0, 0, 0, 0, 2, 2, 2, 0], 
       [0, 0, 0, 0, 0, 0, 2, 2, 2, 0], 
       [0, 0, 0, 0, 0, 0, 2, 2, 2, 0], 
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]) 

Data = array([[1, 1, 1, 1, 1, 1, 2, 3, 4, 5], 
       [1, 0, 0, 0, 0, 1, 2, 3, 4, 5], 
       [1, 0, 0, 0, 0, 1, 2, 3, 4, 4], 
       [1, 0, 0, 0, 0, 1, 2, 3, 3, 3], 
       [1, 0, 0, 0, 0, 1, 2, 2, 2, 2], 
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
       [2, 2, 2, 2, 2, 1, 0, 0, 0, 1], 
       [3, 3, 3, 3, 2, 1, 0, 0, 0, 1], 
       [4, 4, 4, 3, 2, 1, 0, 0, 0, 1], 
       [5, 5, 4, 3, 2, 1, 1, 1, 1, 1]]) 

Neighbourhoods = array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
         [1, 0, 0, 0, 0, 1, 1, 1, 1, 1], 
         [1, 0, 0, 0, 0, 1, 1, 1, 0, 2], 
         [1, 0, 0, 0, 0, 1, 1, 0, 2, 2], 
         [1, 0, 0, 0, 0, 1, 0, 2, 2, 2], 
         [1, 1, 1, 1, 1, 0, 2, 2, 2, 2], 
         [1, 1, 1, 1, 0, 2, 0, 0, 0, 2], 
         [1, 1, 1, 0, 2, 2, 0, 0, 0, 2], 
         [1, 1, 0, 2, 2, 2, 0, 0, 0, 2], 
         [1, 1, 2, 2, 2, 2, 2, 2, 2, 2]]) 

注:我不知道應該聯繫發生什麼,所以使用的零在上面Neighbourhoods

+0

聽起來好像要一個[維諾圖(http://en.wikipedia.org/wiki/Voronoi_diagram),儘管我不確定是否有函數在Numpy/Scipy中進行計算。我做了一個快速的谷歌搜索,並沒有發現任何Numpy/Scipy本身,但也有一些博客文章等。 – 2012-01-09 20:33:58

回答

2

正如大衛Zaslavsky建議,這是一個voroni圖的工作。這裏是一個numpy實現:http://blancosilva.wordpress.com/2010/12/15/image-processing-with-numpy-scipy-and-matplotlibs-in-sage/

相關函數是scipy.ndimage.distance_transform_edt。它有一個return_indices選項,可以利用它來做你所需要的(以及計算原始距離(在你的例子中爲data))。

作爲一個例子:

import numpy as np 
from scipy.ndimage import distance_transform_edt 

labels = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
        [0, 1, 1, 1, 1, 0, 0, 0, 0, 0], 
        [0, 1, 1, 1, 1, 0, 0, 0, 0, 0], 
        [0, 1, 1, 1, 1, 0, 0, 0, 0, 0], 
        [0, 1, 1, 1, 1, 0, 0, 0, 0, 0], 
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
        [0, 0, 0, 0, 0, 0, 2, 2, 2, 0], 
        [0, 0, 0, 0, 0, 0, 2, 2, 2, 0], 
        [0, 0, 0, 0, 0, 0, 2, 2, 2, 0], 
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]) 
i, j = distance_transform_edt(labels == 0, return_distances=False, 
           return_indices=True) 
neighborhoods = labels[i,j] 
print neighborhoods 

這產生了:

array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
     [1, 1, 1, 1, 1, 1, 1, 1, 1, 2], 
     [1, 1, 1, 1, 1, 1, 1, 1, 2, 2], 
     [1, 1, 1, 1, 1, 1, 1, 2, 2, 2], 
     [1, 1, 1, 1, 1, 1, 2, 2, 2, 2], 
     [1, 1, 1, 1, 1, 2, 2, 2, 2, 2], 
     [1, 1, 1, 1, 2, 2, 2, 2, 2, 2], 
     [1, 1, 1, 2, 2, 2, 2, 2, 2, 2], 
     [1, 1, 2, 2, 2, 2, 2, 2, 2, 2]]) 
+1

我添加了文章中的相關部分。希望沒關係! – 2012-01-09 22:59:15

+0

+1當然:) – ajwood 2012-01-10 00:24:38