【问题标题】:how to find all pixel values ​from a certain range如何查找某个范围内的所有像素值
【发布时间】:2023-04-02 20:28:02
【问题描述】:

我有一个具有多种颜色的 rgb 图像。我事先知道颜色(像素值)。我想在我的图像上找到某些颜色的数量。 我可以一次只做一种颜色:

color1 = [63, 51, 30]
count1 = (np.count_nonzero(np.all(MyImage == color1, axis=2)

但是如果我想找到许多不同的颜色,我怎么能找到像素总和,并且不要使用这样的东西:

color2 = [14, 24, 145]
count2 = (np.count_nonzero(np.all(MyImage == color2, axis=2)
color3 = [13, 190, 25]
count3 = (np.count_nonzero(np.all(MyImage == color3, axis=2)
color4 = [156, 31, 19]
count4 = (np.count_nonzero(np.all(MyImage == color4, axis=2)
sumofpixels = count1 + count2...+ countn

【问题讨论】:

  • 你可以循环计数,但这里没有捷径。
  • (np.count_nonzero(np.all(MyImage == color1, axis=2) 甚至不是有效的代码,关闭括号可能不会计算出你所期望的......
  • @TimRoberts 好的 numpy 编程恰恰是寻找向量化的快捷方式,而不是尽可能使用本机 python 循环,所以我不会快速回答没有这样的方法,除非你确信你没有什么可学的关于 numpy...
  • 请分享您的图片和典型的颜色列表 - 确保两者都非常代表您想要做的事情。可能有更快的方法来实现您想要的。

标签: python numpy opencv


【解决方案1】:

我想这就是你想要的?

colors = np.array([
    [63, 51, 30],
    [14, 24, 145],
    [13, 190, 25],
    [156, 31, 19],
    ])

image = np.ones((100,100,3)) * colors[3] # create test image with colors[3]
image[0,0] = colors[0] # add 1 pixel with colors[0]
image[1,:] = colors[1] # 1 row with colors[1], i.e. 100 pixels
image[10:20] = colors[2] # 10 rows with colors[2], i.e. 1000 pixels
# 8899 pixels remaining with colors[3]

counts = np.all(image[None] == colors[:,None,None], axis=3).sum(axis=(1,2))
# array([   1,  100, 1000, 8899])

解释:None 为形状(1,100,100,3)(4,1,1,3) 创建新轴,因此== 将轻松广播。然后检查所有颜色通道 (axis=3) 匹配的位置,然后对图像尺寸 (axis=(1,2)) 求和,最终得到每种颜色的总数。

【讨论】:

    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多