问题陈述:
我必须确定图像中的哪个框为空以及图像中的哪个框已填充(此处数字和颜色表示该框已填充) https://photos.app.goo.gl/FpaShWVL1RV7z1Gt8
应用查找轮廓后(外部) 我将外面的21个盒子分开了
https://photos.app.goo.gl/12DGPy3iAYgPUMZ39
从图像中分离出框后
https://photos.app.goo.gl/NQVmA5pAWufSReVD8
现在的问题是如何识别哪个盒子是空的以及哪个盒子是填充的。
谢谢。
答案 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