使用OpenCV在Python中计算图像中黑色像素的数量

13

我有以下Python测试代码,用于读取、阈值化和显示图像:

import cv2
import numpy as np 
from matplotlib import pyplot as plt

# read image
img = cv2.imread('slice-309.png',0)
ret,thresh = cv2.threshold(img,0,230, cv2.THRESH_BINARY)
height, width = img.shape
print "height and width : ",height, width
size = img.size
print "size of the image in number of pixels", size 

# plot the binary image
imgplot = plt.imshow(img, 'gray')
plt.show()

我想要计算图像中某个标签的像素数,例如黑色像素。我该怎么做?我查看了OpenCV的教程,但没有找到帮助 :-(

谢谢!

2个回答

23
对于黑色图像,您需要计算像素总数(行*列),然后从使用cv2.countNonZero(mat)得到的结果中减去它。
对于其他值,您可以使用cv2.inRange()创建掩码以返回显示所需颜色/标签/值的所有位置的二进制掩码,然后使用cv2.countNonZero计算它们的数量。
更新(根据Miki的评论):
当尝试找到具有特定值的元素的计数时,Python允许您跳过cv2.inRange()调用,直接执行:
cv2.countNonZero(img == scalar_value)  

非常感谢!我尝试了一下,事实上在使用cv2时,我必须使用countNonZero而不是CountNonZero与cv。另一个问题:当我执行cv2.countNonZero(thresh)时,我得到的是像素的总数,而不是不是黑色的像素数...你知道为什么吗? - Aurélie JEAN
我更新了我的回答,函数名不应该大写。看起来你的所有像素都不是黑色的...试着看一下thresh,它可能不是你想象中的那样。如果这行不通,就在这个问题上标记你喜欢的答案以显示已解决,并提出另一个问题展示你的代码。把那个问题的链接放在这里,我会更多地帮助你。 - Rick Smith
很抱歉,它现在可以工作了!再次感谢您的帮助!!!您是正确的,我的阈值在我的函数中没有定义好... - Aurélie JEAN
3
好的回答。在Python中,是否有这个C++代码的等效写法:countNonZero(img == scalar_value); - Miki

3
import cv2
image = cv2.imread("pathtoimg", 0)
count = cv2.countNonZero(image)
print(count)

6
欢迎来到 StackOverflow,感谢您的回答!请更新您的答案,添加一些非代码文本来描述这如何解决当前问题。 - Szymon Maszke

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