gpt4 book ai didi

java - 如何有效地检测和删除扫描图像/文档中的引导线?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:37 27 4
gpt4 key购买 nike

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

问题描述:示例扫描表单:

Name*  : ______________________________
Age* : ______________________________

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

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

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

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

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

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

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

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

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

谢谢

最佳答案

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

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

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

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

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

在那种情况下,该行将保留,但无论如何您都必须处理这种情况。

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

关于java - 如何有效地检测和删除扫描图像/文档中的引导线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3099039/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com