2012-01-09 6 views
2

У меня есть массив объектов с меткой scipy.ndimage.measurements.label под названием Labels. У меня есть другой массив Data содержащий материал, связанный с Labels. Как я могу сделать третий массив Neighbourhoods, которые могли бы служить для отображения ближайшей метки к х, у является LОкрестности Scipy Labels

Учитывая Labels и Data, как я могу использовать 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. Я сделал быстрый поиск в Google и ничего не нашел в Numpy/Scipy, но есть некоторые сообщения в блогах и т. Д. –

ответ

2

Как полагает Дэвид Заславского, это работа на диаграмме voroni. Ниже приводится краткая реализация: 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

Я добавил соответствующую часть из статьи. Надеюсь, все в порядке! –

+0

+1 Конечно :) – ajwood

Смежные вопросы