import numpy as numpy
data = np.array([[0, 0 , 0 , 0 , 0 , 0 , 0 , 0],
[0,*1*, 0 , 0 , 0 , 0 , 0 , 0],
[1, 0 , 0 , 0 ,*1*, 0 , 0 , 0],
[1, 0 , 0 , 0 ,*1*,*1*, 0 , 0],
[0, 0 , 0 ,*1*,*1*, 0 , 0 , 1],
[1, 0 , 0 , 0 ,*1*, 0 , 1 , 1],
[1, 1 , 0 , 0 , 0 , 0 , 1 , 0]])
如果色块在所有四个相邻像素中被黑色(零)包围,我想提取白色(一)斑块的索引。预期位置用斜体表示。
有什么想法吗?
首先,标记图像中的所有连接对象(默认结构元素考虑北-南-东-西方向的邻居)。 然后,删除任何接触边框的对象。 背景标记为 0,其余是完全被它包围的对象。
from __future__ import print_function
import numpy as np
from scipy.ndimage import label
from skimage.segmentation import clear_border
data = np.array([[0, 0 , 0 , 0 , 0 , 0 , 0 , 0],
[0, 1 , 0 , 0 , 0 , 0 , 0 , 0],
[1, 0 , 0 , 0 , 1 , 0 , 0 , 0],
[1, 0 , 0 , 0 , 1 , 1 , 0 , 0],
[0, 0 , 0 , 1 , 1 , 0 , 0 , 1],
[1, 0 , 0 , 0 , 1 , 0 , 1 , 1],
[1, 1 , 0 , 0 , 0 , 0 , 1 , 0]])
objects, count = label(data)
objects_inside = clear_border(objects)
print((objects_inside != 0).astype(int))
结果:
[[0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0]
[0 0 0 0 1 0 0 0]
[0 0 0 0 1 1 0 0]
[0 0 0 1 1 0 0 0]
[0 0 0 0 1 0 0 0]
[0 0 0 0 0 0 0 0]]