为了账号安全,请及时绑定邮箱和手机立即绑定

将 numpy 数组中的所有像素替换为单独数组中的像素,除非该值为 0

将 numpy 数组中的所有像素替换为单独数组中的像素,除非该值为 0

白衣染霜花 2023-12-29 16:43:47
有一个 opencv 图像,我将其分为 3 个通道: image #opencv image img_red = image[:, :, 2] img_green = image[:, :, 1] img_blue = image[:, :, 0]然后是三个过滤器:red_filtergreen_filterblue_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 != 0img_green[index] = green_filter[index] if green_filter != 0img_blue[index] = blue_filter[index] if blue_filter != 0final_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 操作中是否有某种图像过滤可以有效地完成此过程?
查看完整描述

1 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

看起来你正在寻找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])


查看完整回答
反对 回复 2023-12-29
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信