Numpy 过滤器像素索引

Numpy filter pixel indices

我想提取 RGB 图像所有像素的 sum 计数,其中 R=0 和 B=0 并且这些像素的 x,y 坐标位于图片的边框。

首先我得到R=0和B=0的像素坐标:

import cv2
import numpy as np
i = cv2.imread("test2.png")
indices = np.where((i[:, :, 0] == 0) & (i[:, :, 2] == 0))

这给了我一个坐标列表。现在我想获得 x 位置为 0 或图像宽度(在本例中为 21)的所有像素的总和。

我可以对列表进行排序,但如果可能的话,我想坚持使用 numpy 数组。有什么奇特的方法吗?

方法 #1

X 沿第二个轴,这是一个 花式 方式 -

(i[...,[0,2]]==0).all(-1)[:,[0,-1]].sum()

方法 #2

多维索引 -

(i[:,[0,-1],[0,2]]==0).sum()

方法 #3

为了性能,使用更多的 slicing -

mask = (i[...,0]==0) & (i[...,2]==0)
out_x = (mask[:,0] + mask[:,-1]).sum()

在较旧的 NumPy 版本上,np.count_nonzero 可能比 .sum() 更好。