我在计算图片中某个颜色范围内像素的百分比。
我对OpenCV和Python总体来说还是个新手。我所做的是使用cv2.inRange()
函数创建一个掩码,并将其作为输出。现在我尝试使用GRB颜色值在(0,0,130)和(80,80,255)之间,并将颜色在此范围内的每个像素视为“红色”。所以我得到的输出有两种颜色:黑色和红色。然后我使用这个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。这很好。
我试过这个:
我运行这个程序,得到的百分比是13.76,我不知道它是否正确,但可能仍然是。
我尝试了一个完全红色的图像:total-red.jpg和我得到100.00是正确的。
奇怪的事情发生了,当我尝试用这个图像:almost-red.png的
我运行程序得到的是这样的输出:2almost-red.png这是我所期望的。非零像素的百分比虽然是33.07%,我不知道为什么。
你能帮我找出我做错了什么,我怎么能纠正程序?非常感谢您的光临。
1条答案
按热度按时间nzk0hqpo1#
您的图像有三个通道。在第三个示例almost-red.png中,只有一个通道在范围内。因此,我们可以推断,最多33%的图像在范围内。因为有一些边界,它必须更少。33.07%听起来很合理。
如果要检查每个像素的任何通道是否在范围内,则必须对三个通道求和,然后检查非零条目。