Giriş özellikleri olarak çizgiler (noktalar yerine) kullanarak Thiessen (Voronoi) çokgenleri oluşturma?


24

Belirli bir poligonal sınırın içinde bir dizi çizgi özelliğine sahibim. Her bir çizgi için, olası her noktanın verilen çizgiye, tabakadaki diğer çizgilere göre daha yakın olduğu bir çokgen oluşturmak istiyorum. Geçmişte bunu Delaunay üçgenleme kullanarak nokta giriş özellikleri için yaptım, ancak satır özellikleriyle yapmak için benzer bir işlem varsa, bulamadım.

ETA: Geogeek'in çözümü bana gelmişti, ancak girdi çizgilerinin daha az köşeli olduğu daha dik bölümlerde, ortaya çıkan çokgenler, çok fazla yaklaşıyor (hatta üst üste gelmek zorunda değiller). Burada kırmızı çizgiler girdilerim, köşeleri ve bunlardan üretilen Thiessen poligonlarını görebilirsiniz.

görüntü tanımını buraya girin

Belki de hızlı ve (çok) kirli bir çözüm, her bir çizgiyi bol miktarda eşit aralıklı noktalara (yalnızca çizginin köşeleri yerine) dönüştürmek, bunlardan Thiessen çokgenleri oluşturmak ve ardından kaynak satır kimliğini temel alarak çözmek olabilir.


4
Noktalarla birlikte çizgi parçalarını içeren Voronoi diyagramları "çokgenler" den oluşmaz; aksine, hücrelerinin parabol parçalarını içerebilecek sınırları vardır . Bu nedenle, Voronoi mozaikleme oluşturmanın en etkili ve doğru yollarından biri raster gösterimi kullanmaktır. ESRI bu prosedürü Öklid Tahsisi olarak adlandırır .
whuber

Yanıtlar:


11

Bir raster / görüntü işleme çözümü göstermek için , yayınlanan görüntü ile başladım. Mavi noktaların, gri çizgilerin, renkli bölgelerin ve metnin üst üste bindirilmesinden dolayı orijinal verilerden çok daha düşük kalitededir; ve orijinal kırmızı çizgilerin kalınlaşması. Bu nedenle bir zorluk teşkil etmektedir: Bununla birlikte, Voronoi hücrelerini hala yüksek hassasiyetle elde edebiliyoruz.

Yeşili kırmızı kanaldan çıkararak ve sonra en parlak kısımları üç piksel genişleterek aşındırarak kırmızı doğrusal özelliklerin görünür kısımlarını çıkarttım. Bu, Öklid mesafesinin hesaplanmasında temel olarak kullanılmıştır:

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]]]

Kabartma arsa

(Burada gösterilen tüm kodlar Mathematica 8'dir.)

İki bitişik Voronoi hücresini ayıran tüm noktaları içermesi gereken açık "sırtları" belirlemek ve bunları çizgi katmanıyla yeniden birleştirmek, devam etmek için gerekenlerin çoğunu sağlar:

ridges = Binarize[ColorNegate[
   LaplacianGaussianFilter[DistanceTransform[ColorNegate[string]], 2] // ImageAdjust], .65];
ColorCombine[{ridges, string}]

Kombine görüntüler

Kırmızı bant çizgiden ne kurtarabileceğimi ve camgöbeği bant mesafe dönüşümündeki çıkıntıları gösterir. (Orijinal çizgideki kopukluklardan dolayı hala çok fazla hurda var.) Bu sırtların daha fazla genişlemesi ile temizlenmesi ve kapatılması gerekiyor - iki piksel yapacaktır - ve ardından belirlediğimiz bağlı bölgeleri belirleyebiliriz orijinal çizgiler ve aralarındaki çıkıntılar (bazıları rekombine açıkça ihtiyaç duyulan):

Dilation[MorphologicalComponents[
  ColorNegate[ImageAdd[ridges, Dilation[string, 2]]]] /. {2 -> 5, 8 -> 0, 4 -> 3} // Colorize, 2]

Bunun başardığı şey, aslında, beş odaklı doğrusal özellik tanımlamaktır . Bir birleşme noktasından çıkan üç ayrı doğrusal özellik görüyoruz. Her birinin iki tarafı vardır. En sağdaki iki özelliğin sağ tarafının aynı olduğunu düşündüm, ancak beş özelliği vererek başka her şeyi ayırt ettim. Renkli alanlar Voronoi şemasını bu beş özellikten göstermektedir.

Sonuç

Üç doğrusal özelliği (bu gösterim için elimde olmayan) ayıran bir katmana dayanan bir Öklid Tahsisi komutu , her bir lineer özelliğin farklı yanlarını ayırt etmeyecek ve böylece en soldaki çizgiyi çevreleyen yeşil ve turuncu bölgeleri birleştirecektir. ; en sağdaki teal özelliğini ikiye böler; ve bu ayrık parçaları diğer yanlarındaki bej ve macenta özellikleriyle birleştirirdi.

Açıkça görüldüğü üzere, bu raster yaklaşım, Voronoi'nin keyfi özelliklerinin - noktalarının, doğrusal parçaların ve hatta çokgenlerin, şekillerinden bağımsız olarak - keyfi şekillendirme - ve doğrusal özelliklerin yanlarını ayırt edebilir - yapma gücüne sahiptir.


1
Benzer bir çözüm mathematica.stackexchange.com/questions/20696/… adresinde gösterilmektedir .
whuber

5

Bence yapabilirsin:

  • Satır köşelerini noktalara dönüştür (line_points).
  • Voronoi poligonlarını noktaları (line_points) kullanarak yapın.
  • Elde edilen poligonları, ya çizgi katmanından kaydedilmiş bir id niteliği ya da çizgi katmanıyla uzamsal birleştirme ile çözün.

Umarım sorunuzu gerçekten anlamışımdır, eğer ihtiyaçlarınızı daha fazla açıklamak için bir çizim sağlayamazsanız.


2
Bunu anladığınızı ve bu çözümün benim başıma geldiğini düşünüyorum, ancak çizgilerin daha az köşeli olduğu problemlerle karşılaşıyorsunuz. Sorumu bir ekran görüntüsü ile güncelleyeceğim.
Dan C

3
Noktaları çizgi boyunca yoğunlaştırırsanız bu iyi sonuç verir. Her ne kadar raster temelli bir yaklaşım olsa da (soru hakkındaki yorumlarda belirtildiği gibi) bundan daha etkili olacağından şüpheleniyorum.
Andy W
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.