0

我猜算法应该由 followig stemps 组成(示例位于底部):

  1. 信息区域检测(文字、图像)。
  2. 寻找最接近顶部位置的邮票张贴而不与元素区域重叠,这在第一步已经检测到(这一步可以用蒙特卡洛方法实现)。

我也有以下关于文本和图像区域检测的想法:

  1. 使用 tesseract 或其他 OCR。这种方法的缺点是某些页面元素(线条、图片等)无法被检测到。文本识别也是这项任务的开销。
  2. 使用 OpenCV 或其他计算机视觉库(但我不知道具体如何)。

有没有人可以建议更多更好的方法、算法或库来找到文档上的最佳印章位置。

邮戳样本

4

2 回答 2

2

假设你知道邮票的大小,我会继续一个天真的但强大的解决方案。

假设文档为 1000*1000 像素,印章为 200*100。为文档创建金字塔(例如,将 4 个金字塔向下采样到 500*500、250*250、125*125、67*67)。对于最小的金字塔(比原始图像小 16 倍),当你找到这样的位置时,搜索一个 12*6 大小的空矩形,在金字塔中向上检查是否可以。

这不是最有效的解决方案,但由于金字塔,它会运行得非常快。

我认为 OCR 对于此类问题来说是一种过度杀伤力。

于 2012-12-12T19:35:26.937 回答
1

您不需要或不需要 OCR。

假设原始图像中的白色像素的值为 0,黑色的值为 1,灰度阴影具有中间值(如果不是这种情况,则只需根据需要重新缩放和/或否定图像),“理想”的解决方案是:

  • 设置最佳 = 无穷大
  • 对于图章图像的每个可能的左上角位置 (x, y):
    • 设置 s = 0
    • 对于戳记中的每个非白色(或“非透明”)像素 (i, j):
      • s += PagePixel(x+i, y+j) (或像素值的其他函数,见下文)
    • 如果 s 低于 best,我们找到了更好的位置:
      • 将 best 设置为 s,将 bestX 设置为 x,将 bestY 设置为 y

之后,(bestX, bestY) 将是覆盖暗像素的最低总“权重”的标记的位置。您可能更喜欢使用平方像素值或其他一些函数,以更加重视避免非常暗的像素。

因为上述过程需要的时间与页面中的像素数乘以图章中的非白色像素数成正比,所以它可能会很慢(在任何现代 CPU 上它仍然只需要几分之一秒)。在这种情况下,按照OopsUser的建议对两个图像进行二次采样是有意义的。

于 2012-12-13T07:51:40.567 回答