क्या जम्प फ्लड एलगोरिदम अलग है?


10

जेएफए (एल्गोरिदम यहां वर्णित है: http://www.comp.nus.edu.sg/~tants/jfa/i3d06.pdf ) का उपयोग वोरोनोई आरेख, या एक दूरी परिवर्तन के सन्निकटन के लिए किया जा सकता है। यह लघुगणक समय में परिणामी छवि के आकार के आधार पर करता है, न कि बीज की संख्या पर।

यदि आपकी छवि प्रत्येक अक्ष पर समान आकार नहीं है, तो आप क्या करते हैं?

यदि वे समान आकार के होते हैं, तो मुझे यकीन है कि आप छोटे अक्ष को आकार के अतिरिक्त JFA चरण दे सकते हैं, जबकि बड़ी अक्ष ने इसे समाप्त कर दिया (जैसे 512 x 256 आकार की छवि वाले)। अत्यधिक भिन्न आकार के अक्ष आयामों के लिए यह बहुत अधिक अक्षम हो सकता है - हालांकि कहें कि आपके पास एक वॉल्यूम बनावट थी जो 512 x 512 x 4 थी।

क्या प्रत्येक धुरी पर JFA को अलग-अलग चलाना और फिर भी अच्छे परिणाम प्राप्त करना संभव है?

या उस बिंदु पर एक अलग एल्गोरिथ्म का उपयोग करने के लिए अधिक उपयुक्त है? यदि हां, तो क्या एल्गोरिथ्म हो सकता है?

मेरी स्थिति में आदर्श रूप से मैं एकल बिंदु बीज, साथ ही मनमाने आकार के बीज दोनों का समर्थन करना चाहता हूं। संभवतः भारित बीज, जहां एक बीज की दूरी एक गुणक और / या एक योजक द्वारा समायोजित की जाती है ताकि इसे अधिक या कम प्रभाव दिया जा सके।

जवाबों:


7

आपके व्यक्तिगत प्रश्नों के त्वरित उत्तर

यदि आपकी छवि प्रत्येक अक्ष पर समान आकार नहीं है, तो आप क्या करते हैं?

कागज पक्ष की लंबाई के साथ वर्ग छवियों का उपयोग करता है जो एक शक्ति हैं। यह स्पष्टीकरण में आसानी के लिए है, लेकिन एल्गोरिथ्म के काम करने के लिए आवश्यक नहीं है। खंड 3.1 देखें:

सामान्यता की हानि के बिना, हम मान सकते हैं कि n 2 की शक्ति है।

यही है, एल्गोरिथ्म के काम करने के लिए इस धारणा की आवश्यकता नहीं है।

क्या प्रत्येक धुरी पर JFA को अलग-अलग चलाना और फिर भी अच्छे परिणाम प्राप्त करना संभव है?

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

मेरी स्थिति में आदर्श रूप से मैं एकल बिंदु बीज, साथ ही मनमाने आकार के बीज दोनों का समर्थन करना चाहता हूं

कागज में "सामान्यीकृत वोरोनोई आरेख" के तहत धारा 6 में मनमाने आकार के बीजों का उल्लेख किया गया है।

... हमारे एल्गोरिदम ऐसे सामान्यीकृत बीजों को बिंदु बीजों के संग्रह के रूप में मानते हैं और इस प्रकार पॉइंट बीजों के लिए प्राप्त अच्छे प्रदर्शन की अपेक्षा करते हैं।

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

संभवतः भारित बीज, जहां एक बीज की दूरी एक गुणक और / या एक योजक द्वारा समायोजित की जाती है, इसे अधिक या कम प्रभाव देने के लिए

"कई गुणा और योज्य जैसे बीजों पर भार" के लिए, पेपर में केवल धारा 8 में उत्तीर्ण होने की संभावना का उल्लेख किया गया है, संभावित कार्य के रूप में। हालांकि, इसे लागू करने के लिए सीधा होना चाहिए बशर्ते कि आपका वांछित भार बीज डेटा में शामिल हो सकता है जो पिक्सेल से पिक्सेल तक पारित हो जाता है।

वर्तमान एल्गोरिथ्म <s, position(s)>एक बीज और उसकी स्थिति को निर्दिष्ट करने के लिए गुजरता है, और किसी भी एक समय में केवल एक बीज प्रति पिक्सेल संग्रहीत किया जाता है। स्टोर करने के लिए इसे विस्तारित करने <s, position(s), weight(s)>से दूरी फ़ंक्शन को वज़न करने के लिए आवश्यक सभी जानकारी प्रदान की जाती है और गणना की जाती है कि क्या पिक्सेल में पारित किया जा रहा नया बीज उस से करीब है जो वर्तमान में संग्रहीत हो रहा है।

आप दो वज़न, एक गुणक और एक योगात्मक भी शामिल कर सकते हैं, और जब आवश्यक न हो, तो गुणक को एक से 1 और योजक से 1 तक सेट करें। फिर आपके एल्गोरिथ्म में गुणन भारित बीज, योज्य भारित बीज, या यहां तक ​​कि एक या दोनों में से प्रत्येक के संयोजन का उपयोग करने की संभावना शामिल होगी। यह सिर्फ जरूरत होगी

<s, position(s), multiplicative(s), additive(s)>

और वर्तमान एल्गोरिथ्म इस नए एल्गोरिथ्म का उपयोग करने के बराबर होगा

<s, position(s), 1, 0>


क्यों की विस्तृत व्याख्या

कागज के रूप में, सभी का उपयोग करता है log() आधार 2 लघुगणक का संदर्भ लें।

एल्गोरिथ्म को अलग-अलग साइड लंबाई के लिए अनुकूलित करने की आवश्यकता नहीं है

यदि साइड की लंबाई समान नहीं है, और 2 की शक्तियां नहीं हैं, तो एल्गोरिथ्म को अनुकूलित करने की कोई आवश्यकता नहीं है। यह पहले से ही छवि के किनारे पर पिक्सेल के साथ काम करता है जिसके लिए कुछ कूद दिशाएं छवि के बाहर ले जाती हैं। चूंकि एल्गोरिथ्म पहले से ही दिशाओं के लिए बीज जानकारी को छोड़ देता है जो छवि के बाहर ले जाता है, एक चौड़ाई या ऊंचाई जो 2 की शक्ति नहीं है, वह समस्या नहीं होगी। चौड़ाई डब्ल्यू और ऊंचाई एच की एक छवि के लिए, अधिकतम छलांग आकार की आवश्यकता होगी

2log(max(W,H))1

समान चौड़ाई और ऊंचाई एन के मामले के लिए, यह कम हो जाता है

2log(N)1

साइड की लंबाई N के मामले में जो 2 की शक्ति है, यह घट जाती है

2log(N)1=N/2

जैसा कि कागज में प्रयोग किया जाता है।

अधिक सहज शब्दों में, 2 की अगली शक्ति तक अधिकतम पक्ष की लंबाई को गोल करें, और फिर अधिकतम छलांग का आकार प्राप्त करने के लिए इसे आधा करें।

यह हमेशा छवि में प्रत्येक पिक्सेल को छवि के हर दूसरे पिक्सेल से कवर करने के लिए पर्याप्त होता है, क्योंकि किसी भी पिक्सेल की ऑफसेट 0 से N-1 की सीमा में होगी यदि सबसे लंबी तरफ की लंबाई N है। 2 की शक्तियों के संयोजन से 0 से N / 2 एन -1 के लिए हर पूर्णांक को कवर करेगा यदि एन 2 की शक्ति है, और यदि एन 2 की शक्ति नहीं है, तो कवर की गई सीमा केवल लघुगणक की छत लेने के कारण आवश्यक से बड़ी हो सकती है ( 2 की अगली शक्ति तक गोलाई)।

2 की शक्ति वाले पक्षों में छवियां बहुत कम कुशल नहीं होंगी

जंप की संख्या सबसे लंबी ओर की लंबाई पर निर्भर करती है, एल का कहना है। यदि एल 2 की शक्ति है, तो जंप की संख्या । यदि L 2 की शक्ति नहीं है, तो छलांग की संख्या । एक बड़ी छवि के लिए यह एक बड़ा अंतर नहीं होगा।log(L)log(L)

उदाहरण के लिए, 1024 प्रति 1024 छवि में 10 जंप पुनरावृत्तियों की आवश्यकता होगी। 512 से 512 छवि को 9 कूद पुनरावृत्तियों की आवश्यकता होगी। दो आकारों के बीच कुछ भी 10 पुनरावृत्तियों की आवश्यकता होगी। यहां तक ​​कि केवल 2 की शक्ति पर एक छवि के सबसे खराब मामले में, 513 छवि द्वारा 513 की तरह, इसे केवल 1 अतिरिक्त पुनरावृत्ति की आवश्यकता होगी, जो इस पैमाने पर लगभग 11% अधिक है (9 के बजाय 10)।

गैर-वर्ग छवियां प्रति क्षेत्र में कम कुशल हैं

चूँकि आवश्यक पुनरावृत्तियों की संख्या सबसे लंबी भुजा की लंबाई से निर्धारित होती है, 1024 द्वारा 1024 छवि के लिए लिया गया समय 1024 के लिए 16 छवि के समान होगा। एक वर्ग छवि एक बड़े क्षेत्र को पुनरावृत्तियों की समान संख्या में कवर करने की अनुमति देती है।

अलग-अलग कुल्हाड़ियों की गुणवत्ता कम होने की संभावना है

पेपर की धारा 5 में संभावित त्रुटियों का वर्णन है। प्रत्येक पिक्सेल प्रत्येक दूसरे पिक्सेल से एक पथ द्वारा पहुंच योग्य होता है, लेकिन कुछ पथ सही निकटतम बीज नहीं लाते हैं, उस बीज के पथ में पिछले पिक्सेल के निकटतम नहीं होने के कारण। एक पिक्सेल जो एक बीज को अतीत में प्रचारित करने की अनुमति नहीं देता है, उसे उस बीज को "मार" दिया जाता है। यदि किसी पिक्सेल के निकटतम बीज को उस पिक्सेल के सभी रास्तों पर मार दिया जाता है, तो पिक्सेल कुछ अन्य बीज रिकॉर्ड करेगा और अंतिम छवि में एक गलत रंग होगा।

केवल एक पथ मौजूद होना चाहिए जो अंतिम परिणाम को सही करने के लिए बीज को नहीं मारता है। गलत रंग केवल तब होते हैं जब सही बीज से किसी दिए गए पिक्सेल के सभी रास्ते अवरुद्ध हो जाते हैं।

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

अलग-अलग कुल्हाड़ियों को एल्गोरिथ्म को लंबे समय तक ले जाने की संभावना है

दक्षता शायद कुल्हाड़ियों को अलग करने से कम हो जाएगी, क्योंकि बाढ़ अब समानांतर में नहीं होगी, बल्कि प्रत्येक धुरी के लिए दोहराई जाएगी। 2 डी के लिए यह संभवतः लगभग दोगुना लंबा और 3 डी के लिए लगभग 3 गुना लंबा होगा।

यह विकर्ण कूद की कमी से कुछ हद तक कम हो सकता है, लेकिन मैं अभी भी दक्षता में समग्र कमी की उम्मीद करूंगा।


1
मैंने इनमें से कुछ के साथ प्रयोग करना शुरू कर दिया है। मैंने पाया है कि पूर्ण 9 के बजाय एक + चिन्ह (5 पढ़ता है) में नमूना लेने से मेरे परीक्षण में कोई अंतर नहीं दिखा, लेकिन अधिक जटिल परिस्थितियों के साथ निश्चित रूप से अंतर होता है। एक पूर्ण x jfa और फिर एक पूर्ण y jfa करने से बहुत सारी त्रुटियां होती हैं। यदि आपके पास है, तो मुझे अधिक विवरण / जानकारी सुनने में दिलचस्पी होगी, लेकिन आपके उत्तर को स्वीकार करते हुए: पी
एलन वोल्फ

1
भूल गए, यहाँ मेरे एक प्रयोग का लिंक है: shadertoy.com/view/Mdy3D3
एलन वोल्फ

दिलचस्प है कि यह केवल 5 रीड्स के साथ-साथ स्पष्ट रूप से काम करता है - खासकर जब से उन्हें समानांतर नहीं किया जा सकता है। चूंकि पेपर उन मामलों को सूचीबद्ध करता है जो त्रुटि की ओर ले जाते हैं, शायद आप जानबूझकर इन्हें सेट कर सकते हैं और देख सकते हैं कि क्या 5 कूद निर्देश अभी भी उतना ही अच्छा है।
त्रिकोप्लक्स

लगता है कि आप अपना जवाब पोस्ट करने के लिए तैयार हैं ...
ट्राइकोप्लेक्स

मेरी जानकारी आपका पूरक है: P
एलन वोल्फ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.