Để minh họa một giải pháp xử lý raster / hình ảnh, tôi bắt đầu với hình ảnh được đăng. Nó có chất lượng thấp hơn nhiều so với dữ liệu gốc, do sự chồng chất của các chấm màu xanh, đường màu xám, vùng màu và văn bản; và sự dày lên của các đường màu đỏ ban đầu. Do đó, nó đưa ra một thách thức: tuy nhiên, chúng ta vẫn có thể thu được các tế bào Voronoi với độ chính xác cao.
Tôi đã trích xuất các phần có thể nhìn thấy của các tính năng tuyến tính màu đỏ bằng cách trừ màu xanh lục khỏi kênh màu đỏ, sau đó làm giãn và ăn mòn các phần sáng nhất bằng ba pixel. Điều này đã được sử dụng làm cơ sở cho việc tính toán khoảng cách Euclide:
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]]]
(Tất cả các mã được hiển thị ở đây là Mathicala 8.)
Xác định các "đường vân" rõ ràng - phải bao gồm tất cả các điểm tách hai ô Voronoi liền kề - và kết hợp lại chúng với lớp đường cung cấp hầu hết những gì chúng ta cần tiến hành:
ridges = Binarize[ColorNegate[
LaplacianGaussianFilter[DistanceTransform[ColorNegate[string]], 2] // ImageAdjust], .65];
ColorCombine[{ridges, string}]
Dải màu đỏ đại diện cho những gì tôi có thể lưu của dòng và dải màu lục lam cho thấy các đường vân trong biến đổi khoảng cách. (Vẫn còn rất nhiều rác do bị đứt trong chính đường ban đầu.) Những đường vân này cần được làm sạch và đóng lại thông qua một sự giãn nở thêm - hai pixel sẽ làm - và sau đó chúng ta có thể xác định các vùng được kết nối được xác định bởi các đường ban đầu và các đường vân giữa chúng (một số trong đó cần được kết hợp lại rõ ràng):
Dilation[MorphologicalComponents[
ColorNegate[ImageAdd[ridges, Dilation[string, 2]]]] /. {2 -> 5, 8 -> 0, 4 -> 3} // Colorize, 2]
Điều này đã đạt được, trong thực tế, là để xác định năm tính năng tuyến tính định hướng . Chúng ta có thể thấy ba tính năng tuyến tính riêng biệt phát ra từ một điểm hợp lưu. Mỗi cái đều có hai mặt. Tôi đã coi bên phải của hai tính năng ngoài cùng bên phải là giống nhau, nhưng mặt khác lại phân biệt mọi thứ khác, đưa ra năm tính năng. Các khu vực màu hiển thị biểu đồ Voronoi từ năm tính năng này.
Lệnh Phân bổ Euclide dựa trên một lớp phân biệt ba tính năng tuyến tính (mà tôi không có sẵn cho hình minh họa này) sẽ không phân biệt các mặt khác nhau của từng tính năng tuyến tính và do đó, nó sẽ kết hợp các vùng màu lục và màu cam ở bên trái ; nó sẽ chia tính năng teal ngoài cùng bên phải thành hai; và nó sẽ kết hợp những mảnh tách đó với các đặc điểm màu be và đỏ tươi tương ứng ở các mặt khác của chúng.
Rõ ràng, cách tiếp cận raster này có khả năng xây dựng các phần tử Voronoi của các tính năng tùy ý - điểm, mảnh tuyến tính và thậm chí đa giác, bất kể hình dạng của chúng - và nó có thể phân biệt các mặt của các tính năng tuyến tính.