2011-09-24 21 views
8

私は2つのベクトル画像(例えばSVG)を比較し、どれくらい近いかを見たいと思います。 基本的には、ラスタイメージをベクトル形式に変換するトレースアルゴリズムの正確性をテストしたいと考えています。2つのベクトル画像を比較する

私はこのアルゴリズムをテストするために考えています方法です:いくつかのベクトル画像-Take

- ベクター画像をpngにラスタライズします。

- 上記のpng to tracingアルゴリズムを実行しました。オリジナルのものと(SVG)でプログラムをトレースの出力-compare

私が(ImageMagickの中)RMSEのようなラスタイメージのためのいくつかのmetricesがある知っている一方でベクトル形式のためのいくつかの標準的なmetricesがある場合は、私が慣れていませんよ。 私は、円弧、線、曲線などのいくつかの単純なものを考えることができます。しかし、これらは幾何学と色のずれを検出することはできません。誰かが、この問題に対する優れた標準メトリックやその他のアプローチを提案することができますか?

答えて

4

私は、このための標準的なメトリックを認識していないが、私は私が役に立つことを願ってポインタを持っています。

バティックプロジェクトは、SVGドキュメントのそのレンダリングが参照画像のセットから過度に発散しないことをテストするためのツールのセットを使用しています。私の理解は、それは本質的にSVGをラスタライズし、2つの画像のピクセルベースの差分を実行して、それらがどのように異なるかを見ることです。アンチエイリアスの微妙な違いなど、避けがたい違いを見逃すほど十分にスマートでなければなりません。

あなたはそれで(特にSVGRenderingAccuracyTestセクション)についての詳細を読むことができます:http://jpfop.sourceforge.net/jaxml-batik/html-docs/test.html

もちろん、あなたがラスターの比較ではなく、ベクトル比較をやっているだろうことを意味し、こと。あなたのケースでのベクトル比較は、完全に異なる曲線が非常に似たレンダリングを生成する可能性があるため、恐らく難しいでしょう。さらに、入力が別のものの後ろに隠れている形状を持っている可能性があり、出力がそれが何であるかを推測することが不可能になります。したがって、ピクセル完全な等価レンダリングを生成する可能性があるにもかかわらず、出力は完全に間違っているように見えることになります。

もしベクトル比較を実行したいのであれば(おそらくデータはこれをより実行可能にするように制約されます)、最も簡単なのは両方のSVGを正規化して(すべての図形をパスに変換し、すべてのメタデータを取り除き、それらの値を正規化し、パスデータを常に正規化して同じフォームなどを使用するようにします)。これを2つの目的のために使用します。まず、正規化されたツリー構造内の差分を調べます。それはすでにあなたにいくつかの有用な情報を与えるはずです。第二に、勇気があると感じたら、個々の曲線の差の表面を測定します。私は後者に着手することについて二度考えていますが、それはあなたに多くの偽のネガティブを与える可能性が高いからです。

+0

FYI、図面の「隠れた部分」を気にする理由の1つ:一部のレーザーカッターは、入力形式としてSVDを使用しています。ストロークはカットを表し、塗りつぶしは彫刻可能です(または無視されます)。後で彫刻されるカットはまだ重要です(ただし、通常は物事を整理して内側の図形が最初にカットされ、通常はカットを彫刻しないようにすることは公正なことですが)。 「カット」は、実際には完全にカットされない難民の力にある) – Stripes

関連する問題