2

对于我的项目,我正在为扫描文档编写一个图像预处理库。截至目前,我坚持使用线路删除功能。

问题描述:样本扫描表格:

Name*  : ______________________________
Age* : ______________________________

Email-ID: |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|

注: 以下是附加条件:

  • 扫描的文档可能包含更多的垂直和水平引导线。
  • 线条粗细可能超过1px
  • 文档本身打印不正确,可能会出现墨水膨胀或厚度不均等形式的噪音
  • 文档可能有彩色背景或线条

现在我要做的是检测这些行并删除它们。在这样做的同时,手写内容不应丢失。

解决方案:当前的解决方案是用 Java 实现的。

通过使用 canny/sobel 边缘检测器和阈值滤波器的组合检测这些线(使图像双色调)。从上一个动作中,我得到了一个黑白像素阵列。遍历数组并检查该像素的亮度是否低于指定的 bin 值。如果我发现 30 个(以像素为单位的最小线长)这样的像素,我会删除它们。我对垂直线重复相同的操作,但考虑到由于水平线的去除会造成切割。

尽管该解决方案似乎有效。但是也有问题,比如

  • 去除重叠字符
  • 如果图像中的字符间距不正确,则它也被视为一条线。
  • 边缘检测的输出图像是黑白的。
  • 有点慢。2480*3508 的图像通常需要 40 秒左右。

请指导如何正确有效地进行操作。如果有开源库,请直接指导。

谢谢

4

1 回答 1

1

首先,我想提一下,我对一般的图像处理一无所知,尤其是对 OCR。

尽管如此,我还是想到了一个非常简单的启发式方法:

  1. 将图像中的像素分离为连通分量。
  2. 对于每个连接的组件,使用以下一种或多种启发式方法确定它是否是一条线:
    1. 它比平均字母长度更长吗?
    2. 它是否出现在其他字母附近?(去除墨水膨胀或伪影)。
    3. 它的X梯度和Y梯度够大吗?这可以确保这个连接的组件不仅仅包含水平线。

我能看到的唯一问题是,如果有人在水平线上写字母,像这样:

   /\     ___
  /  \   /   \
  |__|   |___/
 -|--|---|---|------------------
  |  |    \__/

在这种情况下,这条线将保留,但无论如何你必须处理这种情况。

正如我所提到的,我绝不是图像处理专家,但有时非常简单的技巧也能奏效。

于 2010-06-29T13:50:34.387 回答