การสร้างรูปหลายเหลี่ยม Thiessen (Voronoi) โดยใช้เส้น (แทนที่จะเป็นจุด) เป็นคุณลักษณะอินพุตหรือไม่


24

ฉันมีชุดคุณสมบัติเส้นภายในขอบเขตรูปหลายเหลี่ยมโดยเฉพาะ สำหรับแต่ละบรรทัดฉันต้องการสร้างรูปหลายเหลี่ยมภายในซึ่งจุดที่เป็นไปได้ทุกจุดนั้นจะอยู่ใกล้กับเส้นที่กำหนดมากกว่าเส้นอื่น ๆ ในชั้น ฉันเคยทำสิ่งนี้มาแล้วในอดีตสำหรับคุณสมบัติอินพุตพอยต์โดยใช้ Delaunay triangulation แต่ถ้ามีกระบวนการที่คล้ายกันในการทำมันด้วยฟีเจอร์ line ฉันไม่สามารถหามันได้

การทางพิเศษแห่งประเทศไทย: วิธีการแก้ปัญหาของ Geogeek เกิดขึ้นกับฉัน แต่ในส่วนที่ตรงกว่าที่เส้นอินพุตมีจุดยอดน้อยกว่ารูปหลายเหลี่ยมที่เป็นผลลัพธ์จะเข้าใกล้เกินไป (แม้จะทับซ้อนกัน) บรรทัดที่ไม่ควร ที่นี่เส้นสีแดงคืออินพุตของฉันคุณสามารถเห็นจุดยอดและรูปหลายเหลี่ยม Thiessen ที่สร้างขึ้นจากพวกเขา

ป้อนคำอธิบายรูปภาพที่นี่

บางทีวิธีที่รวดเร็วและ (มาก) วิธีแก้ปัญหาที่สกปรกอาจจะแปลงแต่ละบรรทัดเป็นชุดของจุดที่เว้นระยะเท่ากัน (แทนที่จะเป็นจุดยอดของเส้นเท่านั้น) สร้าง Thiessen polygons จากนั้นทำการละลายโดยอิงจาก Line ID ต้นทาง


4
ไดอะแกรม Voronoi ที่รวมส่วนของเส้นตรงพร้อมกับจุดไม่ได้ประกอบด้วย "รูปหลายเหลี่ยม"; ค่อนข้างเซลล์ของพวกเขามีขอบเขตที่สามารถรวมส่วนของพาราโบลา ด้วยเหตุนี้หนึ่งในวิธีที่มีประสิทธิภาพและแม่นยำที่สุดในการสร้าง Tessellations Voronoi คือการใช้การแสดงภาพแรสเตอร์ ESRI เรียกขั้นตอนนี้ยุคลิดจัดสรร
whuber

คำตอบ:


11

เพื่อแสดงให้เห็นถึงวิธีการแก้ปัญหาการประมวลผลภาพ / แรสเตอร์ฉันเริ่มต้นด้วยภาพที่โพสต์ มันมีคุณภาพต่ำกว่าข้อมูลต้นฉบับมากเนื่องจากการซ้อนทับของจุดสีน้ำเงิน, เส้นสีเทา, พื้นที่สีและข้อความ และความหนาของเส้นสีแดงดั้งเดิม ดังนั้นมันจึงเป็นสิ่งที่ท้าทาย: อย่างไรก็ตามเรายังสามารถได้รับเซลล์ Voronoi ที่มีความแม่นยำสูง

ฉันแยกส่วนที่มองเห็นได้ของคุณสมบัติเชิงเส้นสีแดงโดยการลบสีเขียวออกจากช่องสีแดงจากนั้นทำการขยายและการลบส่วนที่สว่างที่สุดด้วยสามพิกเซล สิ่งนี้ถูกใช้เป็นฐานสำหรับการคำนวณระยะทางแบบยุคลิด:

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)

การระบุ "สันเขา" ที่เห็นได้ชัด - ซึ่งจะต้องรวมทุกจุดที่แยกเซลล์ Voronoi สองเซลล์ที่อยู่ติดกัน - และรวมกันอีกครั้งกับเลเยอร์บรรทัดให้สิ่งที่เราต้องดำเนินการต่อไป:

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]

สิ่งนี้ประสบความสำเร็จเป็นผลคือการระบุคุณสมบัติเชิงเส้นห้าที่มุ่งเน้น เราสามารถเห็นคุณสมบัติเชิงเส้นสามแบบที่แยกออกมาจากจุดบรรจบกัน แต่ละอันมีสองด้าน ฉันได้พิจารณาด้านขวาของฟีเจอร์ขวาสุดทั้งสองว่าเหมือนกัน แต่มีความแตกต่างอย่างอื่นทุกอย่างให้ฟีเจอร์ทั้งห้า พื้นที่สีแสดงแผนภาพ Voronoi จากคุณสมบัติทั้งห้านี้

ผล

คำสั่งการจัดสรรแบบยุคลิดตามชั้นที่แยกความแตกต่างของคุณสมบัติเชิงเส้นทั้งสาม (ซึ่งฉันไม่ได้มีให้สำหรับภาพประกอบนี้) จะไม่แยกความแตกต่างด้านต่าง ๆ ของแต่ละคุณลักษณะเชิงเส้นดังนั้นมันจะรวมพื้นที่สีเขียวและสีส้มขนาบข้างซ้ายสุด ; มันจะแยกคุณสมบัติน้านขวาสุดออกเป็นสองส่วน และมันจะรวมชิ้นส่วนแยกเหล่านั้นเข้ากับคุณสมบัติสีเบจและสีม่วงแดงที่เกี่ยวข้องในด้านอื่น ๆ

เห็นได้ชัดว่าวิธีการแรสเตอร์นี้มีพลังในการสร้างการทดสอบ Voronoi ของคุณลักษณะที่กำหนดเอง - คะแนน, ชิ้นส่วนเชิงเส้น, และแม้กระทั่งรูปหลายเหลี่ยมโดยไม่คำนึงถึงรูปร่างของมัน - และมันสามารถแยกแยะลักษณะเชิงเส้นของลักษณะเชิงเส้น


1
วิธีการแก้ปัญหาที่คล้ายกันคือตัวอย่างที่mathematica.stackexchange.com/questions/20696/...
whuber

5

ฉันคิดว่าคุณสามารถ:

  • แปลงจุดยอดเส้นเป็นจุด (line_points)
  • สร้างรูปหลายเหลี่ยม voronoi โดยใช้จุด (line_points)
  • ละลายรูปหลายเหลี่ยมที่เป็นผลลัพธ์โดยใช้แอตทริบิวต์ id ซึ่งได้รับการบันทึกจากเลเยอร์บรรทัดหรือโดยการรวมเชิงพื้นที่กับเลเยอร์บรรทัด

ฉันหวังว่าฉันจะเข้าใจคำถามของคุณจริง ๆ หากคุณไม่สามารถให้ภาพวาดเพื่ออธิบายความต้องการของคุณได้มากขึ้น


2
ฉันคิดว่าคุณเข้าใจและวิธีการแก้ปัญหานั้นเกิดขึ้นกับฉัน แต่คุณพบปัญหาที่เส้นมีจุดยอดน้อยกว่า ฉันจะอัปเดตคำถามของฉันด้วยภาพหน้าจอ
Dan C

3
สิ่งนี้จะใช้ได้ถ้าคุณทำคะแนนที่หนาแน่นตามแนว แม้ว่าวิธีการเชิงภาพ (ตามที่กล่าวถึงในความคิดเห็นเกี่ยวกับคำถาม) ฉันสงสัยว่าจะมีประสิทธิภาพมากกว่านี้
Andy W
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.