从扫描的文档opencv python中提取行表

时间:2019-03-21 08:07:51

标签: python opencv hough-transform opencv-python

我想从扫描表中提取信息并将其存储为csv。现在,我的表提取算法执行以下步骤。

  1. 应用偏斜校正
  2. 应用高斯滤波器进行降噪。
  3. 使用Otsu阈值进行二值化
  4. 做一个形态学的开口。
  5. 发现小伙子
  6. 进行霍夫变换以获得表格行。
  7. 删除重复的行(相同的行在10像素范围内)
  8. 使用线的斜率过滤水平线和垂直线(水平线和垂直线的斜率应小于+/- 5度)。

此算法对于数字出生的pdf和大多数扫描的文档都可以正常工作。但是,有些文档的表很吵,因此无法正确识别行。

这是示例算法失败的示例图像。

raw image

这些是我正在此表上执行的操作。 1.高斯模糊

Gaussian blur

2。大津阈值

Otsu thresholding

3。形态学开放

Morphological opening

4.Canny边缘检测

Canny edge detection

5。过滤的行,如您所见,显然没有识别出行 正确地。

filtered lines,as you can see the lines are clearly not identified correctly.

任何人都可以建议从这种质量较低的扫描中提取水平线和垂直线的更好方法。

提前谢谢!

3 个答案:

答案 0 :(得分:1)

问题是,而且永远都是因为您没有完美的线条。 这种方法的一种解决方案可以是:

  • 将图像阈值设置为灰度级。
  • 现在找到图像中最大的轮廓,它将成为您的桌子。
  • 现在,通过在轮廓上选择任意点以创建泛洪蒙版,现在可以使用Floodfill将表格与图像分开

答案 1 :(得分:1)

我在此博客中找到了一个完美的解决方案。 https://medium.com/coinmonks/a-box-detection-algorithm-for-any-image-containing-boxes-756c15d7ed26

在这里,我们使用垂直核检测垂直线,水平核检测水平线,然后将它们组合以获得所有必需的线,进行形态转换。

垂直线 Vertical lines

水平线 Horizontal lines

必需的输出 required output

答案 2 :(得分:0)

问题可能出在 HoughLinesTransform()

您可以尝试使用: HoughLinesTransformP()

要使 HoughLinesTranform()正常工作,线条必须完美。从提供的图像中,您可以清楚地看到失真,这显然导致方法失败。

尝试先放大图片。 Image Dilation in Python.