获取数组的索引,其中 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.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
这是 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)
我想获得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.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
这是 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)