Pour illustrer une solution de traitement d'images / raster, j'ai commencé avec l'image publiée. Il est de bien moindre qualité que les données d'origine, en raison de la superposition de points bleus, de lignes grises, de régions colorées et de texte; et l'épaississement des lignes rouges d'origine. En tant que tel, il présente un défi: néanmoins, nous pouvons toujours obtenir des cellules Voronoi avec une grande précision.
J'ai extrait les parties visibles des traits linéaires rouges en soustrayant le vert du canal rouge, puis en dilatant et en érodant les parties les plus brillantes de trois pixels. Cela a été utilisé comme base pour un calcul de distance euclidienne:
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]]]
(Tout le code affiché ici est Mathematica 8.)
L'identification des «crêtes» évidentes - qui doivent inclure tous les points qui séparent deux cellules Voronoi adjacentes - et leur nouvelle combinaison avec la couche linéaire fournit la plupart de ce dont nous avons besoin pour procéder:
ridges = Binarize[ColorNegate[
LaplacianGaussianFilter[DistanceTransform[ColorNegate[string]], 2] // ImageAdjust], .65];
ColorCombine[{ridges, string}]
La bande rouge représente ce que j'ai pu sauver de la ligne et la bande cyan montre les crêtes dans la transformation de distance. (Il y a encore beaucoup d'ordure en raison des ruptures dans la ligne d'origine elle-même.) Ces crêtes doivent être nettoyées et fermées par une nouvelle dilatation - deux pixels suffiront - et ensuite nous pouvons identifier les régions connectées déterminées par les lignes originales et les crêtes entre elles (dont certaines doivent être explicitement recombinées):
Dilation[MorphologicalComponents[
ColorNegate[ImageAdd[ridges, Dilation[string, 2]]]] /. {2 -> 5, 8 -> 0, 4 -> 3} // Colorize, 2]
Ce que cela a accompli, en fait, est d'identifier cinq caractéristiques linéaires orientées . Nous pouvons voir trois entités linéaires distinctes émanant d'un point de confluence. Chacun a deux côtés. J'ai considéré le côté droit des deux fonctionnalités les plus à droite comme étant les mêmes, mais j'ai par ailleurs distingué tout le reste, en donnant les cinq fonctionnalités. Les zones colorées montrent le diagramme de Voronoi à partir de ces cinq caractéristiques.
Une commande d'allocation euclidienne basée sur un calque qui distingue les trois entités linéaires (que je n'avais pas disponible pour cette illustration) ne distinguerait pas les différents côtés de chaque entité linéaire, et combinerait donc les régions verte et orange encadrant la ligne la plus à gauche ; cela diviserait la fonction sarcelle la plus à droite en deux; et il combinerait ces pièces fendues avec les caractéristiques beige et magenta correspondantes de leurs autres côtés.
De toute évidence, cette approche raster a le pouvoir de construire des pavages Voronoï d'entités arbitraires - des points, des pièces linéaires et même des polygones, quelles que soient leurs formes - et elle peut distinguer les côtés des entités linéaires.