如何使用OpenCV识别空矩形

2024-05-16 09:11:34 发布

您现在位置:Python中文网/ 问答频道 /正文

问题陈述:

我必须确定图像中的哪个框是空的,哪个框是填充的(这里的数字和颜色表示框是填充的) https://photos.app.goo.gl/FpaShWVL1RV7z1Gt8

应用“查找轮廓”(外部)后 我已经把外面的21个箱子分开了

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

把盒子和图像分开后

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

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

提前谢谢。在


Tags: https图像app颜色数字盒子轮廓goo
3条回答

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

总之,根据我从您的问题中得到的大量信息,我发现您已经使用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

我建议您使用erode()函数来断开任何与外部边界接触的数字。然后可以使用RETR_TREE标志运行findcontours()以获得子轮廓。您可以消除外部边界,因为它的面积最大。如果你有更多的轮廓,那么你就知道盒子是满的。在

形态操作的This link将有助于防止腐蚀。在

如果你想知道盒子是不是空的。。。首先需要在二进制中定义“empty”。我的意思是:它对你意味着什么?它是如何翻译成计算机语言的?基本上,我想的是:你可能需要定义一个RGB颜色的范围(比如白色),如果你99%的像素都在这个范围内,那么图像为空的概率相当高。在

您还可以取图像中颜色的平均值,并为标准偏差设置一个阈值,如果通过或不通过,将触发一个空矩形或非矩形。但你要做的只是你想象中的极限。在

相关问题 更多 >