2D numpy数组 - 检查所有相邻项是否相等

时间:2014-10-30 19:52:29

标签: python arrays numpy transformation edge-detection

我开始使用nxm布尔数组,它定义了区域 - 如果它在区域中则为true,否则为false。例如:

r = np.array([[ 0,  0,  1,  1,  1],
              [ 0,  1,  1,  0,  0],
              [ 0,  1,  1,  1,  0],
              [ 1,  1,  1,  0,  0],
              [ 1,  1,  0,  0,  0]])

区域之间的线可以定义为n-1 x m-1阵列,它代表一个点''在每组四个值之间。如果所有4个周围值都相同,则您不在区域之间的边缘。如果4个值中的任何一个不同,那么你就是。对于上面的r:

l = np.array([[ 1, 1, 1, 1],
              [ 1, 0, 1, 1],
              [ 1, 0, 1, 1],
              [ 0, 1, 1, 0]])

有关如何有效完成此事的任何想法?我试过在两个方向做一个差异,但这个加倍。有2D差异功能吗?其他一些方法呢?

2 个答案:

答案 0 :(得分:6)

这将对True

所包围的 points 进行测试
tmp = r[1:] & r[:-1]
l = np.logical_not(tmp[:, 1:] & tmp[:, :-1])

然后你可以用同样的方式对False包围的 points 进行测试并将它们组合起来,

r = np.logical_not(r)
tmp = r[1:] & r[:-1]
l &= np.logical_not(tmp[:, 1:] & tmp[:, :-1])

print l.astype(int)
# [[1 1 1 1]
#  [1 0 1 1]
#  [1 0 1 1]
#  [0 1 1 0]]

答案 1 :(得分:2)

已经选择了一个很好的答案,但我喜欢易于编写和理解的解决方案,所以我仍然会发布这个:

from scipy.signal import convolve2d
kernel = np.array(((1, 1), (1, 1)))

x = convolve2d(r, kernel, mode="valid")   # sum all the neighboring values (and mode handles the boundary issues)
x[x==4] = 0                               # set the elements that sum to 4 to zero (the ones that sum to 0 are already 0)
x[x>0] = 1                                # anything greater than one is set to 1

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