选择满足numpy中多个条件的rgb图像像素

问题描述 投票:2回答:1

我正在尝试进行视频处理,我希望能够有效地获得所有像素,红色在100以上,绿色在100以下,蓝色在100以下。我设法用for循环做了3个评估每个像素,但这太慢了,每帧需要13秒。我目前正在使用cv2来获取图像,并具有处理代码

retval = np.delete(frame, (0, 1), 2) #extracts just red of the pixels
retval = np.argwhere(retval>100) #extracts where red is above 100
retval = np.delete(retval, 2, 1) #removes the actual color value, leaving it as coordinates

这使得我对红色值大于100的任何东西都有部分解决方案,但它也包括棕色和白色等不理想的东西。这个循环需要发生得非常快,这就是为什么我想使用numpy,但我不确定要使用什么命令。任何帮助将不胜感激。 “frame”数组的结构如下,格式为BGR,而不是RGB。第一个索引是x坐标,第二个索引是y坐标,第三个索引是0,1或2,对应于蓝色,绿色和红色。

[[[255,   0,   0],
  [255,   0,   0],
  [255,   0,   0],
  ...,
  [  8,  20,   8],
  [ 12,  15,  20],
  [ 16,  14,  26]],

  [[255,   0,   0],
  [ 37,  27,  20],
  [ 45,  36,  32],
  ...,
  [177, 187, 157],
  [180, 192, 164],
  [182, 193, 167]]]
python python-3.x numpy image-processing python-3.7
1个回答
0
投票

尝试制作三个布尔掩码,每个条件一个,然后将它们与np.logical_and合并

im = #define the image suitably 
mask = np.logical_and.reduce((im[:,:,0]<100,im[:,:,1]<100,im[:,:,2]>100))
im[mask] # returns all pixels satisfying these conditions

这很快。它基于两个numpy功能:广播和屏蔽。您可以而且应该在numpy文档中阅读这些内容。您只需要针对相对复杂的任务进行循环。

编辑:

如果你想要像素的索引,那么

i,j = np.where(mask)

那么像素值就是

im[i,j] 
© www.soinside.com 2019 - 2024. All rights reserved.