2012-01-09 38 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