检测扫描文档中裁切标记的位置

Posted

技术标签:

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

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

我有一个这样的表格:

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

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

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

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

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

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

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

【问题讨论】:

docs.opencv.org/doc/tutorials/imgproc/histograms/… 是一个很好的起点,您甚至可以利用裁剪标记相对位置的先验知识。 @AndersR.Bystrup 模板匹配在图像旋转或缩放时无法正常工作。对吗? 【参考方案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 上描述了这种方法。

【讨论】:

答案应该包含解决方案,而不仅仅是指向将来可能会丢失的博客的链接。尤其是当该博客文章只是指向另一个站点的链接时,讨论在之前的评论中提供给您的解决方案!

以上是关于检测扫描文档中裁切标记的位置的主要内容,如果未能解决你的问题,请参考以下文章

iOS 实时检测来自相机的一些标记

我需要检测扫描图像中 QR 码的大致位置(PDF 转换为 PNG)

如何检测 TIFF 图像中的多个条码/二维码并返回它们的值 + 位置?

检测位置的“蓝牙扫描”是不是打开

怎样用ARCGIS裁切地图

如何从 Google Maps android 中的当前位置不断检测附近的标记位置?