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()
更好。
我想提取 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()
更好。