Щоб проілюструвати рішення щодо обробки растру / зображення, я почав із розміщеного зображення. Це значно нижчої якості, ніж вихідні дані, завдяки суперпозиції синіх точок, сірих ліній, кольорових областей та тексту; і потовщення початкових червоних ліній. Таким чином, це представляє виклик: проте, ми все ще можемо отримати клітини Вороного з високою точністю.
Я витягнув видимі частини червоної лінійної функції, віднімаючи зелений від червоного каналу, а потім розширюючи та розмиваючи найяскравіші частини на три пікселі. Це було використано як основу для обчислення відстані Евкліда:
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]]]
(Весь код, показаний тут, є Mathematica 8.)
Виявлення очевидних "хребтів" - які повинні включати всі точки, що розділяють дві сусідні комірки Вороного, - і повторне їх поєднання з лінійним шаром забезпечує більшу частину того, що нам потрібно продовжити:
ridges = Binarize[ColorNegate[
LaplacianGaussianFilter[DistanceTransform[ColorNegate[string]], 2] // ImageAdjust], .65];
ColorCombine[{ridges, string}]
Червона смуга являє собою те, що я міг би врятувати від лінії, а синя смуга показує пасма в перетворенні відстані. (Ще є багато сміття через перерви в початковій лінії.) Ці хребти потрібно очистити і закрити за допомогою подальшого розширення - два пікселі будуть робити - і тоді ми можемо визначити пов'язані області, визначені оригінальні лінії та гребені між ними (деякі з яких потрібно явно рекомбінувати):
Dilation[MorphologicalComponents[
ColorNegate[ImageAdd[ridges, Dilation[string, 2]]]] /. {2 -> 5, 8 -> 0, 4 -> 3} // Colorize, 2]
Насправді це досягнуто, це визначити п'ять орієнтованих лінійних ознак. Ми можемо побачити три окремих лінійних ознаки, що випливають з точки злиття. У кожного є дві сторони. Я вважав праву частину двох кращих правих ознак як однакові, але в іншому випадку розрізняв усе інше, надаючи п'ять рис. Кольорові області показують діаграму Вороного з цих п'яти особливостей.
Команда Евклідового виділення на основі шару, який розрізняє три лінійні ознаки (яких у мене не було в наявності для цієї ілюстрації) не розрізнив різні сторони кожної лінійної ознаки, і тому вона поєднала б зелену та помаранчеву області, що облягають крайню ліву лінію ; вона розділила б крайню праву частину сліз на дві частини; і це поєднало б ці розбиті шматки з відповідними рисами бежевого та пурпурового кольору з інших сторін.
Очевидно, що цей растровий підхід має можливість побудувати Вороного тесселяції довільних ознак - точок, лінійних відрізків і навіть багатокутників, незалежно від їх форм - і він може виділити сторони лінійних ознак.