【问题标题】:Numpy filter pixel indicesNumpy 过滤器像素索引
【发布时间】:2018-03-01 06:49:48
【问题描述】:

我想提取 R=0 和 B=0 以及这些像素的 x,y 坐标位于图像边界上的 RGB 图像的所有像素的 sum 计数.

首先我得到 R=0 和 B=0 的像素坐标:

import cv2
import numpy as np
i = cv2.imread("test2.png")
indices = np.where((i[:, :, 0] == 0) & (i[:, :, 2] == 0))

这给了我一个坐标列表。现在我想获取 x 位置为 0 或图像宽度(在本例中为 21)的所有像素的总和。

我可以对列表进行排序,但如果可能的话,我想坚持使用 numpy 数组。有什么奇特的方法吗?

【问题讨论】:

  • sum of all pixels,你的意思是所有像素的计数吗?
  • 是的,我会更新问题。

标签: python image numpy pixels


【解决方案1】:

方法#1

X 沿着第二个轴,这是一种 花哨 方式 -

(i[...,[0,2]]==0).all(-1)[:,[0,-1]].sum()

方法#2

使用多维度索引 -

(i[:,[0,-1],[0,2]]==0).sum()

方法#3

为了提高性能,请使用更多 slicing -

mask = (i[...,0]==0) & (i[...,2]==0)
out_x = (mask[:,0] + mask[:,-1]).sum()

在旧 NumPy 版本上,np.count_nonzero 可能比 .sum() 更好。

【讨论】:

  • 是的,我的意思是数数。 print ((i[:, :, 0] == 0) & (i[:, :, 2] == 0)).all(-1)[[0,-1]].sum() 返回 0但对于测试图像,它应该是 1。
  • 打印 ((i[:, :, 0] == 0) & (i[:, :, 2] == 0)).all(-1)[:,[0, -1]].sum() 给出 IndexError: too many indices for array
  • @snowflake 如果您必须使用该格式,请跳过 .all() ,就像这样 - ((i[...,0]==0) & (i[...,2]==0))[:,[0,-1]].sum()。或遵循建议的两种方法。
猜你喜欢
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 2021-02-04
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
相关资源
最近更新 更多