Untuk menggambarkan solusi pemrosesan raster / gambar, saya mulai dengan gambar yang diposting. Kualitasnya jauh lebih rendah daripada data asli, karena superposisi titik biru, garis abu-abu, daerah berwarna, dan teks; dan penebalan garis merah asli. Karena itu ia menghadirkan tantangan: namun, kami masih bisa mendapatkan sel Voronoi dengan akurasi tinggi.
Saya mengekstrak bagian yang terlihat dari fitur linear merah dengan mengurangi hijau dari saluran merah dan kemudian melebarkan dan mengikis bagian paling terang dengan tiga piksel. Ini digunakan sebagai dasar untuk perhitungan jarak Euclidean:
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]]]
(Semua kode yang ditampilkan di sini adalah Mathematica 8.)
Mengidentifikasi "punggungan" yang jelas - yang harus mencakup semua titik yang memisahkan dua sel Voronoi yang berdekatan - dan menggabungkannya kembali dengan lapisan garis memberikan sebagian besar dari apa yang perlu kita lakukan:
ridges = Binarize[ColorNegate[
LaplacianGaussianFilter[DistanceTransform[ColorNegate[string]], 2] // ImageAdjust], .65];
ColorCombine[{ridges, string}]
Pita merah melambangkan apa yang saya bisa selamatkan dari garis itu dan pita cyan menunjukkan garis punggungan dalam transformasi jarak. (Masih ada banyak sampah karena jeda pada garis asli itu sendiri.) Punggungan ini perlu dibersihkan dan ditutup melalui pelebaran lebih lanjut - dua piksel akan dilakukan - dan kemudian kita dapat mengidentifikasi daerah terhubung yang ditentukan oleh garis asli dan punggung bukit di antara mereka (beberapa di antaranya perlu secara eksplisit untuk digabungkan kembali):
Dilation[MorphologicalComponents[
ColorNegate[ImageAdd[ridges, Dilation[string, 2]]]] /. {2 -> 5, 8 -> 0, 4 -> 3} // Colorize, 2]
Apa yang telah dicapai ini, pada dasarnya, adalah mengidentifikasi lima fitur linear yang berorientasi . Kita dapat melihat tiga fitur linear terpisah yang berasal dari titik pertemuan. Masing-masing memiliki dua sisi. Saya telah mempertimbangkan sisi kanan dari dua fitur paling kanan sebagai sama, tetapi sebaliknya membedakan semuanya, memberikan lima fitur. Area berwarna menunjukkan diagram Voronoi dari lima fitur ini.
Perintah Alokasi Euclidean berdasarkan pada lapisan yang membedakan tiga fitur linier (yang saya tidak punya untuk ilustrasi ini) tidak akan membedakan sisi yang berbeda dari setiap fitur linier, sehingga akan menggabungkan wilayah hijau dan oranye yang mengapit garis paling kiri ; itu akan membagi fitur teal paling kanan menjadi dua; dan itu akan menggabungkan potongan-potongan itu dengan fitur krem dan magenta yang sesuai di sisi mereka yang lain.
Jelaslah, pendekatan raster ini memiliki kekuatan untuk membangun tessellations Voronoi fitur yang sewenang-wenang - titik, potongan linear, dan bahkan poligon, terlepas dari bentuknya - dan dapat membedakan sisi fitur linear.