从扫描文档中提取内衬 table opencv python
Extract lined table from scanned document opencv python
我想从扫描的 table 中提取信息并将其存储为 csv。现在我的 table 提取算法执行以下步骤。
- 应用倾斜校正
- 应用高斯滤波器进行降噪。
- 使用 Otsu 阈值进行二值化
- 进行形态学开运算。
- Canny egde检测
- 进行霍夫变换以获得 table.
行
- 删除重复行(10个像素范围内的相同行)
- 使用线的斜率过滤水平线和垂直线(对于水平线和垂直线的法线,斜率应小于 +/-5 度)。
此算法适用于数字生成的 pdf 和大多数扫描文档。但是,有些文档有噪音 table,因此无法正确识别行。
这是我的算法失败的示例图像。
这些是我在这个table上做的操作。
1.Gaussian模糊
2.Otsu 阈值
3.Morphological开盘
4.Canny边缘检测
5.filtered 行,如您所见,这些行显然未被识别
正确。
任何人都可以提出更好的方法来从这种质量较低的扫描中提取水平线和垂直线。
提前致谢!!
问题可能在 HoughLinesTransform()
您可以尝试使用:HoughLinesTransformP()
要使 HoughLinesTranform() 完美运行,线条必须完美。从您提供的图像中,您可以清楚地看到明显导致该方法失败的失真。
先尝试放大图像。 Image Dilation in Python.
问题是而且永远是你没有完美的台词。
这种方法的一种解决方案可以是:
- 像您所做的那样将图像阈值化为灰度。
- 现在找到图像中最大的轮廓,这将是你的table。
- 现在使用 Floodfill 将 table 从图像中分离出来,方法是选择轮廓上的任意点来创建淹没蒙版,
我在这个博客中找到了一个完美的解决方案。 https://medium.com/coinmonks/a-box-detection-algorithm-for-any-image-containing-boxes-756c15d7ed26
在这里,我们正在使用垂直内核检测垂直线和水平内核检测水平线进行形态学转换,然后将它们组合以获得所有需要的线。
竖线
水平线
需要输出
我想从扫描的 table 中提取信息并将其存储为 csv。现在我的 table 提取算法执行以下步骤。
- 应用倾斜校正
- 应用高斯滤波器进行降噪。
- 使用 Otsu 阈值进行二值化
- 进行形态学开运算。
- Canny egde检测
- 进行霍夫变换以获得 table. 行
- 删除重复行(10个像素范围内的相同行)
- 使用线的斜率过滤水平线和垂直线(对于水平线和垂直线的法线,斜率应小于 +/-5 度)。
此算法适用于数字生成的 pdf 和大多数扫描文档。但是,有些文档有噪音 table,因此无法正确识别行。
这是我的算法失败的示例图像。
这些是我在这个table上做的操作。 1.Gaussian模糊
2.Otsu 阈值
3.Morphological开盘
4.Canny边缘检测
5.filtered 行,如您所见,这些行显然未被识别 正确。
任何人都可以提出更好的方法来从这种质量较低的扫描中提取水平线和垂直线。
提前致谢!!
问题可能在 HoughLinesTransform()
您可以尝试使用:HoughLinesTransformP()
要使 HoughLinesTranform() 完美运行,线条必须完美。从您提供的图像中,您可以清楚地看到明显导致该方法失败的失真。
先尝试放大图像。 Image Dilation in Python.
问题是而且永远是你没有完美的台词。 这种方法的一种解决方案可以是:
- 像您所做的那样将图像阈值化为灰度。
- 现在找到图像中最大的轮廓,这将是你的table。
- 现在使用 Floodfill 将 table 从图像中分离出来,方法是选择轮廓上的任意点来创建淹没蒙版,
我在这个博客中找到了一个完美的解决方案。 https://medium.com/coinmonks/a-box-detection-algorithm-for-any-image-containing-boxes-756c15d7ed26
在这里,我们正在使用垂直内核检测垂直线和水平内核检测水平线进行形态学转换,然后将它们组合以获得所有需要的线。
竖线
水平线
需要输出