我正在尝试使用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/