检测扫描文档中的空白页面

时间:2011-03-09 12:29:10

标签: algorithm image-processing

因此,我们需要检测由扫描仪创建的图像是否代表空白页面。在图像处理方面,我已经超出了我的深度,所以我必须由社区来管理它。

这是我到目前为止所提出的:

  • 空页可以是明显的白色,灰色再生纸或泛黄的旧纸。目前的想法是为页面创建直方图,寻找曲线的急剧增加,并获得比这更暗的像素百分比。如果超过阈值,页面可能不为空。

  • 由于这可能会将包含顶部单行文本的页面分类为空,我们会平铺页面并收集有关每个图块的统计信息。

  • 我们需要从绑定中检测扫描的订书机和孔(可能只在某些图块中),但这可以推迟到稍后阶段。但是,如果你知道除了这两个之外还要注意什么,请在评论中提及。

  • 这需要很快。它是文档处理工作流程的一部分,每天处理(数十万)页面。如果处理页面的时间要长十秒,那么我们的客户将不得不告诉他们的客户他们将需要等待几天才能获得结果。 (如果这导致更多的误报,一些客户宁愿让某人检查几十个“空”页面,而不是让他们的客户再等一天。)

所以这是我的问题:

  1. 采取这条路线是不是一个好主意,还是有更好的东西?

  2. 如果我们这样做,我该怎么做?找到页面阈值的好(便宜)算法是什么?我们可以通过为一批文件假设一个类似的门槛来获得显着的速度吗?在记录之前,亮度值可以精确到哪个精度值?我们可以期待什么怪癖?

8 个答案:

答案 0 :(得分:2)

如果您知道扫描的页面将完全填满图像,那么计算标准偏差可能是一种很好的方法。

我建议稍微模糊页面以减少噪音。然后计算页面的SD,理论上,一个页面或多或少都是一个颜色将具有低SD,一个具有大量文本将具有更高的SD。然后,这是一个“训练”系统的情况,当页面是普通的,当它是文本时。您可能会发现某些页面难以辨别。

你可以通过让它处理大量的页面来训练它,并且它会全部通过它们,你会说它是否是普通的。

修改

好吧,一个带有黑色文字的白页,如果我们只有页面而没有周围的东西,将会有一个平均颜色为灰色,可能是一个相当浅的灰色。获得平均值是遍历所有像素的for循环,添加它们的值然后除以像素数。我对这个o(logN)的东西并不擅长,但足以说,它不会那么久。除非你有巨大的图像。

SD是循环的第二个,这次我们计算每个像素与均值的差异,然后除以均值。这将比平均值花费更长的时间,因为我们必须做类似

的事情
diff = thispixel - mean;
if(diff < 0) {
    diff = -diff;
}
runningTotal += diff;

对于纯色页面,每个像素将接近平均值,因此我们的SD将会很低。如果SD低于某个值,我们可以假设这意味着页面都是一种颜色。

如果它们的文本数量非常少,则可能会出现问题,因为它不会对SD产生很大影响,因此可能就像您在问题中建议的那样,将页面分成几部分。我建议水平条带,因为文本倾向于这样。如果我们一次一个地执行其中一个条带,一旦一个条带表明它有文本,我们可以停止,因为我们不关心其余部分是否为空白。

模糊页面有助于降低噪音,因为噪音的奇数像素会降低其影响,从而为您提供“更严格”的SD。您也可以使用它来降低图像的分辨率。

假设你的酱油图像是300宽900高,你可以用9,3 * 3的块采样像素,最终得到100宽300高的图像,所以它实际上可以用来减少你需要做的计算量,在这种情况下是第九个!

主要问题在于只用普通页面来计算SD的高度。也许让它找到一堆空白页面的SD。

通过它的声音,你可能想要有一个让人不确定的中间立场,并要求人为干预,可能让人类的价值训练系统变得更好?

答案 1 :(得分:2)

执行某种简单的edge detection。如果构成边缘的像素数低于某个阈值,那么页面空的概率很高。这可以通过将对应于高确定性(通过形状和位置)的某些边缘分类为打孔和钉书钉来进行分类,并将其与度量标准进行折扣来改进。

答案 2 :(得分:2)

答案 3 :(得分:2)

我的fall class做了很多图像处理项目。 这是我会尝试的:

  1. 从彩色到灰度的项目
  2. 将所有像素倒入一个简单的直方图中,例如100个桶,介于0和1之间
  3. 在直方图中找到局部最小值,使above - below的绝对值尽可能小,其中above是较亮像素的数量,below是较暗的数量像素
  4. 强制above像素为白色,below像素为黑色
  5. 如果您愿意,可以remove black edges
  6. 作为额外步骤
  7. 如果几乎​​没有黑色像素,则页面为空白
  8. 前两个步骤应该结合起来,它们是唯一耗时的步骤;在600dpi图像上,您可能需要触摸数百万像素。其余的将是闪电般的。如果你不能每秒对多个图像进行分类,我会非常惊讶 - 特别是如果你知道没有黑边。

    唯一需要培训或实验的部分是最后一步。您也可能需要在直方图中调整桶的数量;如果存在太多桶,则可能是局部最小值。

    祝你好运,并向我们报告你是如何做出来的!

答案 4 :(得分:1)

查看此线路检测算法:http://homepages.inf.ed.ac.uk/rbf/HIPR2/linedet.htm。除了详细解释算法如何工作之外,还有demo,您可以使用自己的图像查看结果。我尝试了两张图片:1)B&W scan of a receipt,2)B&W, "blank" back side of that same receipt。我试过的所有边缘检测算法都在“空白”页面上找到了边缘。但是,这种线检测算法是唯一能够在首页上正确找到线条但在“空白”背页上找不到任何内容的算法。

答案 5 :(得分:0)

看起来您正试图将公司的所有文书工作转换为数字文档。本文的一些内容可能非常陈旧。

说你的文字是黑色的,任何其他颜色都是背景。如果你取两个加权平均值,一个由你认为的文本组成,一个由背景组成,你可以比较这两个加权平均值,看看它们是否足够远,可以考虑进一步评估。这将消除纸张的任何不均匀老化。

纸张上的钉孔和打孔尺寸非常标准,但如果您在白色背景上扫描,它们会显示为灰色或根本不显示。如果没有,那么您可以猜测它们的位置并将其删除。

现在,我们来看看高兴趣的区域,黑色像素最密集的区域。选择一部分并对其进行OCR。将起始左上角放置在最接近文本开始的区域。在典型文档中,从左到右的另一个实心空白线性区域和从上到下的另一个表示段落的顶部和左侧。你可以确定你有一行文字,因为在一行文字下面是另一个空白的从左到右的区域。因此,您无需担心选择将文本切成两半的部分。

答案 6 :(得分:0)

您可以获取扫描图像的每几行的平均灰度(整数)(取决于分辨率和捕获一行文本所需的行数),然后考虑行平均值的扩展。如果页面上没有文本,则平均值的扩散应该很小(即背景范围为250-255),如果整页或部分页面上有文本,则扩散会大得多(即15为文本,250为背景)。

在我看来,由于需要检查大量页面,解决方案应该在计算上很简单。需要进一步处理(边缘检测,过滤等)的方法看起来有点矫枉过正,并且需要更长时间才能运行。

不需要逐个像素地处理,使用矩阵将有助于提高效率,例如使用Numpy,您可以更高效地同时计算整个行,列或矩阵的均值,求和等。也没有必要处理每个像素,一个好的行样本应该能够以相似的精度完成任务。 8位精度应该没问题,你甚至可以在运行这个处理算法之前重新采样到大像素。

答案 7 :(得分:0)

您可以执行noisy trim,即模糊图像并进行自动修剪(不实际修改图像)。如果修剪结果的宽度或高度低于阈值(例如600 dpi图像为80到100),则页面为空。

使用ImageMagick command line front-end的概念证明:

$ convert scan.png -shave 300x0 -virtual-pixel White -blur 0x15 -fuzz 15% \
    -trim info:

以上命令假定600 dpi DIN A4黑白(1位)图像。它还忽略了300像素的边距,这样穿孔等工件不会产生false negatives