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

Numpy 获取数组的索引,其中4个或4个以上的相邻元素为1,numpy,scipy,scikit-image,Numpy,Scipy,Scikit Image,我想获得数组(数据)的索引,其中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]

我想获得数组(数据)的索引,其中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
的解决方案。它计算阵列中相邻区域(of
1.0
s)的大小,然后用相应区域的大小替换阵列中的每个像素。然后,可以使用该设置将图像中不属于大小至少为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
将scipy.ndimage.measurements导入为m
标签,nlabels=标签(数据)
大小=np.hstack((0,m.sum(数据,标签,范围(1,nlabels+1)))
数据[大小[标签]<4]=0.0

这里有一个使用
numpy.ndimage
的解决方案。它计算阵列中相邻区域(of
1.0
s)的大小,然后用相应区域的大小替换阵列中的每个像素。然后,可以使用该设置将图像中不属于大小至少为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
将scipy.ndimage.measurements导入为m
标签,nlabels=标签(数据)
大小=np.hstack((0,m.sum(数据,标签,范围(1,nlabels+1)))
数据[大小[标签]<4]=0.0

这是略读版。稍长一点,但可能更明确一些:

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)

这是略读版。稍长一点,但可能更明确一些:

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)

您的示例的预期输出是什么?邻接可以是任何方向,例如垂直、对角线、T形吗?是的,它们可以是任何方向。我编辑了我的问题以显示预期的答案。您的示例的预期输出是什么?邻接可以在任何方向上,例如垂直、对角、T形吗?是的,它们可以在任何方向上。我已经编辑了我的问题,以显示预期的答案。此外,最好避免for循环是不?不确定如何避免此处的for循环。并且4个相邻的元素可以是任何形状。另外,最好避免for循环不是吗?不确定如何避免这里的for循环。“四个相邻的元素可以是任意形状的。@西门,最后一个问题已经回答了。@OliverW。”。我知道你提供的链接,因为他们已经被SF链接到这个问题。然而,我正在寻找使用numpy ans scipy解决问题的方法,主要是scipy过滤器等等。@simen,最后一个问题得到了回答。@OliverW。我知道你提供的链接,因为他们已经被SF链接到这个问题。但是,我希望使用numpy和scipy解决这个问题,主要是scipy过滤器等等。