【问题标题】:Neighbourhood of Scipy LabelsScipy 标签附近
【发布时间】:2012-01-09 20:16:52
【问题描述】:

我有一组标有scipy.ndimage.measurements.label 的对象,称为Labels。我还有其他数组 Data 包含与 Labels 相关的内容。如何制作第三个数组Neighbourhoods,它可以用于将 最近的标签映射到 x,yL

鉴于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

【问题讨论】:

  • 听起来你想要一个Voronoi diagram,尽管我不确定是否有在 Numpy/Scipy 中计算它的函数。我做了一个快速的谷歌搜索,并没有在 Numpy/Scipy 中找到任何东西,但是有一些博客文章等。

标签: python numpy scipy


【解决方案1】:

正如 David 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]])

【讨论】:

  • 我添加了文章中的相关部分。希望没关系!
猜你喜欢
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多