检测扫描文档中裁切标记的位置
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 上描述了这种方法。
【讨论】:
答案应该包含解决方案,而不仅仅是指向将来可能会丢失的博客的链接。尤其是当该博客文章只是指向另一个站点的链接时,讨论在之前的评论中提供给您的解决方案!以上是关于检测扫描文档中裁切标记的位置的主要内容,如果未能解决你的问题,请参考以下文章
我需要检测扫描图像中 QR 码的大致位置(PDF 转换为 PNG)