Numpy - Получение позиций индекса путем тестирования смежных индексов - PullRequest
2 голосов
/ 26 августа 2011

Я использую numpy это Python. У меня есть изображение, загруженное в двумерный массив, как:

[
  [...], # row0
  [...], # row1
  [...], # row2
  ...
]

Мне нужно получить все позиции индекса всех пикселей, в которых (или только один из следующих) север, юг, восток или запад соседних пикселей имеют определенное значение. В моем случае, если любой из 4 смежных пикселей равен 0.

Ответы [ 2 ]

5 голосов
/ 26 августа 2011

Если a - ваш исходный массив, определите кучу кусочков:

from scipy import *

a = ones((12,22))
a[5,10] = a[5,12] = 0

a_ = a[1:-1, 1:-1]
aE = a[1:-1, 0:-2]
aW = a[1:-1,   2:]
aN = a[0:-2, 1:-1]
aS = a[  2:, 1:-1]

a4 = dstack([aE,aW,aN,aS])
num_adjacent_zeros = sum(a4 == 0, axis=2)
print num_adjacent_zeros

ys,xs = where(num_adjacent_zeros == 1)
# account for offset of a_
xs += 1 
ys += 1

print '\n hits:'
for col,row in zip(xs,ys):
  print (col,row)

Причиной взятия меньшего a_ является то, что я не знаю, что вы хотите сделать с крайними случаямигде, например, северный пиксель может не существовать.

Я строю массив подсчета соседних нулей и использую его для получения позиций, которые находятся рядом с ровно одним нулем.Выход:

[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 1 0 2 0 1 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]

 hits:
(10, 4)
(12, 4)
(9, 5)
(13, 5)
(10, 6)
(12, 6)
3 голосов
/ 26 августа 2011

Вероятно, самый простой способ сделать это - найти все нули, используя что-то вроде:

import numpy as np
# a is the image array
z_indices = np.where(a == 0)

А затем просто вычислите смежные индексы для пикселей, которые равны нулю (все комбинации + 1, -1 нулевых индексов). Затем вам придется удалить дубликаты, если точка находится рядом с двумя разными нулевыми пикселями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...