【问题标题】:How to detect and remove guide lines from a scanned image/document efficiently?如何有效地检测和删除扫描图像/文档中的引导线?
【发布时间】:2011-03-07 03:45:07
【问题描述】:

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

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

Name*  : ______________________________
Age* : ______________________________

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

注意: 以下是进一步的条件:

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

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

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

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

虽然解决方案似乎有效。但是有一些问题,例如,

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

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

谢谢

【问题讨论】:

    标签: java c++ math image-processing image-segmentation


    【解决方案1】:

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

    不过,我还是想到了一个非常简单的启发式方法:

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

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

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

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

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

    【讨论】:

    • 谢谢埃拉扎。这个项目搁置了一段时间。同时通过一些图像处理和模式识别论文,我发现您的答案更接近“将是”实际解决方案,
    • @Favonius,谢谢!很高兴知道。如果您能在此处更新“官方”解决方案的链接,我会很高兴。
    猜你喜欢
    • 2014-11-17
    • 2023-03-11
    • 1970-01-01
    • 2021-09-08
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多