Python自动字体识别

6 投票
3 回答
8967 浏览
提问于 2025-04-15 15:51

你可能听说过一个在线字体识别服务,叫做WhatTheFont。

我对这个工具背后的技术很感兴趣。我觉得可以把它分成两个部分来理解:

  1. 从各种格式的字体文件生成图片,关于字体文件的扩展名,可以参考这个链接:http://www.fileinfo.com/filetypes/font

  2. 将提交的图片与所有生成的图片进行比较。

如果你能分享一些建议或者用Python实现这两个步骤的代码,我会很感激。

3 个回答

3

这个问题有点旧了,所以我来给个更新版的回答。

你可以看看这篇论文 DeepFont: 从图片中识别你的字体。简单来说,它是一个经过大量图片训练的神经网络。这个技术在 这个视频中有商业展示。

不过,遗憾的是没有现成的代码可以用。不过,有一个独立的实现可以在 这里找到。你需要自己训练,因为没有提供权重,但代码非常容易理解。此外,这个实现只支持几种字体。

还有一个链接提供了数据集和生成更多数据的仓库。

希望这对你有帮助。

3

我不能提供Python代码,但这里有两种可能的方法。

  1. “特征字符”。在面部识别中,如果你有很多经过处理的面部图片,可以用一种叫做主成分分析(PCA)的方法来得到一组“特征脸”。当你把训练好的面孔放到这个特征空间里时,它们会显示出最大的差异。然后,你可以用测试面孔在特征脸空间中的“坐标”作为分类的特征向量。对于文本字符也是一样,比如不同版本的字母'A'。

  2. 动态时间规整(DTW)。这个技术有时用于手写字符识别。它的意思是,铅笔尖的移动轨迹(也就是在x和y方向上的变化)对于相似的字符是相似的。DTW可以消除同一个人写字时的一些变化。类似地,一个字符的轮廓也可以表示一个轨迹。这个轨迹就成为每种字体的特征向量。我想在字体识别中,DTW的部分可能不那么必要,因为字符是机器生成的,而不是人手写的。但它可能仍然有助于消除空间上的模糊。

5

根据提问者的说法,这里有两个部分(可能还有第三部分):

  1. 使用 PIL 来生成 字体的图片

  2. 使用一个图像分析工具包,比如 OpenCV(它可以和Python一起使用),来比较不同的形状。这里有很多标准的方法可以用来比较不同的物体,看看它们是否相似。例如,尺度不变矩的效果还不错,并且是OpenCV工具包的一部分。

  3. 在第二部分提到的大多数标准工具是为了寻找相似但不一定完全相同的形状,但在字体比较中,这可能不是你想要的,因为字体之间的差异可能非常细微。为了分析这些细微的细节,可以尝试比较每个字母周围轮廓路径的x和y轮廓,当然要适当地进行标准化。(这个方法,或者它的更复杂的数学变体,已经在字体分析中取得了不错的效果。)

撰写回答