python - 在OpenCV中裁剪垂直轮廓,获取边框边界而不是区域

标签 python opencv

我正在尝试使用opencv在图像中提取表的列。我设法成功地确定了感兴趣的垂直区域,如下图所示:

我的问题是,当我尝试提取并保存那些感兴趣的区域时,我得到了边界矩形边框的6条垂直线,而不是它们之间的区域。
这是我用来实现此目的的代码:

import cv2
import numpy as np

image = cv2.imread('x.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,50))
vertical_mask = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=1)
 
cnts = cv2.findContours(vertical_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
for c in cnts:
    cv2.drawContours(image, [c], -1, (36,255,12), -1)

idx = 0
for c in cnts:
    x,y,w,h = cv2.boundingRect(c)

    idx+=1
    new_img=image[y:y+h,x:x+w]
    cv2.imwrite(str(idx) + '.png', new_img)

cv2.imshow("im.png",image)
cv2.waitKey(0)
cv2.destroyAllWindows()
关于如何解决这个问题有什么想法吗?
编辑:此2是最右边边框的图像,如您所见,其中有一些文本

最佳答案

您要绘制的边界框来自每一行,而不是来自各列。您应该做的是从某条线获取两个点,从其旁边的线获取其他两个点,并使用这4个点定义了作为列的矩形。
所有这些,当然假设它们是按坐标从左到右排序的。但是opencv不能保证我们以这种方式进行排序。
因此,首先对它们进行排序,然后在连续的两行上绘制矩形

关于python - 在OpenCV中裁剪垂直轮廓,获取边框边界而不是区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63042016/

相关文章:

python - 在 BeautifulSoup 中索引多个表

php - python中php的print_r()相当于什么?

python - 在 Python 中多次创建具有相同条目的列表的快速方法?

c++ - '=' token 之前声明中的 qualified-id

python - ROS Noetic (Ubuntu 20.04) - CV 桥不工作

python - 嵌套的 For 循环,无法在没有 Catch 22 的情况下存储迭代

Python - OpenCV - 裁剪图像和隔离特定对象

c - 支持 Ubuntu 的 ARM11 架构上的 OpenCV

opencv - Opencv 中的概率分类器

python - Firefox 没有收到 django csrf_token