python/numpy:查找2D/3D遮罩的边



这个问题与这个问题非常相似,但我不知道如何将答案应用于2D或3D阵列。

对于一个简单的例子,使用以下形状的二维阵列(5,5(:

In [158]: a                                                                                                                                                                      
Out[158]: 
array([[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0]])

我想得到边的索引。对于这种情况:

(array([1, 1, 1, 2, 2, 3, 3, 3]), array([1, 2, 3, 1, 3, 1, 2, 3]))

现在,我在两个方向/轴上移动数组,与原始数组进行比较,并识别具有不同值的单元格:

In [230]: np.nonzero(a!= np.roll(a,shift=(1,1),axis=(0,1)))                                                                                                                      
Out[230]: (array([1, 1, 1, 2, 2, 3, 3, 4, 4, 4]), array([1, 2, 3, 1, 4, 1, 4, 2, 3, 4]))

有些指数是正确的,但有些则不然。我想,由于我应用的偏移,4s应该变成3s,但我不确定如何纠正这一点,因为我计划将其应用于更复杂(更大(的掩模阵列。我的最终目标是将其应用于3D阵列。

我使用的是Python 3.7.1

您可以将阵列与边缘检测滤波器进行卷积

import numpy as np
from scipy.ndimage import convolve
x = np.array(
[[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0]])
fil = [[-1,-1,-1],
[-1, 8,-1],
[-1,-1,-1]]
np.where(convolve(x,fil, mode='constant') > 1)

输出:

(array([1, 1, 1, 2, 2, 3, 3, 3]), array([1, 2, 3, 1, 3, 1, 2, 3]))

卷积的结果

convolve(x,fil, mode='constant')

输出:

[[-1 -2 -3 -2 -1]
[-2  5  3  5 -2]
[-3  3  0  3 -3]
[-2  5  3  5 -2]
[-1 -2 -3 -2 -1]]

最新更新