【问题标题】:selecting rgb image pixels satisfying multiple conditions in numpy在numpy中选择满足多个条件的RGB图像像素
【发布时间】:2019-02-10 00:25:56
【问题描述】:

我正在尝试进行视频处理,并且我希望能够有效地获得红色高于 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 的原因,但我不确定要使用哪些命令。任何帮助将不胜感激。 “帧”数组的结构是这样的,格式为 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】:

    尝试制作三个布尔掩码,每个条件一个,然后将它们与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 文档中阅读这些内容。对于相对复杂的任务,您只需要 for 循环。

    编辑:

    如果你想要像素的索引,做

    i,j = np.where(mask)
    

    那么像素值为

    im[i,j] 
    

    【讨论】:

    • 返回无效坐标,例如第一个是[68, 80, 80]
    • 这些不是坐标。它们是像素值。
    • 但是那些像素值不符合要求
    • 这令人费解。发布示例图片?
    • 哦,我明白了。我认为 np.bitwise_and 一次只需要两个数组。我会编辑。有趣的是,考虑到我正在使用的图像,它对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多