2011-09-24 20 views
8

Quiero comparar dos imágenes vectoriales (digamos SVG) y ver qué tan cerca están. Básicamente, quiero probar la corrección de un algoritmo de rastreo que convierte imágenes raster a formato vectorial.comparando dos imágenes vectoriales

La forma en que estoy pensando en poner a prueba este algoritmo es:

-Tome algunas imágenes vectoriales.

-Rasterice la imagen vectorial a png.

-Funciona el png anterior al algoritmo de seguimiento.

-Compare la salida del programa de rastreo (que es SVG) con el original.

Aunque sé que hay algunas etiquetas para imágenes ráster como RMSE (en imagemagick), no estoy familiarizado si hay algunas mediciones estándar para formatos de vectores. Puedo pensar en algunos simples como el número de arcos, líneas, curvas, etc. Pero estos no pueden detectar la desviación en geometría y colores. ¿Podría alguien sugerir una buena métrica estándar o algún otro enfoque para este problema?

Respuesta

4

No conozco las métricas estándar para esto, pero tengo un puntero que espero sea útil.

El proyecto Batik utiliza un conjunto de herramientas para probar que su representación de documentos SVG no difiere excesivamente de un conjunto de imágenes de referencia. Tengo entendido que esencialmente rasteriza el SVG y realiza una diferencia basada en píxeles de las dos imágenes para ver cómo difieren. Debe ser lo suficientemente inteligente como para pasar por alto diferencias inevitables que pueden provenir, por ejemplo, de diferencias sutiles en antialiasing.

Puede leer más sobre esto (especialmente la sección de Examen de precisión de SVGRendering) en: http://jpfop.sourceforge.net/jaxml-batik/html-docs/test.html.

Eso, por supuesto, significa que harás comparaciones de trama y no comparaciones de vectores. Las comparaciones de vectores en su caso serán diabólicamente difíciles porque las curvas completamente diferentes pueden producir una representación extremadamente similar, algo que supongo que está bien. Además, la entrada puede tener una forma oculta detrás de otra, por lo que es imposible que la salida adivine qué es. Por lo tanto, la salida terminará mostrándose como completamente errónea, aunque pueda producir una representación equivalente de píxel perfecto.

Sin embargo, si desea realizar comparaciones vectoriales (quizás sus datos estén restringidos de manera que esto sea más viable) lo más simple puede ser primero normalizar ambas SVG (convertir todas las formas en rutas, eliminar todos los metadatos, aplicar herencia de todas las propiedades y normalizar sus valores, normalizar los datos de ruta para usar siempre la misma forma, etc.) y usar esto para dos propósitos: primero, mirar las diferencias en la estructura de árbol normalizada. Eso ya debería darle alguna información útil. Segundo, si te sientes valiente, mide la superficie de la diferencia entre las curvas individuales. Sin embargo, lo pensaría dos veces antes de embarcarme en este último, porque es probable que te dé muchos falsos negativos.

+0

FYI, una razón para preocuparse por las partes "ocultas" de un dibujo: algunos cortadores láser usan SVD como formato de entrada. Los trazos representan cortes, los rellenos pueden ser grabados (o ignorados). Un corte que luego se grabó sigue siendo importante (aunque para ser justos, normalmente se deben ordenar las cosas para que las formas internas se corten primero, y normalmente no se graba sobre los cortes ... pero puede suceder, especialmente si el "Cortes" están en un poder de refugiados que en realidad no se abre por completo) – Stripes