【问题标题】:Detecting position of crop marks in a scanned document检测扫描文档中裁切标记的位置
【发布时间】:2014-06-04 11:27:50
【问题描述】:

我正在进行一个项目,其中用户向我们提供了表单的扫描副本,我们需要识别图像中的各个字段。

我有一个这样的表格:

表格在页面的四个角落有四个裁剪标记/注册标记。现在用户应该填写表格并返回他填写的表格的扫描副本。我们得到的扫描表格可能已经旋转了某个角度。例如看下面的旋转表格:

现在要从表单中提取确切的字段,即要在扫描的表单中提取任何特定字段,例如标题,我们需要有准确的坐标,但由于我们的图像已经旋转了未知的角度。我们无法这样做。

我阅读了有关注册标记及其将页面与标准表格对齐的用途。 我尝试在图像中搜索这些注册标记,但由于它是旋转的,我们可能无法在旋转图像中找到标记的位置。

我尝试搜索该问题并发现了一些关于 SO 的问题,虽然给出了一些方向但无济于事。

这个Question 给了我对LEADTools SDK 的参考,它有functions 来执行这个任务。不幸的是,这个 SDK 不适用于 JAVA,而且它是专有的而不是免费的。

是否还有其他用于相同目的的开源工具。

此外,我愿意接受有关用于对齐表单的其他方法的建议。

【问题讨论】:

标签: java image image-processing crop


【解决方案1】:

您可以使用文档角落中标记的坐标。使用线条角落的坐标,您可以测量纸张的旋转角度以进行补偿。

下面的帖子解决了类似的问题:
"Image Processing Edge Detection in Java"

下面是一种使用Java和Marvin检测坐标的方法。

输出(JPEG 压缩的一些噪声原因):

源代码:

import marvin.image.MarvinImage;
import marvin.io.MarvinImageIO;
import marvin.util.MarvinAttributes;
import static marvin.MarvinPluginCollection.*;

public class DocumentMarks {

public DocumentMarks(){

    MarvinImage image = MarvinImageIO.loadImage("./res/document.jpg");
    thresholding(image, 250);
    MarvinAttributes ret = moravec(image.clone(), image, 5, 100000);
    image = showCorners(image, ret, 4);
    MarvinImageIO.saveImage(image, "./res/document_out.jpg");
}

private static MarvinImage showCorners(MarvinImage image, MarvinAttributes attr, int rectSize){
    MarvinImage ret = image.clone();
    int[][] cornernessMap = (int[][]) attr.get("cornernessMap");
    int rsize=0;
    for(int x=0; x<cornernessMap.length; x++){
        for(int y=0; y<cornernessMap[0].length; y++){
            // Is it a corner?
            if(cornernessMap[x][y] > 0){
                rsize = Math.min(Math.min(Math.min(x, rectSize), Math.min(cornernessMap.length-x, rectSize)), Math.min(Math.min(y, rectSize), Math.min(cornernessMap[0].length-y, rectSize)));
                ret.fillRect(x, y, rsize, rsize, Color.red);
            }               
        }
    }

    return ret;
}

public static void main(String[] args) {
    new DocumentMarks();
    System.exit(0);
}
}

【讨论】:

  • 函数调用“moravec(image.clone(), image, 5, 100000)”,IDE说这是一个返回void的函数,那你是怎么用的呢?还有你为另一篇关于 SO 的帖子提供的链接,我运行了代码,花了 26 秒,它可以优化还是需要这么多时间?
  • 我在上面的代码中使用了 Marvin 1.5.1 版本。它是昨天发布的。使用该版本,我认为您可以毫无问题地使用 moravec。关于性能,我认为最简单的方法是将图像缩小到较小的分辨率,以保留形态特征,计算旋转并以原始分辨率执行其他任务。
【解决方案2】:

我已成功识别扫描文档中的裁剪标记。我已经在我的博客here 上描述了这种方法。

【讨论】:

  • 答案应该包含解决方案,而不仅仅是指向将来可能会丢失的博客的链接。尤其是当该博客文章只是指向另一个站点的链接时,讨论在之前的评论中提供给您的解决方案!
猜你喜欢
  • 2023-03-11
  • 2014-11-17
  • 2019-09-21
  • 2016-03-16
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多