【问题标题】:Comparing two similar images that contain text比较两个包含文本的相似图像
【发布时间】:2020-05-09 19:28:08
【问题描述】:

我有几对人眼看起来相同的图像,但如果您放大并检查细节 - 它们的像素不同 - 主要是由于不同的渲染。

我正在寻找一种可以判断两个图像是否相同的算法。使用常规的逐像素比较是行不通的,因为存在差异,例如不同的抗锯齿不同的字母间距(这会导致像素偏移)。

另一种可能的情况是,在一个图像中,文本可以是斜体/下划线,而在第二个图像中则不是。

假设是:

  • 两张图片的字体大小相同
  • 字体大小可小可大 - 从 8 像素到 30 像素
  • 图片大小相同

这里有 2 个包含相同文本的图像示例,呈现方式略有不同:

这是两个不同图像的示例:

任何帮助将不胜感激!

【问题讨论】:

标签: python computer-vision


【解决方案1】:

很高兴知道您正在运行此流程的目的。我的意思是,下面我建议可能使用 OCR;当然,如果您尝试构建自己的 OCR,我的建议将毫无意义(我预感到您可能正在尝试自动化某种浏览器呈现的 UI 接口)。

您可以通过预阈值或PSNR 计算来补偿不同的抗锯齿。这假设字母的位置完全相同。

如果间距不同(甚至更多,如果你有不同的kernings别名不同,那么我认为你最好的选择是OCR两个图像分别比较生成的文本;否则您将不得不分割每个文本行,然后在每个字母处重新对齐图像。基本上,您从图像 1 中获取一个垂直切片,宽度为 1 到 3 个像素;然后获取图像 2 上五个相同大小的不同切片的 PSNR 值,与从 -2 到 +2 的偏移量对齐(例如);最小 PSNR 将为您提供以下字母的偏移调整和匹配的可靠性。

问题在于,如果字母真的不同,您将不再能够可靠地计算图像偏移量,因此您将能够分辨出“HELLO”和“HILLS”是不同,但无法量化差异,因为您将失去同步并且无法比较两个 L。 除非您尝试使用更大的偏移量重新同步(从 -2 到 +X,其中 X 是较宽字母的宽度,可能是“W”),但这会很昂贵并且仍然容易出错(例如,如果比较“13”与字母“B”,或“LI”与“U”,“I.”与“L”等)。

【讨论】:

  • 感谢您的回答。我将其用作 OCR 的替代方法,我使用模板匹配代替(我也使用 OCR,但我更喜欢使用这两种方法),因为 OCR 对于小图像并不准确。
  • 我使用“切片 PSNR”方法对小文本进行 OCR(多年前,我致力于将 BURT 杂志的第一期数字化为可搜索的 PDF)。蛮力 C 解决方案是,一旦知道实际使用的字体,将每个“字符”与候选字符数组顺序进行比较。它运作良好,如果非常非常缓慢。我们添加了树、概率三元组等等。此外,我们开始对每个字母使用最后 N 个字母的平均值,因为它们出现在同一扫描图像中。最后,我们比 Tesseract 做得更好。如果你愿意,我可以添加故事:-)
猜你喜欢
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多