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

Nav*_*r J 3 python opencv image image-processing contour

我正在尝试从关系数据库中检测所有矩形。但是我的脚本没有检测到一些盒子。请帮我做到这一点。谢谢你。

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

我的代码:

#!/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)  
Run Code Online (Sandbox Code Playgroud)

输出:

我的输出

nat*_*ncy 5

这是使用阈值+形态学操作的简单方法。

  1. 获取二值图像。加载图像,转换为灰度,然后自适应阈值

  2. 填充矩形轮廓。查找轮廓并填充轮廓以创建填充的矩形块。

  3. 执行变形打开。我们创建一个矩形结构元素并打开变形以移除线条

  4. 绘制矩形。查找轮廓并绘制边界矩形。


这是可视化的每个步骤:

使用此截图图像(包含更多边框,因为提供的图像的矩形太靠近边框)。您可以为输入图像添加边框而不是截图以获得更多边框区域。看看给图像添加边框

二进制图像

填充矩形轮廓

变形打开

结果


代码

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()
Run Code Online (Sandbox Code Playgroud)

注意:根据图像,您可能需要修改内核大小。例如,它可能需要从增加内核(5, 5)的说(11, 11)。此外,您可以在执行时增加或减少迭代次数cv2.morphologyEx()。增加或减少内核大小时需要权衡,因为您可能会删除更多或更少的行。同样,这一切都取决于输入图像。