获取图像中特定颜色的像素数量。Python,opencv

3

我有一张小图像。 在这里输入图片描述 像素点是 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] - 白色。

我想计算具有该特定颜色的像素数量。我需要进一步比较具有不同数字的这些图像。这些正方形具有不同的背景,并且我考虑的是确切的白色。


1
欢迎来到 Stack Overflow!你尝试过什么?能给我们展示一些代码吗? - Hein Wessels
你的意思是要找到所有与坐标 [13,29] 上像素匹配的像素,还是要找到所有颜色为 (254,254,254) 的像素。我的意思是,如果坐标 [13,29] 上的像素是 (8,7,6),你想要寻找什么? - Mark Setchell
我想找到所有颜色为(254,254,254)的像素。不需要坐标,只需要数量,即这样的像素数目。 - Kirill
3个回答

11

我会使用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)

1
是的,我也正要建议沿着这个方向去做 :) - Dan Mašek
谢谢!使用np.count_nonzero的方法比循环更快。一个问题?axis=2是什么? - Kirill
我用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 - Mark Setchell
我进行了编辑,但不确定它去了哪里。我认为这是一个很好的答案,但想指出OpenCV代码使用BGR而不是RGB。谢谢。 - perfo

1
在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)

0

试试这个:

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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接