如何从扫描的文档图像中检测文本块

数据挖掘 机器学习 计算机视觉 卷积 opencv 图像预处理
2021-09-24 09:38:35

原图:

在此处输入图像描述

目标:

在此处输入图像描述

我想通过在文本上放置边界框将文本分成单独的段落(如上所示)。

我尝试通过使用 opencv 的传统计算机视觉方法来做到这一点。

  1. 我绘制了字符级边界框
  2. 接下来,我对图像进行灰度化、二值化。
  3. 应用膨胀
  4. 最后将 bbox 放在扩张后的图像上。

这就是我得到的:

在此处输入图像描述

> #Morphological Transformation

kernel = np.ones((3,4),np.int8)

dilation = cv2.dilate(im_bw, kernel)

cv2.imwrite('dilated.png', dilation)

绘制矩形框

ret,thresh = cv2.threshold(im_bw, 127,255,0)
image, contours,hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE )

for c in contours:
    rect = cv2.boundingRect(c)
    if rect[2] < 50 or rect[3] < 50 : continue

    print (cv2.contourArea(c))
    x,y,w,h = rect
    cv2.rectangle(im_new,(x,y),(x+w,y+h),(0,255,0),2)

cv2.imwrite('sample_res_inner.jpg',im_new)

由于图像是扫描图像加上它们之间的行间距很小,我无法根据段落对它们进行分割。

我怎样才能得到我想要的结果?

2个回答

有两种选择:

  1. 以更高的 DPI 扫描图像。这应该强调段落之间的垂直分隔。
  2. 训练场景中文本检测的深度学习模型。示例:https ://github.com/qjadud1994/CRNN-Keras和https://github.com/mvoelk/ssd_detectors

您是否研究过 Tesseract(及其 Python 包装器/接口:pytesseract)?我不保证它会完全解决您的问题,但它提供边界框和 OCR 功能。

这个Tesseract 站点上,它列出了您可以使用的可能的页面分割模式。

还有这个页面提供了一些质量改进建议。

Stack Overflow 上有很多关于特定用例的问题/答案。例如,此答案中,建议使用 OSM 模式来检测多个列。

还有这个 SO answer提供了一种将文本分成段落的方法。