【问题标题】:Get a quanity of pixels with specific color at image. Python, opencv获取图像中具有特定颜色的像素数量。蟒蛇,opencv
【发布时间】:2018-08-29 13:07:11
【问题描述】:

我的图片很小。 enter image description here b g r,不是灰色的。

original = cv2.imread('im/auto5.png')
print(original.shape)  # 27,30,3 
print(original[13,29]) # [254 254 254]

如您所见,我的图像中有白色图片(数字 14),大部分为黑色。在右上角(坐标 [13,29])我得到 [254 254 254] - 白色。

我想计算具有该特定颜色的像素数。我需要它来进一步比较这些图像与内部不同的数字。这些正方形有不同的背景,我认为完全是白色。

【问题讨论】:

  • 欢迎来到 Stack Overflow!你试过什么?你能给我们看一些代码吗?
  • 您的意思是要查找与坐标[13,29] 处的像素匹配的所有像素,还是要查找(254,254,254) 处的所有像素。我的意思是,如果[13,29] 处的像素是(8,7,6),你想查找什么?
  • 我想找到所有 (254,254,254) 的像素。不是坐标,只有数量,这些像素的数量。

标签: python opencv


【解决方案1】:

我会使用 numpy 来做到这一点,它是矢量化的,比使用 for 循环要快得多:

#!/usr/local/bin/python3
import numpy as np
from PIL import Image

# Open image and make into numpy array
im=np.array(Image.open("p.png").convert('RGB'))

# Work out what we are looking for
sought = [254,254,254]

# Find all pixels where the 3 RGB values match "sought", and count them
result = np.count_nonzero(np.all(im==sought,axis=2))
print(result)

样本输出

35

它与 OpenCV 的 imread() 一样工作:

#!/usr/local/bin/python3
import numpy as np
import cv2

# Open image and make into numpy array
im=cv2.imread('p.png')

# Work out what we are looking for
sought = [254,254,254]

# Find all pixels where the 3 NoTE ** BGR not RGB  values match "sought", and count
result = np.count_nonzero(np.all(im==sought,axis=2))
print(result)

【讨论】:

  • 是的,正要提出一些类似的建议:)
  • 谢谢!使用 np.count_nonzero 的方式比使用循环更快。一个问题?什么是轴=2?
  • 我将numpy 方式的时间设置为 22 微秒,而等效的 for 循环时间为 1.5 毫秒,因此速度提高了 68 倍。 axis=1 沿着图像的高度上下运行,axis=2 从左到右穿过图像,axis=3 沿着 R、G 和 B 运行进入图像。所以,说np.all(im==sought,axis=2)我的意思是R,G和B都等于sought
  • 我进行了编辑,但不确定它去了哪里。我认为这是一个很好的答案,但想指出 OpenCV 代码使用 BGR 而不是 RGB。谢谢
【解决方案2】:

cv2 中的图像是一个可迭代对象。因此,您可以遍历所有像素来计算您要查找的像素。

import os
import cv2
main_dir = os.path.split(os.path.abspath(__file__))[0]
file_name = 'im/auto5.png'
color_to_seek = (254, 254, 254)

original = cv2.imread(os.path.join(main_dir, file_name))

amount = 0
for x in range(original.shape[0]):
    for y in range(original.shape[1]):
        b, g, r = original[x, y]
        if (b, g, r) == color_to_seek:
            amount += 1

print(amount)

【讨论】:

    【解决方案3】:

    试试这个:

    import cv2
    import numpy as np
    img = cv2.imread("im/auto5.png")
    color = [48,75,105] # set color to looking for
    im = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    result = np.count_nonzero(np.all(im==color,axis=2))
    print("Total pixels " + str(result))
    

    【讨论】:

      猜你喜欢
      • 2020-03-26
      • 2018-10-05
      • 2015-03-29
      • 1970-01-01
      • 2018-05-10
      • 2015-05-04
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多