如何在不丢失任何内容的情况下检测所有矩形框python opencv - python

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

图片:

我的代码:

#!/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)  

输出:

如何在不丢失任何内容的情况下检测所有矩形框python opencv - python

参考方案

这是使用阈值+形态运算的简单方法。

  • 获取二进制图像。 加载图像,转换为灰度,然后自适应阈值
  • 填充矩形轮廓。 查找轮廓并填充轮廓以创建填充的矩形块。
  • 执行变形打开。 我们创建一个矩形结构元素并对其进行变形以删除
  • 绘制矩形。 查找轮廓并绘制边界矩形。
  • 这是可视化的每个步骤:

    使用此屏幕快照图像(由于提供的图像的矩形太靠近边框,因此包含更多边框)。您可以在输入图像上添加边框,而不是通过屏幕截图获取更多边框区域。看看add border to image

    二进制图像

    填充矩形轮廓

    变形打开

    结果

    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()
    

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

    python opencv-斑点检测或圆形检测 - python

    我在检测圆形区域时遇到问题。我使用来自opencv的HoughCircles函数进行了尝试。但是,即使图像非常相似,该功能的参数也必须不同才能检测到卷。我尝试的另一种方法是遍历每个像素,并检查当前像素是否为白色。如果是这种情况,请检查该区域中是否有斑点对象(到斑点中心的距离小于阈值)。如果存在,则将像素附加到斑点,如果没有,则创建一个新的斑点。这也不能正常工…

    如何仅从图像中提取外部轮廓(OpenCV) - python

    我正在尝试使用简单的OpenCV轮廓线方法从下面的图像中提取数字,但是轮廓上出现重叠的边框cv2.RETR_EXTERNAL应该仅返回层次结构中的外部轮廓,但是从下面的输出可以看出,它不起作用码:from matplotlib import pyplot as plt import cv2 img = cv2.imread('image.png&#…

    Python:图像处理可产生皱纹纸效果 - python

    也许很难描述我的问题。我正在寻找Python中的算法,以在带有某些文本的白色图像上创建皱纹纸效果。我的第一个尝试是在带有文字的图像上添加一些真实的皱纹纸图像(具有透明度)。看起来不错,但副作用是文本没有真正起皱。所以我正在寻找更好的解决方案,有什么想法吗?谢谢 参考方案 除了使用透明性之外,假设您有两张相同尺寸的图像,一张在皱纹纸上明亮,一张在白色背景上有深…

    用圆和线计算变换 - python

    我试图确定两个图像之间的转换(旋转+平移+缩放),以使其移动。图像是用两种不同的方式拍摄的,这些方式会产生非常不同的纹理。所以我不能使用基于维持光流的技术。我认为最好将图像阈值化以提取几何形状(请参见下面的示例)。但是然后我很难看到我能做些什么...也许可以提取垂直线和中心圆来帮助我提取变换。我在python中工作,我研究了Opencv可以提供的功能,但目前…

    OpenCV 2.4 VideoCapture在Windows上不起作用 - python

    我正在使用Python绑定到通过以下instructions安装的OpenCV 2.4。我的问题类似于this one,但是我需要Windows计算机解决方案。问题:当我尝试使用时cap = cv2.VideoCapture(0) print cap.grab() 它工作正常,但是以下代码cap = cv2.VideoCapture(filename) pr…