¿Convertir la imagen BMP a un conjunto de instrucciones para un trazador?

Tengo un trazador como este: Dispositivo PloterXY.

La tarea que tengo que implementar es la conversión de 24 bits BMP a un conjunto de instrucciones para este trazador. En el trazador puedo cambiar 16 colores comunes. La primera complejidad a la que me enfrento es la reducción de colores. La segunda complejidad a la que me enfrento es cómo transformar los píxeles en un conjunto de instrucciones de dibujo.

Como cepillo de herramienta de dibujo con pintura al óleo será utilizado. Significa que las líneas de trazado del trazador no serán tan pequeñas y serán relativamente cortas.

Sugiera algoritmos que puedan usarse para resolver este problema de conversión de datos de imagen.

Algunos resultados iniciales:

Flor 1 - reducción de colores.

Flor 2 - reducción de colores.

Flor 3 - reducción de colores.

Dithering

Bueno, tengo algo de tiempo para esto hoy, así que aquí el resultado. No proporcionaste la paleta de colores de tu plotter, así que la extraje de tus imágenes resultantes pero puedes usar cualquiera. La idea detrás del difuminado es simple: nuestra percepción integra el color en el área, no en los píxeles individuales, por lo que debe usar un acumulador de diferencia de color de lo que se representa y lo que debe representarse en su lugar y agregarlo al siguiente píxel …

De esta forma, el área tiene aproximadamente el mismo color, pero solo se usa una cantidad discreta de colores en real. La forma de cómo actualizar esta información puede diferenciar el difuminado de bifurcación de resultados en muchos métodos. El simple sencillo es esto:

  1. restablecer el acumulador de color a cero
  2. procesar todos los píxeles
    1. para cada pixel agrega su color al acumulador
    2. encuentra la coincidencia más cercana del resultado en tu paleta
    3. renderizar el color de la paleta seleccionada
    4. restar el color de la paleta seleccionada del acumulador

Aquí su imagen de entrada (los puse juntos):

entrada

Aquí la imagen del resultado para su fuente:

resultado

Los cuadrados de color en la esquina superior izquierda son solo la paleta que utilicé (extraída de tu imagen).

Aquí el código ( C ++ ) hago esto con:

picture pic0,pic1,pic2; // pic0 - source img // pic1 - source pal // pic2 - output img int x,y,i,j,d,d0,e; int r,g,b,r0,g0,b0; color c; List pal; // resize output to source image size clear with black pic2=pic0; pic2.clear(0); // create distinct colors pal[] list from palette image for (y=0;y=0) pal.add(c); } // dithering r0=0; g0=0; b0=0; // no leftovers for (y=0;yd)) { d0=d; j=i; } } // get selected palette color c=pal[j]; // sub from leftovers r0-=WORD(c.db[picture::_r]); g0-=WORD(c.db[picture::_g]); b0-=WORD(c.db[picture::_b]); // copy to destination image pic2.p[y][x]=c; } // render found palette pal[] (visual check/debug) x=0; y=0; r=16; g=pic2.xs/r; if (g>pal.num) g=pal.num; for (y=0;y 

donde la picture es mi clase de imagen así que aquí algunos miembros:

  • xs,ys resolución
  • color p[ys][xs] acceso directo a píxeles (formato de 32 bits de píxeles, por lo que 8 bits por canal)
  • clear(DWORD c) llena la imagen con el color c

El color es solo la union de DWORD dd y BYTE db[4] para un acceso de canal simple.

La List<> es mi plantilla (matriz dinámica / lista>

  • List a es lo mismo que int a[] .
  • add(b) agregue b al final de la lista
  • num es el número de elementos en la lista

Ahora, para evitar demasiados puntos (durante la vida útil de su sake plotter), puede usar diferentes patrones de línea, etc., pero eso requiere muchas pruebas / errores ... Por ejemplo, puede contar cuántas veces se usa un color en alguna área y a partir de esa relación, utilice diferentes patrones de llenado (basados ​​en líneas). Debe elegir entre calidad de imagen y velocidad de renderizado / durabilidad ...

Sin más información sobre las capacidades de su trazador (velocidades, método de cambio de herramienta, comportamiento de combinación de colores) es difícil decidir el mejor método para formar flujo de control. Mi apuesta es que cambies los colores manualmente para que representes cada uno de los colores a la vez. Así que extrae todos los píxeles con el color de la primera herramienta para unir los píxeles adyacentes a líneas / curvas y renderizar ... luego pasa al siguiente color de herramienta ...