方法#1
我们可以使用2D convolution -
from scipy.signal import convolve2d
def interior_indices(a):
kernel = np.ones((3,3),dtype=int)
return np.argwhere(convolve2d(a,kernel,'same')==9)
示例运行 -
In [44]: a1
Out[44]:
array([[False, False, False, False, False, False, False, False],
[ True, True, True, True, True, True, False, False],
[False, True, True, True, True, True, True, False],
[False, False, True, True, True, True, False, False]])
In [45]: interior_indices(a1)
Out[45]:
array([[2, 3],
[2, 4]])
In [46]: a2
Out[46]:
array([[False, False, False, False, False, False, False, False],
[False, True, True, True, True, True, False, False],
[False, True, True, True, True, True, True, False],
[False, False, True, True, True, True, True, False],
[False, False, True, True, True, True, True, False],
[False, True, True, True, True, True, True, False],
[False, False, False, True, True, False, False, False]])
In [47]: interior_indices(a2)
Out[47]:
array([[2, 3],
[2, 4],
[3, 3],
[3, 4],
[3, 5],
[4, 3],
[4, 4],
[4, 5]])
方法 #2
或者,uniform-filter -
In [61]: from scipy.ndimage import uniform_filter
In [62]: np.argwhere(uniform_filter(a1,mode='constant'))
Out[62]:
array([[2, 3],
[2, 4]])
In [63]: np.argwhere(uniform_filter(a2,mode='constant'))
Out[63]:
array([[2, 3],
[2, 4],
[3, 3],
[3, 4],
[3, 5],
[4, 3],
[4, 4],
[4, 5]])
方法#3
还有binary-erosion -
In [72]: from scipy.ndimage.morphology import binary_erosion
In [73]: kernel = np.ones((3,3),dtype=bool)
In [74]: np.argwhere(binary_erosion(a1,kernel))
Out[74]:
array([[2, 3],
[2, 4]])
In [75]: np.argwhere(binary_erosion(a2,kernel))
Out[75]:
array([[2, 3],
[2, 4],
[3, 3],
[3, 4],
[3, 5],
[4, 3],
[4, 4],
[4, 5]])