【问题标题】:Replace all pixels in numpy array with pixels in separate array unless the value is 0将 numpy 数组中的所有像素替换为单独数组中的像素,除非值为 0
【发布时间】:2020-10-24 04:10:47
【问题描述】:

有一个 opencv 图像,我分成 3 个通道:

 image #opencv image

 img_red = image[:, :, 2]
 img_green = image[:, :, 1]
 img_blue = image[:, :, 0]

然后是三个过滤器:

red_filter
green_filter
blue_filter

它们都是 numpy 数组,但大部分填充为零,因此格式看起来像这样:

[0, 0, 0, 132, ... 0, 15,   0, 230, 0]
               ...                   
[32, 0, 5, 0,  ... 0,  2, 150,   0, 0]

我想使用这些过滤器中的每个非零值来覆盖通道中的相同索引。

类似这样的:

img_red[index] = red_filter[index] if red_filter != 0
img_green[index] = green_filter[index] if green_filter != 0
img_blue[index] = blue_filter[index] if blue_filter != 0
final_img = cv2.merge(img_red, img_green, img_blue)

例如,如果频道如下所示:

[44, 225, 43, ... 24, 76, 56]

还有过滤器:

[0,   0, 25   ... 2,   0, 91]

那么结果应该是:

[44, 225, 25 ...  2,  76, 91]

我尝试过使用 for 循环和列表推导,但是这段代码必须在视频中的每一帧上运行,所以我想知道是否有更快的方法来实现相同的结果。

opencv 中是否有某种图像过滤或 numpy 操作可以有效地完成这个过程?

【问题讨论】:

    标签: python numpy opencv imagefilter


    【解决方案1】:

    您似乎在寻找np.where 方法:

    channel = np.array([44, 225, 43, 24, 76, 56])
    filter = np.array([0,   0, 25, 2,   0, 91])
    #result = np.array([44, 225, 25, 2,  76, 91])
    >>> np.where(filter==0, channel, filter)
    array([ 44, 225,  25,   2,  76,  91])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-28
      • 2020-08-31
      • 2020-05-22
      • 2021-12-17
      • 2019-01-25
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      相关资源
      最近更新 更多