【发布时间】:2020-02-15 21:28:56
【问题描述】:
这是 problem 在不同方法下的延续。
我想摆脱盒子,以及它线之外的所有东西,并保持盒子内的任何东西,原样。或者至少只有盒子。
盒子:
做了一些魔术后我希望它看起来如何:
这是它被裁剪的地方:
如果您在黑色背景上查看第一张图片,您会注意到框框外仍有一条白色带。可以通过获取边界框的统计信息并在其中添加填充来将其裁剪得更小或更大。
这是天真的方法,也是我的第一个方法。这里的问题是:
- 它不能过多地考虑不同的线宽而不影响里面的字符。比如说,你输入 -9 作为填充。它在大约 9px 线宽的盒子上工作得很好,但超出了 ~9px 的任何东西都会留在里面。这会导致一些剩余像素,最终影响我的应用程序的准确性。
- 另一方面,任何线宽明显低于 9 的加框字段也可能会破坏其中的字符。
我的第二次尝试是带面具的removing the contour。然而,结果并没有像预期的那样。
提取轮廓的代码很长,所以假设stats包含从contours, _ = cv2.findContours返回的contours
# loop in each contour in stats
for i in range(len(stats)):
# get the stats of the bounding rectangle
x, y, w, h = cv2.boundingRect(stats[i])
# draw the field contour into the mask
cv2.drawContours(mask, [stats[i]], -1, 0, -1)
# remove the contour from the original image
section = cv2.bitwise_and(section, section, mask=mask)
# crop the boxed field
field = crop_by_origin(x, y, w, h, padding=p)
这是我得到的:
我不明白为什么它不起作用?也许是因为在网站上他的例子是在黑色背景上?也许它不适用于“透明”轮廓?这甚至可能吗?
如何解决这个问题?这里还有其他可能的解决方案吗?
更新
我用@nathancy 的回答尝试了另一张图片,结果如下:
结果:
我尝试过使用水平线内核,但没有达到预期效果,有没有办法让它更具动态性?
【问题讨论】:
标签: python image opencv image-processing computer-vision