代码之家  ›  专栏  ›  技术社区  ›  Tyler Silva

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

  •  2
  • Tyler Silva  · 技术社区  · 6 年前

    我正在尝试做视频处理,我希望能够有效地得到所有的像素,红色在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
    

    “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]]]
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   kevinkayaks    6 年前

    尝试制作三个布尔掩码,每个条件一个,然后将它们与 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
    

    编辑:

    i,j = np.where(mask)
    

    然后像素值

    im[i,j]