如何使用OpenCV识别空矩形

时间:2018-12-10 15:31:04

标签: python opencv

问题陈述:

我必须确定图像中的哪个框为空以及图像中的哪个框已填充(此处数字和颜色表示该框已填充) https://photos.app.goo.gl/FpaShWVL1RV7z1Gt8

应用查找轮廓后(外部) 我将外面的21个盒子分开了

https://photos.app.goo.gl/12DGPy3iAYgPUMZ39

从图像中分离出框后

https://photos.app.goo.gl/NQVmA5pAWufSReVD8

现在的问题是如何识别哪个盒子是空的以及哪个盒子是填充的。

谢谢。

3 个答案:

答案 0 :(得分:0)

我建议您使用erode()函数来断开任何接触外边界的数字。然后,您可以使用findcontours()标志运行RETR_TREE以获取子轮廓。您可以消除外边界,因为它将具有最大的面积。如果轮廓更多,则说明该框已填充。

This link用于形态学操作将帮助您腐蚀。

答案 1 :(得分:0)

如果您想知道一个盒子是否为空...您首先需要在二进制文件中定义'empty'。我的意思是:这对您意味着什么,以及如何将其翻译成计算机语言?基本上,我的想法是:您可能需要定义RGB颜色的范围(例如白色),如果说99%的像素在该范围内,则图像为空的可能性非常高。

您还可以取图像中颜色的平均值,并设置标准差的阈值,如果该阈值通过(或不通过),将触发一个矩形(或不通过)。唯一的限制是您的想象力,但是您在程序中定义的内容。

答案 2 :(得分:0)

如果您在问题中共享代码,这将非常有帮助,因为我们可以对其进行修改以回答您的问题。

无论如何,通过我从问题中获得的大量信息,我发现您已经使用findContour完成了大部分工作。要将空框与填充框分开,请使用函数countNonZero

您可以将每个矩形送入函数,它将返回输入中的总非零像素。由于白色区域被认为是空的,因此较高的分数将对应于一个空的矩形。您可以通过将countZero结果除以方框面积来归一化结果,以得到0〜1的结果。这将使阈值削减的决定更加简单。

这是示例代码:

x,y,w,h = contour_box[i]
total_white = cv2.countNonZero(img_Src[y:y+h,x:x+w])
ratio = total_white / float(w*h)

# if the white pixel count is 80% of box size, box is empty
if ratio > 0.8 :
     box_is_empty = True