我有一个 3D 数组的集合,每个数组代表一个图像。我想查找给定坐标在所有数组中包含非黑色像素的出现次数。
result = np.zeros_like(list_of_arrays[0])
for array in list_of_arrays:
for (y, x) in np.argwhere(array.any(-1)):
result[y][x] += 1
return result
我怎样才能最好地改进这个简单的实现?如果我知道如何将第三维转换为 0 或 1,我可以复制每个数组,然后将它们相加以获得我的答案。问题是我不知道如何进行转换。
<小时/>两张 3x3 图片的示例
# picture 1
[[[ 208., 208., 208.],
[ 0., 0., 0.],
[ 110., 110., 110.]],
[[ 161., 161., 161.],
[ 140., 140., 140.],
[ 251., 251., 251.]],
[[ 0., 0., 0.],
[ 55., 55., 55.],
[ 26., 26., 26.]]]
# picture 2
[[[ 88., 88., 88.],
[ 140., 140., 140.],
[ 0., 0., 0.]],
[[ 18., 18., 18.],
[ 112., 112., 112.],
[ 0., 0., 0.]],
[[ 0., 0., 0.],
[ 195., 195., 195.],
[ 5., 5., 5.]]]
# what I'd like
[[[ 2., 2., 2.],
[ 1., 1., 1.],
[ 1., 1., 1.]],
[[ 2., 2., 2.],
[ 2., 2., 2.],
[ 1., 1., 1.]],
[[ 0., 0., 0.],
[ 2., 2., 2.],
[ 2., 2., 2.]]]
最佳答案
假设这两个图像是名为 pic1
的 numpy 数组和pic2
:
pic1 = np.array(
[[[ 208., 208., 208.],
[ 0., 0., 0.],
[ 110., 110., 110.]],
[[ 161., 161., 161.],
[ 140., 140., 140.],
[ 251., 251., 251.]],
[[ 0., 0., 0.],
[ 55., 55., 55.],
[ 26., 26., 26.]]]
)
pic2 = np.array(
[[[ 88., 88., 88.],
[ 140., 140., 140.],
[ 0., 0., 0.]],
[[ 18., 18., 18.],
[ 112., 112., 112.],
[ 0., 0., 0.]],
[[ 0., 0., 0.],
[ 195., 195., 195.],
[ 5., 5., 5.]]]
)
您可以使用 np.array([pic1, pic2])
创建这些图像的 numpy 数组或者如果您已经在列表中包含图像,则 np.array(list_of_arrays)
。然后,对该四维数组的每个元素单独应用逻辑运算,检查每个元素是否非零。最后,对指定 axis=0
的四维数组求和。 :
# Get a numpy array of images
images = np.array([pic1, pic2]) # or np.array(list_of_arrays)
# Check for nonzero values and sum along the relevant axis
result = (images != 0).sum(axis=0)
array([[[2, 2, 2],
[1, 1, 1],
[1, 1, 1]],
[[2, 2, 2],
[2, 2, 2],
[1, 1, 1]],
[[0, 0, 0],
[2, 2, 2],
[2, 2, 2]]])
如果图像已在列表中,则此方法可能不如其他方法快。也就是说,如果您在第一次创建图像集合时可以选择数据结构,并且可以使用 numpy 数组,那么这是最快的。
关于python - Numpy:查找非零值的出现,按索引分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36106498/