2011-08-09 22 views
14

He intentado muchas veces crear un algoritmo para extraer información de trazos de caracteres chinos. Intenté varios métodos, pero ninguno fue muy satisfactorio, probablemente debido a mi limitado conocimiento de los algoritmos gráficos en general.Cómo extraer un trazo de un carácter chino

Básicamente, tengo los siguientes datos:

  • La carácter chino, lo que puede ser píxeles o vectores (de negro)

  • La esquema general de la carrera, en píxeles (en rojo)

  • Una dirección general (las flechas azules).

enter image description here

partir de esto, estoy tratando de extraer la carrera. Si tuviera que hacer esto, dados los datos disponibles, ¿qué métodos usaría? ¿Puedes pensar en alguna forma automática de extraer el trazo?

+0

pregunta difícil. –

+0

¿Para qué está usando esto exactamente? – Szabolcs

+1

Quiero crear animaciones de trazos de caracteres. –

Respuesta

4

Comenzaría por calcular la distancia al píxel blanco más cercano de cada píxel azul. Luego puede mantener todos los píxeles rojos que están más cerca que el píxel blanco más cercano. El efecto puede suavizarse con algún filtro posterior (tal vez algo así como un erosion seguido de un close).

2

No creo que se pueda llegar a un algoritmo que no tenga casos en los que sería incorrecto. Hay partes de algunos caracteres que son iguales pero que no equivalen al mismo recuento de golpes. Por ejemplo, 馬 técnicamente también incluye 口 desde un punto de vista visual (no lingüístico, por supuesto).

La única idea que tengo es separar el área en regiones pequeñas y escribir un algoritmo que intente seguir el orden establecido en el que se realizan los trazos, pero no me puedo imaginar que eso sería fácil, y dependiendo del fuente, algunas líneas se extienden a regiones en las que no deberían estar.

También hay algunos caracteres que simplemente no funcionarían bien con el algoritmo debido a su diseño inusual, solo siguiendo las reglas estrictas del orden de los trazos pueden llegar al número correcto: los ejemplos incluyen 凹 y 凸.

Tengo que preguntar - el recuento de trazos es información básica para cada personaje - ¿por qué necesitaría crear un algoritmo para contarlo? ¿No sería más fácil hacer el reconocimiento de caracteres y simplemente buscar el recuento de trazos para el personaje en un diccionario personalizado?

+0

Creo que OP tiene información adicional sobre los trazos dados por las flechas azules. Además, parece no estar interesado en contar trazos sino en separarlos (¿quizás para crear una versión animada?). –

+0

Sí, no estoy buscando el recuento de ACV, ya que sé que hay bases de datos para eso. Quiero extraer cada trazo (su apariencia gráfica) de un personaje. Como supongo que no se puede hacer automáticamente, voy a "guiar" el algoritmo al proporcionar la línea azul y los píxeles rojos (básicamente dibujaré manualmente sobre el personaje con un pincel grande, siguiendo el orden de los trazos). También me di cuenta de que algunos casos podrían ser más complicados (tenía en mente trazos angulares como en 中) pero un problema a la vez :) –

+0

Ah, ya veo a qué se refiere. ¡Eso está muy por encima de mi cabeza! ; o; La mejor de las suertes para ti, parece que va a ser mucho trabajo. – aevanko

3

Quizás esté buscando el medial axis, también conocido como topological skeleton. En resumen, resolverá para encontrar todos los puntos que son equidistantes a más de un punto en el borde. Es posible que necesite suavizar o simplificar la curva resultante.

La parte engañosa es separar la parte de la forma que es común a más de un trazo. No estoy convencido de que haya una forma bien definida de hacerlo. ¿Tal vez definir la "región común" como el círculo centrado en cada intersección de esqueleto, tangente a los bordes más cercanos? ¿Entonces quizás alguna interpolación del ancho del trazo a través del espacio?

1

Creo que lo más simple posible que puede funcionar es:

  1. parcela de las flechas azules, uno por uno
  2. calcular la distancia transformada de cada segmento de línea azul
  3. se cruzan esta distancia discreta con las áreas rojas
  4. eliminar áreas rojas con la distancia al segmento de azul mayor que T

Una vez Al hacerlo, puede trabajar en estrategias más sofisticadas para seleccionar un buen segmento dependiente T.

2

Desde la línea azul y la imagen de muestra, creo que este enfoque de tres pasos podría funcionar para bastantes casos:

  1. Para cada punto a lo largo de la línea, seleccione todos los píxeles rojos que estén más cerca a ese punto que el píxel blanco más cercano. Esto le dará aproximadamente el trazo del personaje, pero con abultamientos alrededor del área donde se cruzan dos trazos, y excluirá algunos píxeles en ambos extremos del trazo.

  2. Para eliminar las protuberancias, aísle los píxeles del borde de la carrera y calcule el hough transform para esa imagen de borde. Seleccione las dos líneas más importantes de eso. Esto le dará (si el trazo es lo suficientemente recto) dos líneas a lo largo de los bordes del trazo. Elimine todos los píxeles rojos de su trazo que están más alejados de la línea azul en una dirección perpendicular que estas dos líneas. Ahora (para un trazo lo suficientemente recto) lo único que le faltarán será un pequeño conjunto de píxeles aislados que se eliminó en el paso 1 o 2, así:

  3. Agregue todas las pequeñas regiones aisladas de píxeles que solo toquen su golpe, y ninguna otra parte del personaje al golpe. Si las líneas que encuentra en el paso 2 están demasiado cerca de la línea azul, también puede realizar este paso entre los pasos 1 y 2.

Cuestiones relacionadas