gpt4 book ai didi

algorithm - 如何比较两个轮廓? (字体比较)

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:02:10 25 4
gpt4 key购买 nike

我试着分析两个轮廓并给出它们相似性的百分比。假设我有描述这些轮廓的所有点坐标(就像SVG路径一样),基于哪个因素我应该告诉它们几乎相同?
在google搜索之后,我发现了一些与fourier描述符相关的东西,它们与我的案例相关吗?
编辑
我想做的是比较几个字体和另一个字体。就像What the font一样,但不能用图像。由于生成的算法,可以根据相似度百分比找到一个字体等价物。
有些脚本只是比较每个字母的边界框,但这还不够。我需要一种方法来告诉你,比起Webdings,arial离Verdana最近。所以假设我可以从字体中提取轮廓,我需要一种方法来比较两个轮廓。
例如(使用“逻辑”百分比值):

最佳答案

解决一般问题(字体匹配)有两种基本方法:符号法和统计法。一个好的解决方案可能会以某种方式将两者结合起来。
符号方法直接利用你对问题的知识。例如,你可以列出你(作为一个聪明人)用来描述字体的东西。identifont使用的问题。这种方法意味着编写足够聪明的例程来检测各种属性(例如,笔划宽度、是否有某些循环被关闭、存在SerIFS等)以及一个决策树(或“规则引擎”),它们将“是”/“不”/“不确定”的答案放在一起并给出答案。
统计方法听起来更像你在想什么,而且可能就是字体的工作原理。这里的想法是找到一些一般属性,并使用这些属性作为权重来找到“最佳”选择。例如,如果你有很多字体,那么你可以训练一个神经网络(以某种样本分辨率输入像素)。在这里,你不需要知道网络是如何决定的——只要有足够的训练数据,它就会找到这样做的方法。或者你可以看看所有暗像素的总和-这可能会给你的结果类似于你上面的百分比。
这听起来很简单,但通常很难找到简单的统计测量结果,这些测量结果能很好地显示出你想要的所有方面的差异。
所以在两者之间有一个很大的中间地带。这个想法是,如果你能从第一组中吸收一些想法,那么你就可以使第二组中的方法更有效率。虽然最简单的神经网络方法是“一体式”(包括计算和决策),但你可以把它们分开。因此,你可以给网络更多的“有意义”的输入,而不是仅仅给网络一堆像素,你知道的东西有助于检测不同字体之间的差异。例如笔划宽度,或字符中的“洞”数。您还可以添加一些智能来删除可能会混淆结果的内容—例如,预缩放到相同的高度(如果您有完整的字体集,则可以缩放所有内容,以便小写“m”的高度不变)。
fourier描述子是一种描述事物“外部形状”的方法,因此可以用作上面描述的统计方法的输入。在这个例子中,fourier描述子将提取下g中衬线的“spikiness”,因此表明它与左边的g非常不同。但他们对笔划宽度的关注要少得多,而对比例(放大/缩放)一点都不关心(这可能是一件好事,也可能是坏事——如果给你的是不同大小的随机字母,你不想对大小敏感,但如果你已经将整个字母表的标准“m”标准化,那么你肯定想包括它)。由于输出只是一个频谱,你可以通过互相关来比较不同的字母,比如用pca来分类不同类型的字母。
其他的想法是2D互相关(标准化相关的最大值让你了解两个事物是如何相似的)或者简单地看到两个字母中哪一部分的像素是共同的。
正如评论所说,这是一个巨大的问题(我不是专家——以上只是一个感兴趣的旁观者的胡说八道)。
但是,要最终回答你的问题,如果你有一个大纲,那么傅立叶描述子将是一个很好的开始。因为它关注的是形状而不是“重量”,所以我会把它和轮廓所包围的总面积结合起来。然后写一些代码来计算这些,看看你得到了什么数字,例如字母表。如果它似乎能区分一些字母,而不是其他字母,那么就寻找一些在这些情况下有帮助的其他测量方法。你可能最终会结合很多方法来获得既快又可靠的东西。
或者,如果你只想要简单的东西,试着使用一些容易测量的值,比如高度,宽度,轮廓内的像素总数,你沿垂直线或水平线交叉的笔划数等等。结合这些可以让你得到一些“足够好”的东西来达到某些目的,如果你对傅里叶变换等所涉及的数学不满意的话。

关于algorithm - 如何比较两个轮廓? (字体比较),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10884943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com