Aby zilustrować rozwiązanie do przetwarzania rastra / obrazu, zacząłem od opublikowanego obrazu. Ma znacznie niższą jakość niż oryginalne dane, z powodu nałożenia niebieskich kropek, szarych linii, kolorowych regionów i tekstu; i pogrubienie oryginalnych czerwonych linii. Jako takie stanowi wyzwanie: jednak nadal możemy uzyskać komórki Voronoi z wysoką dokładnością.
Wyodrębniłem widoczne części czerwonych liniowych elementów, odejmując zielony od czerwonego kanału, a następnie rozszerzając i erodując najjaśniejsze części o trzy piksele. Zostało to wykorzystane jako podstawa do obliczenia odległości euklidesowej:
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]]]
(Cały pokazany tutaj kod to Mathematica 8.)
Identyfikacja widocznych „grzbietów” - które muszą obejmować wszystkie punkty oddzielające dwie sąsiednie komórki Voronoi - i ponowne połączenie ich z warstwą liniową zapewnia większość tego, co musimy zrobić:
ridges = Binarize[ColorNegate[
LaplacianGaussianFilter[DistanceTransform[ColorNegate[string]], 2] // ImageAdjust], .65];
ColorCombine[{ridges, string}]
Czerwony pasek reprezentuje to, co mogłem zapisać na linii, a cyjanowy pasek pokazuje grzbiety w transformacji odległości. (Wciąż istnieje wiele śmieci z powodu przerw w samej oryginalnej linii.) Te grzbiety muszą zostać oczyszczone i zamknięte przez dalszą dylatację - zrobią to dwa piksele - a następnie możemy zidentyfikować połączone regiony określone przez oryginalne linie i grzbiety między nimi (niektóre z nich wymagają wyraźnej rekombinacji):
Dilation[MorphologicalComponents[
ColorNegate[ImageAdd[ridges, Dilation[string, 2]]]] /. {2 -> 5, 8 -> 0, 4 -> 3} // Colorize, 2]
W efekcie udało się zidentyfikować pięć zorientowanych cech liniowych. Widzimy trzy oddzielne cechy liniowe emanujące z punktu przecięcia. Każda ma dwie strony. Uważałem prawą stronę dwóch najbardziej prawych elementów za identyczne, ale poza tym odróżniłem wszystko inne, podając pięć cech. Kolorowe obszary pokazują schemat Voronoi z tych pięciu cech.
Komenda alokacji euklidesowej oparta na warstwie, która rozróżnia trzy cechy liniowe (których nie miałam dostępna dla tej ilustracji) nie rozróżniałaby różnych boków każdej cechy liniowej, a zatem łączyłaby obszary zielony i pomarańczowy otaczające lewą linię ; podzieliłby skrajnie prawą cechę turkusowy na dwie części; i połączyłby te podzielone elementy z odpowiadającymi im beżowymi i karmazynowymi elementami po ich drugiej stronie.
Oczywiście to podejście rastrowe ma moc konstruowania teselacji dowolnych cech Voronoi - punktów, elementów liniowych, a nawet wielokątów, niezależnie od ich kształtów - i może odróżniać boki elementów liniowych.