4

我正在尝试分析两个轮廓并给出与它们的相似性相对应的百分比。假设我拥有描述这些轮廓的所有点坐标(就像 SVG 路径),我应该根据哪个因素告诉它们几乎相同?

经过一些谷歌搜索,我发现了一些与傅立叶描述符相关的东西,它们与我的案例相关吗?


编辑

我想做的是将几种字体与另一种字体进行比较。就像会做什么字体,但不是图像。由于产生的算法,可以根据相似度百分比找到等效的字体。

有些脚本只是比较每个字母的边界框,但这还不够。我需要一种方法来告诉 Arial 最接近 Verdana 而不是 Webdings。所以假设我可以从字体中提取轮廓,我需要一种方法来比较两个轮廓。

例如(使用“逻辑”百分比值):

字体对比,粗体 G 最接近

4

2 回答 2

1

解决一般问题(字体匹配)有两种基本方法:符号和统计。一个好的解决方案可能会以某种方式将两者结合起来。

符号方法以直接的方式使用您对问题的了解。例如,您可以列出您(作为一个聪明的人)将用来表征字体的事物。identifont使用的问题类型。这种方法意味着编写足够智能的例程来检测各种属性(例如笔划宽度、某些循环是否闭合、衬线的存在等),以及一个决策树(或“规则引擎”),用于放置是/否/不确定一起回答并得出一个答案。

统计方法听起来更像您的想法,并且可能是字体的工作原理。这里的想法是找到一些一般属性并将它们用作权重来找到“最佳”选择。例如,如果你有很多字体,那么你可以训练一个神经网络(输入是某个样本分辨率的像素)。在那里你不需要知道网络“如何”决定——只要有足够的训练数据,它就会找到这样做的方法。或者您可以只查看所有暗像素的总和 - 这可能会为您提供类似于上述百分比的结果。

这听起来很简单,但通常很难找到以您想要的所有方式很好地显示差异的简单统计测量。

所以两者之间有一个很大的中间地带。这个想法是,如果你能从第一组中汲取一些想法,那么你可以使第二组的方法更有效率。虽然最简单的神经网络方法是“一体式”(它包括计算和决策),但您可以将它们分开。因此,除了给网络提供一堆像素之外,您还可以给它更多“有意义”的输入——您知道的东西有助于在不同字体之间进行检测。诸如笔画宽度或字符中“孔”的数量之类的东西。您还可以添加一些智能来删除可能会混淆结果的内容 - 例如,预缩放到相同的高度(如果您有完整的字体集,那么您可以缩放所有内容,以便小写“m”的高度,比如说, 是常数)。

傅立叶描述符是表征事物“外部形状”的一种方式,因此可以用作我上面描述的统计方法的输入。在示例中,您给出的傅立叶描述符将拾取下部 G 中衬线的“尖峰”,因此表明它与左侧的 G 非常不同。但他们不太关心笔画宽度,根本不关心比例(放大/缩放)(这可能是好事也可能是坏事——如果你得到不同大小的随机字母,你不想对大小,但是如果您已经将整个字母表标准化为标准的“m”,那么您当然希望包含它)。

其他想法是二维互相关(归一化相关的最大值让您了解两个事物的相似程度)或简单地查看两个字母中共有的像素分数。

正如评论所说,这是一个巨大的问题(我不是专家 - 以上只是作为感兴趣的旁观者的随机废话)。

但是,要最终回答您的问题,如果您拥有的是大纲,那么傅立叶描述符将是一个不错的起点。因为这侧重于形状而不是“重量”,所以我会将其与轮廓包围的总面积相结合。然后编写一些代码来计算这些,看看你得到的一些示例字母的数字。如果它似乎可以区分某些字母,但不能区分其他字母,那么请寻找其他一些在这些情况下会有所帮助的测量值。你最终可能会结合相当多的方法来获得既快速又可靠的东西。

或者,如果您只是想要一些简单的东西,请尝试使用一些易于测量的值,例如高度、宽度、轮廓“内部”的像素总数、沿垂直或水平线交叉的笔划数等。结合一堆如果您对傅立叶变换等所涉及的数学不满意,那么这些可能会为您提供某些“足够好”的东西。

于 2012-06-04T23:36:44.427 回答
0

您是否考虑过使用基于神经网络的方法?本文使用自组织树图来执行基于内容的图像检索。通过良好的训练集,应该可以创建一个多层网络(或SOM),它可以为您提供准确的相似性度量。

于 2012-06-05T14:33:45.137 回答