我正在尝试分析两个轮廓并给出与其相似性相对应的百分比。假设我有所有点的坐标描述这些轮廓(就像一个SVG路径),根据我应该告诉它们几乎相同的因素?
经过一些Google搜索后,我发现了与傅里叶描述符相关的内容,它们与我的案例相关吗?
我想要做的是将几种字体与另一种字体进行比较。就像What the font一样,但不是图像。由于生成的算法,可以根据相似百分比找到等效的字体。
有些脚本只是比较每个字母的边界框,但这还不够。我需要一种方法来告诉Arial最接近Verdana而不是Webdings。因此,假设我可以从字体中提取轮廓,我需要一种方法来比较两个轮廓。
例如(具有“逻辑”百分比值):
答案 0 :(得分:1)
有两种基本方法可以解决一般问题(字体匹配):符号和统计。一个好的解决方案可能会以某种方式结合起来。
符号方法以直接的方式使用您对问题的了解。例如,您可以列出您(作为智能人类)用于表征字体的事物。 identifont使用的问题类型。这种方法意味着编写足够聪明的例程来检测各种属性(例如笔画宽度,某些循环是否关闭,衬线是否存在等)加上决策树(或“规则引擎”),它将是/否/不确定一起回答并得出答案。
统计方法听起来更像你的想法,可能是字体的工作原理。这里的想法是找到一些一般属性,并使用它们作为权重来找到“最佳”选择。例如,如果你有很多字体,那么你可以训练一个神经网络(输入是一些样本分辨率的像素)。在那里你不需要知道网络决定“如何” - 只要有足够的训练数据,它就会找到一种方法。或者你可以只查看所有暗像素的总和 - 这可能会给你类似于上述百分比的结果。
这听起来很简单,但通常不容易找到简单的统计测量结果,这些测量结果可以很好地显示出你想要的各种方式。
所以两者之间有一个很大的中间地带。我们的想法是,如果你可以从第一组中提取一些想法,那么你可以在第二组中提高方法效率。而最简单的神经网络方法是“一体化”(包括计算和决策),你可以将它们分开。因此,不仅仅给网络一堆像素,你可以给它更多“有意义”的输入 - 你知道的东西有助于检测不同的字体。笔画宽度或角色中“洞”的数量。你还可以添加一些智能来删除可能会混淆结果的东西 - 例如,预缩放到相同的高度(如果你有一个完整的字体集,那么你可以扩展所有的东西,以便小写的高度为“m”,比如说,是不变的。
傅立叶描述符是表征某事物的“外部形状”的一种方式,因此可以用作统计方法的输入,如上所述。在示例中,您给出的傅里叶描述符将获得较低G中的衬线的“尖锐”,因此表明它与左侧的G非常不同。但是他们更关心笔画宽度而不关心音阶(放大/缩放)(这可能是好事还是坏事 - 如果给你不同大小的随机字母,你不想对它敏感大小,但如果你已经标准化为整个字母表的标准“m”,那么你当然希望包括那个)。由于输出只是一个频谱,你可以通过使用PCA之类的互相关来比较不同的字母,以对不同类型的字母进行分类。
其他想法是2d互相关(标准化相关的最大值可以让你知道两件事情有多相似),或者只是看到两个字母中的像素分数是多少。
正如评论所说,这是一个很大的问题(我不是专家 - 以上只是作为一个感兴趣的旁观者随意废话)。
但是,为了最终回答你的问题,如果你有一个大纲,那么一个傅立叶描述符将是一个很好的起点。因为它专注于形状而不是“重量”,所以我会将其与轮廓所包围的总面积相结合。然后编写一些代码来计算这些代码并查看一些示例字母表中的数字。如果它似乎区分了一些字母,而不是其他字母,那么请寻找一些其他有助于这些情况的测量。你最终可能会结合很多方法来获得既快速又可靠的东西。
或者,如果您只是想要简单的东西,请尝试使用一些易于测量的值,如高度,宽度,轮廓“内部”的总像素数,沿垂直或水平线交叉的笔划数等。如果你对傅里叶变换所涉及的数学不满意,那么其中一些可以为某些目的提供“足够好”的东西。
答案 1 :(得分:0)