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

时间:2018-09-04 23:46:39

标签: python python-3.x numpy image-processing python-3.7

我正在尝试进行视频处理,我希望能够有效地获取红色高于100,绿色低于100和蓝色低于100的所有像素。我设法通过for循环来实现每个像素3次评估,但这太慢了,每帧花费了13秒。我目前正在使用cv2来获取图像,并具有

的处理代码
create or replace
procedure concatenate_strings(p_str1 in varcahr2, p_str2 in varchar2) as
   result varchar2(20);
   begin
      result := p_str1 || ' ' || p_str2;
      dbms_output.put_line('The result is: ' || result);
end;

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

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

1 个答案:

答案 0 :(得分: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]