Para ilustrar una solución de procesamiento de imágenes/raster, Empecé con la imagen publicada. Su calidad es mucho menor que la de los datos originales, debido a la superposición de puntos azules, líneas grises, regiones coloreadas y texto; y al engrosamiento de las líneas rojas originales. Como tal, supone un reto: no obstante, podemos obtener células de Voronoi con gran precisión.
Extraje las partes visibles de los rasgos lineales rojos restando el verde del canal rojo y luego dilatando y erosionando las partes más brillantes en tres píxeles. Esto se utilizó como base para el cálculo de la distancia euclidiana:
i = Import["http://i.stack.imgur.com/y8xlS.png"];
{r, g, b} = ColorSeparate[i];
string = With[{n = 3}, Erosion[Dilation[Binarize[ImageSubtract[r, g]], n], n]];
ReliefPlot[Reverse@ImageData@DistanceTransform[ColorNegate[string]]]
(Todo el código mostrado aquí es Mathematica 8.)
La identificación de las "crestas" evidentes -que deben incluir todos los puntos que separan dos células de Voronoi adyacentes- y su recombinación con la capa de líneas proporciona la mayor parte de lo que necesitamos para proceder:
ridges = Binarize[ColorNegate[
LaplacianGaussianFilter[DistanceTransform[ColorNegate[string]], 2] // ImageAdjust], .65];
ColorCombine[{ridges, string}]
La banda roja representa lo que pude salvar de la línea y la banda cian muestra las crestas en la transformación de la distancia. (Estas crestas deben limpiarse y cerrarse mediante una nueva dilatación -dos píxeles bastarán- y entonces podremos identificar las regiones conectadas determinadas por las líneas originales y las crestas entre ellas (algunas de las cuales deben recombinarse explícitamente):
Dilation[MorphologicalComponents[
ColorNegate[ImageAdd[ridges, Dilation[string, 2]]]] /. {2 -> 5, 8 -> 0, 4 -> 3} // Colorize, 2]
Lo que se ha conseguido, en efecto, es identificar cinco orientado características lineales. Podemos ver tres rasgos lineales separados que emanan de un punto de confluencia. Cada uno tiene dos lados. He considerado que el lado derecho de los dos rasgos más a la derecha es el mismo, pero he distinguido todo lo demás, dando los cinco rasgos. Las áreas coloreadas muestran el diagrama de Voronoi de estas cinco características.
Un comando de Asignación Euclidiana basado en una capa que distingue los tres rasgos lineales (que no tenía disponible para esta ilustración) no distinguiría los diferentes lados de cada rasgo lineal, por lo que combinaría las regiones verde y naranja que flanquean la línea más a la izquierda; dividiría el rasgo verde azulado más a la derecha en dos; y combinaría esas piezas divididas con los correspondientes rasgos beige y magenta en sus otros lados.
Evidentemente, este enfoque rasterizado tiene la capacidad de construir teselaciones de Voronoi de características arbitrarias -puntos, piezas lineales e incluso polígonos, independientemente de sus formas- y puede distinguir los lados de las características lineales.
5 votos
Los diagramas de Voronoi que incluyen segmentos de línea junto con puntos no están compuestos por "polígonos", sino que sus celdas tienen límites que pueden incluir porciones de parábolas. Por este motivo, una de las formas más eficaces y precisas de crear teselaciones de Voronoi es utilizar una representación rasterizada. ESRI llama a este procedimiento Asignación euclidiana .