कुशलता से आंकड़ा रोटेशन की गणना कैसे करें?


13

चित्र 1 चित्र 2

मेरे पास बाइट्स (बिटमैप-जैसे मैट्रिक्स) के मैट्रिक्स के माध्यम से एक चित्र है । उदाहरण चित्र पर दिखाया गया है Picture 1

लक्ष्य कुछ दिए गए चित्रा का सबसे अच्छा रोटेशन कोण खोजने के लिए है । जब चित्रा को सबसे अच्छे कोण से घुमाया जाता है, तो आयत जो X और Y अक्षों के समानांतर होती है और चित्र का सबसे छोटा क्षेत्र होता है।

चित्रों को अंकित करने वाले आयतों को चित्रों पर हल्के-भूरे रंग के रूप में दिखाया गया है। में Picture 2, आप देख सकते हैं कि चित्र का आदर्श रोटेशन लगभग 30 डिग्री दक्षिणावर्त है।

अब, मैं एल्गोरिथ्म जानता हूं कि इस कोण को कैसे खोजना है, लेकिन यह मुझे लगता है कि बहुत अक्षम है। यह इस प्रकार चलता है:

  1. 0 से 45 तक कोणों के माध्यम से लूप।
  2. वर्तमान कोण के लिए, प्रत्येक आंकड़ा बिंदु के लिए नए, घुमाए गए, स्थान की गणना करें
  3. आयत की सीमा ज्ञात करें जिसमें आकृति (न्यूनतम और अधिकतम x, y) है और इसे पंजीकृत करें यदि अब तक का सबसे अच्छा मैच है
  4. अगला कोण

यह एक प्रकार का जानवर-बल विधि है और छोटे आंकड़ों के लिए अच्छी तरह से और उचित रूप से तेजी से काम करता है। हालांकि, मुझे उन आंकड़ों के साथ काम करने की आवश्यकता है जिनमें 10 मिलियन तक अंक हैं, और मेरा एल्गोरिथ्म धीमा हो जाता है।

इस समस्या के लिए अच्छा एल्गोरिदम क्या होगा?

जवाबों:


20

ऐसा लगता है कि आप रैखिक समय घूर्णन कैलिपर्स एल्गोरिथ्म का उपयोग करके मनमाने ढंग से संरेखित न्यूनतम बाउंडिंग बॉक्स पा सकते हैं ।

एक बार जब आपके पास बाउंडिंग बॉक्स होता है, तो आपको बस पक्षों में से एक के ढलान की गणना करके रोटेशन के कोण को निर्धारित करने की आवश्यकता होती है।


यह एक महान समाधान है, बहुत अच्छा है।
InformedA

महान, चूंकि मेरे पास पहले से ही x और y द्वारा अंक सॉर्ट किए गए हैं, मैं इस en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/… के साथ उत्तल पतवार पा सकता हूं और पतवार बिंदुओं के साथ मौजूदा एल्गोरिथ्म का उपयोग कर सकता हूं ।
दुसान

12

आपके दृष्टिकोण का पहला चरण त्रुटिपूर्ण है - 0 और 45 के बीच वास्तविक मूल्यों की एक अनंत संख्या है , इसलिए यह "उनके माध्यम से लूप" का कोई मतलब नहीं है। हालाँकि, आपके एल्गोरिथ्म की मरम्मत की जा सकती है:

  • बहुभुज के उत्तल पतवार का पता लगाएं

  • उत्तल पतवार के बाहरी किनारों द्वारा दिए गए कोणों की परिमित (!) संख्या के माध्यम से लूप

  • अब इन कोणों का उपयोग करके चरण 2 से 4 लागू करें।

यह काम करता है क्योंकि यह दिखाया जा सकता है कि न्यूनतम संलग्न आयत को उत्तल पतवार के बाहरी किनारों में से एक को छूना चाहिए।


हां, यह वही है जो मैं करने जा रहा हूं, पहले से ही दान के उत्तर की मदद मिली। धन्यवाद।
दुसान

@ डसन: मुझे यकीन नहीं है कि अन्य उत्तर समान दृष्टिकोण का वर्णन करते हैं, इस प्रकार मैंने सरल तरीके से समाधान का वर्णन करने की कोशिश की, उम्मीद है कि थोड़ा सा स्पष्ट होगा। यहाँ एक विवरण मिला: cgm.cs.mcgill.ca/~orm/maer.html
Doc Brown

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