如何使用OpenCV计算某种颜色的像素?

时间:2019-01-03 09:02:54

标签: python opencv

我正在尝试计算图片中特定颜色范围内像素的百分比。

我一般来说对OpenCV和python还是陌生的。我所做的是使用cv2.inRange()函数创建一个掩码,该掩码作为输出。现在,我正在尝试使用介于(0,0,130)和(80,80,255)之间的GRB颜色值来执行此操作,并考虑将每个红色在此范围内的像素视为“红色”。所以我得到的输出有两种颜色:黑色和红色。 然后,我使用了这个numpy函数来获取非零像素的数量,这时我希望它是红色像素的数量:red_pixel = np.count_nonzero(output)

这是完整的代码:

import cv2 
import numpy as np

img_name = input("What's the name of the picture? ")


img = cv2.imread(img_name)

# boundaries for the color red
boundaries = [
    ([0, 0, 130], [80, 80, 255])
    ]

for(lower, upper) in boundaries:
    # creates numpy array from boundaries
    lower = np.array(lower, dtype = "uint8")
    upper = np.array(upper, dtype = "uint8")

    # finds colors in boundaries a applies a mask
    mask = cv2.inRange(img, lower, upper)
    output = cv2.bitwise_and(img, img, mask = mask)

    # saves the image
    cv2.imwrite('2'+img_name, output)

tot_pixel = output.size
red_pixel = np.count_nonzero(output)
percentage = round(red_pixel * 100 / tot_pixel, 2)

print("Red pixels: " + str(red_pixel))
print("Total pixels: " + str(tot_pixel))
print("Percentage of red pixels: " + str(percentage) + "%")

我用四张不同的图片测试了我的代码:

sea.jpg 我希望其中包含0%的红色。我运行程序,输出为全黑图像,百分比为0.00。很好。

然后我尝试了这个:

sample.jpg 我运行了程序,得到的百分比是13.76,我不知道它是否正确,但仍然可以。

我尝试了一个完全红色的图像,然后:total-red.jpg 我得到100.00是正确的。

当我尝试使用此图像时,发生了奇怪的事情: almost-red.png

我运行程序的结果是这样的输出: 2almost-red.png 这是我所期望的。但是非零像素的百分比为33.07% 我不知道为什么。

能否请您帮我弄清楚我做错了什么以及如何纠正该程序?非常感谢。

1 个答案:

答案 0 :(得分:1)

您的图片有三个频道。在您的第三个示例near-red.png中,只有一个通道在范围内。 因此,我们可以推断出最多33%的图像在范围内。由于存在一些边界,因此边界必须更少。 33.07%听起来很合理。

如果要检查每个像素的通道是否在范围内,则必须对三个通道求和,然后检查非零条目。