इनपुट सुविधाओं के रूप में लाइनों के बजाय थिएसेन (वोरोनोई) पॉलीगॉन बनाना (अंकों के बजाय) का उपयोग करना?


24

मेरे पास एक विशेष बहुभुज सीमा के अंदर लाइन सुविधाओं का एक सेट है। प्रत्येक पंक्ति के लिए, मैं एक बहुभुज उत्पन्न करना चाहूंगा जिसके अंदर हर संभव बिंदु परत में किसी भी दूसरी पंक्ति की तुलना में दी गई रेखा के करीब हो। मैंने डेलौना ट्रायएंगुलेशन का उपयोग करते हुए बिंदु इनपुट सुविधाओं के लिए अतीत में ऐसा किया है, लेकिन अगर लाइन की विशेषताओं के साथ ऐसा करने के लिए एक समान प्रक्रिया है, तो मैं इसे खोजने में सक्षम नहीं हूं।

ईटीए: जियोगेक का समाधान मेरे पास हुआ था, लेकिन स्ट्रैचर सेक्शन में जहां इनपुट लाइनों में कोने कम होते हैं, जिसके परिणामस्वरूप पॉलीगॉन को एक लाइन भी बंद हो जाती है (यहां तक ​​कि ओवरलैपिंग भी) जो उन्हें नहीं करनी चाहिए। यहां, लाल रेखाएं मेरे इनपुट हैं, आप उनके द्वारा उत्पन्न कोने और थिसेन बहुभुज देख सकते हैं।

यहाँ छवि विवरण दर्ज करें

शायद एक त्वरित और (बहुत) गंदा समाधान प्रत्येक पंक्ति को समान रूप से स्थानित बिंदुओं के एक भरपूर मात्रा में सेट करने के लिए परिवर्तित हो सकता है (केवल रेखा के कोने से), उन से थिएसेन बहुभुज उत्पन्न करें, फिर उन्हें मूल लाइन आईडी के आधार पर भंग कर दें।


4
वोरोनोई आरेख जिसमें बिंदुओं के साथ लाइन सेगमेंट शामिल हैं, "पॉलीगॉन" से बना नहीं है; बल्कि, उनकी कोशिकाओं में ऐसी सीमाएँ होती हैं जिनमें परवलों के अंश शामिल हो सकते हैं इस कारण से, वोरोनोई टसेसेलेशन बनाने के सबसे कुशल और सटीक तरीकों में से एक है रास्टर प्रतिनिधित्व का उपयोग करना। ईएसआरआई इस प्रक्रिया को यूक्लिडियन आवंटन कहता है ।
whuber

जवाबों:


11

एक रेखापुंज / छवि प्रसंस्करण समाधान को स्पष्ट करने के लिए, मैंने पोस्ट की गई छवि के साथ शुरुआत की। यह नीले डॉट्स, ग्रे लाइनों, रंगीन क्षेत्रों और पाठ के सुपरपोजिशन के कारण मूल डेटा की तुलना में बहुत कम गुणवत्ता का है; और मूल लाल रेखाओं का मोटा होना। जैसा कि यह एक चुनौती प्रस्तुत करता है: फिर भी, हम अभी भी उच्च सटीकता के साथ वोरोनोई कोशिकाओं को प्राप्त कर सकते हैं।

मैंने लाल रेखीय विशेषताओं के दृश्य भागों को लाल चैनल से हरे को घटाकर और फिर तीन हिस्सों से सबसे उज्ज्वल भागों को पतला और मिटा दिया। यह यूक्लिडियन दूरी की गणना के लिए आधार के रूप में इस्तेमाल किया गया था:

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]

वास्तव में, इसने जो काम किया है, वह पांच उन्मुख रैखिक विशेषताओं की पहचान करना है। हम संगम के एक बिंदु से निकलने वाली तीन अलग-अलग रैखिक विशेषताओं को देख सकते हैं। प्रत्येक की दो भुजाएँ हैं। मैंने दो सबसे सही विशेषताओं में से एक के रूप में सही पक्ष पर विचार किया है, लेकिन अन्यथा सभी विशेषताओं को अलग कर दिया है, पांच सुविधाएँ दे रहे हैं। रंगीन क्षेत्र इन पांच विशेषताओं से वोरोनोई आरेख दिखाते हैं।

परिणाम

एक यूक्लिडियन आवंटन आदेश एक परत पर आधारित है जो तीन रेखीय विशेषताओं को अलग करता है (जो कि इस चित्रण के लिए मेरे पास उपलब्ध नहीं था) प्रत्येक रैखिक सुविधा के विभिन्न पक्षों को अलग नहीं करेगा, और इसलिए यह बाईं ओर की रेखा को समतल करते हुए हरे और नारंगी क्षेत्रों को मिलाएगा। ; यह सबसे दाहिनी चैती सुविधा को दो में विभाजित करेगा; और यह उन विभाजित टुकड़ों को अपने अन्य पक्षों पर संबंधित बेज और मैजेंटा सुविधाओं के साथ जोड़ देगा।

जाहिर है, इस रेखापुंज दृष्टिकोण में मनमाना सुविधाओं के वोरोनोई टेसल्यूशन बनाने की शक्ति होती है - अंक, रैखिक टुकड़े और यहां तक ​​कि बहुभुज, उनके आकार की परवाह किए बिना - और यह रैखिक विशेषताओं के पक्षों को भेद कर सकता है।


1
इसी तरह का समाधान mathematica.stackexchange.com/questions/20696/… पर चित्रित किया गया है
whuber

5

मै सोचता हूँ तुम कर सकते हो:

  • बिंदुओं (लाइन_ पॉइंट्स) पर लाइन वर्टिकल कन्वर्ट करें।
  • बिंदुओं (लाइन_ पॉइंट्स) का उपयोग करके वोरोनोई पॉलीगोन बनाएं।
  • या तो एक आईडी विशेषता का उपयोग करके परिणामित बहुभुज को भंग करें जिसे लाइन परत से बचाया गया है, या लाइन परत के साथ एक स्थानिक जुड़ाव द्वारा।

मुझे आशा है कि मैं वास्तव में आपके प्रश्न को समझ गया हूं, यदि आप अपनी आवश्यकताओं को समझाने के लिए एक ड्राइंग प्रदान नहीं कर सकते हैं।


2
मुझे लगता है कि आप इसे समझ गए थे, और यह समाधान मेरे साथ हुआ था, लेकिन आप उन समस्याओं में भाग लेते हैं जहां रेखाएं कम लंबवत होती हैं। मैं स्क्रीनशॉट के साथ अपने प्रश्न को अपडेट करूंगा।
डैन सी

3
यह ठीक काम करेगा अगर आप लाइन के साथ बिंदु सघन बनाए। हालांकि एक रेखापुंज आधारित दृष्टिकोण (जैसा कि सवाल पर टिप्पणियों में पूरी तरह से उल्लेख है) मुझे संदेह है कि यह इससे कहीं अधिक कुशल होगा।
एंडी डब्ल्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.