获取数组的索引,其中 4 个或 4 个以上的相邻元素为 1

Obtain indices of a array where 4 or more than 4 adjacent elements are 1

我想获得4个或4个以上相邻元素为1的数组(数据)的索引:

import numpy as np    

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

你会怎么做?

预期的答案是:

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

我已经将不需要的像素转换为 0。

这是使用 numpy.ndimage 的解决方案。它计算数组中相邻区域(1.0s)的大小,然后用相应区域的大小替换数组中的每个像素。然后,这可用于将图像中不属于至少 4 大小区域的所有像素设置为零。

import scipy.ndimage.measurements as m

labels,nlabels = label(data) 
sizes = np.hstack((0,m.sum(data, labels, range(1,nlabels+1)))) 
data[sizes[labels] < 4] = 0.0

这是 skimage 版本。有点长,但可能更明确:

from __future__ import print_function
import numpy as np
from skimage.measure import label, regionprops

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

labels = label(data, background=0, neighbors=4)
regions = regionprops(labels)
out = np.zeros_like(data)

for r in regions:
    if r.area >= 4:
        rows, cols = r.coords.T
        out[rows, cols] = 1

print(out)