比较两个矢量图像

17
我想比较两个向量图像(比如SVG),看它们有多接近。基本上,我想测试一个将栅格图像转换为向量格式的描迹算法的正确性。
我考虑测试这个算法的方法是:
- 取一些矢量图像。 - 将矢量图像光栅化为PNG。 - 将上述PNG提供给描迹算法。 - 将描迹程序的输出(即SVG)与原始输出进行比较。
虽然我知道有一些用于栅格图像的度量标准,比如RMSE(在imagemagick中),但我不知道是否有一些用于矢量格式的标准度量标准。我可以想到一些简单的指标,比如弧线、直线和曲线的数量等。但这些指标不能检测几何形状和颜色上的偏差。请问是否有好的标准指标或者其他解决方案?
1个回答

7
我不知道这方面的标准指标,但我有一个希望能有所帮助的指针。
Batik项目使用一组工具来测试其SVG文档渲染与一组参考图像之间的差异。我的理解是它基本上将SVG光栅化并执行基于像素的两个图像之间的差异来查看它们的差异。它应该足够聪明,以忽略可能源于抗锯齿等微妙差异的不可避免的差异。
你可以在此阅读更多内容(尤其是SVGRenderingAccuracyTest部分): http://jpfop.sourceforge.net/jaxml-batik/html-docs/test.html
当然,这意味着您将进行栅格比较而不是矢量比较。在您的情况下,矢量比较将非常困难,因为完全不同的曲线可能会产生极其相似的渲染——我认为这是可以接受的。此外,输入可能具有隐藏在另一个形状后面的形状,使得输出不可能猜测它是什么。因此,即使它可能产生像素完美的等效渲染,输出最终仍将显示为完全错误。

然而,如果您确实希望执行向量比较(也许您的数据受到某种限制,使得这更可行),最简单的方法可能是首先对两个SVG进行归一化处理(将所有形状转换为路径,消除所有元数据,应用所有属性的继承并规范化其值,规范化路径数据以始终使用相同的形式等),并将其用于两个目的:首先,查看规范化树结构中的差异。那应该已经给您一些有用的信息了。其次,如果您感觉勇敢,可以测量单个曲线之间的差异表面。不过我会三思而后行,因为它很可能会给您带来很多假阴性结果。


FYI,关注绘图的“隐藏”部分的一个原因是:一些激光切割机使用SVD作为输入格式。笔画代表切割,填充可以是雕刻(或忽略)。稍后被雕刻的切割仍然很重要(尽管公平地说,通常希望按照内部形状先切割,而且通常不会在切割上进行雕刻...但这可能会发生,特别是如果“切割”处于难民电源,实际上并没有完全切割)。 - Stripes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接