如下在我们拿到二值化的图像之后,想要计算红框内黑白像素在该区域的占比。注意单通道的图像无法出现黑白以外的颜色。
上图为我们拿到的红色区域二值化之后的图像。我们通过遍历该区域所有像素来判断。若值为255则白色加一,值为0则黑色像素加一。二值化后,只有黑白两色,因此很好判断。
python的opencv代码:
import cv2 import numpy as np img=cv2.imread('Resources/tom.jpg') #缩放 rows,cols,channels = img.shape img=cv2.resize(img,None,fx=0.5,fy=0.5) rows,cols,channels = img.shape #转换hsv hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) lower_blue=np.array([78,43,46]) upper_blue=np.array([124,255,255]) mask = cv2.inRange(hsv, lower_blue, upper_blue) #这一步裁剪指定区域图片。 s = mask[30:200, 50:250] #y,x #起始x,y坐标,终止x,y坐标,而非加上宽和高 # 和之前用到的cv2.boundingRect()函数定位法不同 cv2.rectangle(img,(50,30),(250,200),(0,0,255),3) cv2.imshow('res',img) cv2.imshow('ss',s) #注意这里s已经是单通道,此时不返回通道值。 x,y= s.shape bk = 0 wt = 0 #遍历二值图,为0则bk+1,否则wt+1 for i in range(x): for j in range(y): if s[i,j]==0: bk+=1 else: wt+=1 rate1 = wt/(x*y) rate2 = bk/(x*y) #round()第二个值为保留几位有效小数。 print("白色占比:", round(rate1*100,2),'%') print("黑色占比:", round(rate2*100,2),'%') cv2.waitKey(0)运行结果: 第一个图为计算区域,可以看到黑白占比相加为100%。 我发布的另一篇文章识别答题卡里,我曾提到另一个检测选项是否被填涂的方法——计算轮廓内黑白像素的比值,然后给出阈值过滤筛选。这次就给出了计算方法,感兴趣的可以自行替换一试。 可以直接拿二值图来测试,前半部分二值化的操作可以跳过。 **原文链接: opencv计算指定区域黑白像素占比** 对python爬虫和opencv系列感兴趣的可以关注一下⬇⬇⬇欢迎大家来交流呀~ 微信公众号:滑稽研究所