简体   繁体   English

如何检测所有矩形框python opencv而不会遗漏任何东西

[英]How to detect all rectangular boxes python opencv without missing anything

I'm trying to detect all the rectangles from the relational database.我正在尝试从关系数据库中检测所有矩形。 But some of the boxes are not being detected by my script.但是我的脚本没有检测到一些盒子。 Please help me to do that.请帮我做到这一点。 Thank you.谢谢你。

The Image:图片:这是我想要检测的图像。

My Code:我的代码:

#!/usr/bin/python
import cv2
import numpy as np

im = cv2.imread("table.png")

image = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(image,0,255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

edge = cv2.Canny(thresh,30,200)
cont = cv2.findContours(edge,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[0]

for j,i in enumerate(cont):
   x,y,w,h = cv2.boundingRect(i)

   if (w*h>900):
     cv2.drawContours(image,[i],0,(0,0,255),3)

cv2.imshow("Image",image)

cv2.waitKey(0)  

OUTPUT:输出:

我的输出

Here's an simple approach using thresholding + morphological operations.这是使用阈值+形态学操作的简单方法。

  1. Obtain binary image.获取二值图像。 Load image, convert to grayscale, then adaptive threshold加载图像,转换为灰度,然后自适应阈值

  2. Fill rectangular contours.填充矩形轮廓。 Find contours and fill the contours to create filled rectangular blocks.查找轮廓并填充轮廓以创建填充的矩形块。

  3. Perform morph open.执行变形打开。 We create a rectangular structuring element and morph open to remove the lines我们创建一个矩形结构元素并打开变形以移除线条

  4. Draw rectangle.绘制矩形。 Find contours and draw bounding rectangles.查找轮廓并绘制边界矩形。


Here's each step visualized:这是可视化的每个步骤:

Using this screenshotted image (contains more border since the provided image has the rectangles too close to the border).使用此截图图像(包含更多边框,因为提供的图像的矩形太靠近边框)。 You could add a border to the input image instead of screenshotting for more border area.您可以为输入图像添加边框,而不是截图以获得更多边框区域。 Take a look at add border to image看看给图像添加边框

Binary image二进制图像

Filled rectangular contours填充矩形轮廓

Morph open变形打开

Result结果


Code代码

import cv2

# Load iamge, grayscale, adaptive threshold
image = cv2.imread('1.png')
result = image.copy()
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,51,9)

# Fill rectangular contours
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(thresh, [c], -1, (255,255,255), -1)

# Morph open
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=4)

# Draw rectangles
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 3)

cv2.imshow('thresh', thresh)
cv2.imshow('opening', opening)
cv2.imshow('image', image)
cv2.waitKey()

Note: Depending on the image, you may have to modify the kernel size.注意:根据图像,您可能需要修改内核大小。 For instance, it may be necessary to increase the kernel from (5, 5) to say (11, 11) .例如,可能需要将内核从(5, 5)增加到(11, 11) In addition, you could increase or decrease the number of iterations when performing cv2.morphologyEx() .此外,您可以在执行cv2.morphologyEx()时增加或减少迭代次数。 There is a trade-off when increasing or decreasing the kernel size as you may remove more or less of the lines.增加或减少内核大小时需要进行权衡,因为您可能会删除更多或更少的行。 Again, it all varies depending on the input image.同样,这一切都取决于输入图像。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM