Numpy - 通过测试相邻索引获取索引位置

2 投票
2 回答
1145 浏览
提问于 2025-04-17 00:24

我在用Python的numpy库。现在我已经把一张图片加载成了一个二维的numpy数组,内容如下:

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

我需要找到所有像素的位置索引,这些像素的四周(北、南、东、西)有一个邻近像素的值是特定的。在我的例子中,就是如果四个邻近像素中有任何一个是0。

2 个回答

3

最简单的方法可能就是先找到所有的零,使用类似下面的代码:

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

然后,你只需要计算那些零旁边的像素位置,也就是把零的索引加上1和减去1,得到所有可能的组合。最后,如果某个点是两个不同零像素的邻居,你还得去掉重复的结果。

5

如果你的原始数组叫做 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)

撰写回答