python - 比较两个包含文本的相似图像
问题描述
我有几对人眼看起来相同的图像,但如果你放大并检查细节 - 它们的像素不同 - 主要是由于不同的渲染。
我正在寻找一种可以判断两个图像是否相同的算法。使用常规的逐像素比较是行不通的,因为存在差异,例如不同的抗锯齿或不同的字母间距(这会导致像素偏移)。
另一种可能的情况是,在一个图像中,文本可以是斜体/下划线,而在第二个图像中则不是。
假设是:
- 两张图片的字体大小相同
- 字体大小可小可大 - 从 8px 到 30px
- 图像具有相同的大小
以下是 2 个包含相同文本的图像示例,呈现方式略有不同:
这是两个不同图像的示例:
任何帮助将不胜感激!
解决方案
很高兴知道您正在运行此过程的目的。我的意思是,下面我建议可能使用 OCR;当然,如果您尝试构建自己的 OCR,我的建议将毫无意义(我预感到您可能正在尝试自动化某种浏览器呈现的 UI 接口)。
您可以通过预阈值或PSNR计算来补偿不同的抗锯齿。这假设字母的位置完全相同。
如果间距不同(甚至更多,如果您有不同的字距)并且锯齿不同,那么我认为您最好的选择是分别对两个图像进行 OCR 并比较生成的文本;否则您将不得不分割每个文本行,然后在每个字母处重新对齐图像。基本上,您从图像 1 中获取一个垂直切片,宽度为 1 到 3 个像素;然后获取图像 2 上五个相同大小的不同切片的 PSNR 值,与从 -2 到 +2 的偏移量对齐(比如说);最小 PSNR 将为您提供以下字母的偏移调整和匹配的可靠性。
问题是,如果字母真的不同,您将不再能够可靠地计算图像偏移量,因此您将能够分辨出“HELLO”和“HILLS”不同,但无法量化差异,因为您将失去同步并且无法比较两个 L。除非您尝试使用更大的偏移量重新同步(从 -2 到 +X,其中 X 是较宽字母的宽度,可能是“W”),但这会很昂贵并且仍然容易出错(例如,如果比较“ 13”与字母“B”,或“LI”与“U”,“I.”与“L”等)。
推荐阅读
- reactjs - 如何使用功能性反应组件有条件地更新状态
- javascript - 将文件从 HTML 表单上传到 Google Drive,并将 url 保存到 google sheet
- excel - 用于网页抓取的 VBA
- python - Pyspark 中的 Groupby 和标准化值
- javascript - 如何从 Mapbox 中的地图实例访问控制实例
- swift - Swift 中的数据处理
- mysql - 在 asp.net core 中查询
- ansible - 从 ansible 输出中过滤一个键值
- c# - 将 SQLServer 转换为 Linq 查询
- c - == 在 C 中的确切含义