छवि मोज़ाइक बनाने के लिए एल्गोरिदम - क्या इससे भी तेज़ तरीका है?


9

मैं छवि मोज़ाइक बनाने के साथ खेल रहा हूँ। मेरी स्क्रिप्ट बड़ी संख्या में छवियां लेती है, उन्हें थंबनेल आकार में नीचे ले जाती है और फिर लक्ष्य छवि को अनुमानित करने के लिए टाइल्स के रूप में उनका उपयोग करती है।

दृष्टिकोण वास्तव में काफी मनभावन है:

मैं हर टाइल की स्थिति में प्रत्येक अंगूठे के लिए माध्य वर्ग त्रुटि की गणना करता हूं।

सबसे पहले मैंने सिर्फ एक लालची प्लेसमेंट का उपयोग किया: अंगूठे को उस टाइल पर कम से कम त्रुटि के साथ रखा जो इसे सबसे अच्छी तरह से फिट बैठता है, और फिर अगले और इसी तरह।

लालची के साथ समस्या यह है कि यह आपको अंततः कम से कम लोकप्रिय टाइलों पर सबसे अलग अंगूठे रखने की अनुमति देता है, चाहे वे बारीकी से मेल खाते हों या नहीं। मैं यहां उदाहरण दिखाता हूं: http://williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics

इसलिए मैं तब स्क्रिप्ट को बाधित होने तक यादृच्छिक स्वैप करता हूं। परिणाम काफी ठीक हैं।

दो टाइलों का एक यादृच्छिक स्वैप हमेशा एक सुधार नहीं होता है, लेकिन कभी-कभी तीन या अधिक टाइलों के रोटेशन के परिणामस्वरूप वैश्विक सुधार होता है A <-> B, लेकिन A -> B -> C -> A1इसमें सुधार नहीं हो सकता है।

इस कारण से, दो यादृच्छिक टाइल चुनने और उन्हें सुधारने की खोज नहीं करने के बाद, मैं मूल्यांकन करने के लिए टाइल्स का एक गुच्छा उठाता हूं कि क्या वे इस तरह के रोटेशन में तीसरी टाइल हो सकते हैं। मुझे पता नहीं है कि चार टाइलों के किसी भी सेट को लाभप्रद रूप से घुमाया जा सकता है, और इसी तरह; यह जल्द ही सुपर महंगा होगा।

लेकिन इसमें समय लगता है .. बहुत समय!

क्या एक बेहतर और तेज दृष्टिकोण है?


बाउंटी अपडेट

मैंने हंगेरियन विधि के विभिन्न पायथन कार्यान्वयन और बाइंडिंग का परीक्षण किया ।

अब तक सबसे तेज शुद्ध-पायथन https://github.com/xtof-durr/makeSimple/blob/master/Munkres/kuhnMunkres.py था

मेरा कूबड़ यह है कि यह इष्टतम उत्तर का अनुमान लगाता है; जब एक परीक्षण छवि पर चलाया जाता है, तो अन्य सभी पुस्तकालय परिणाम पर सहमत होते हैं लेकिन यह kuhnMunkres.py, परिमाण के आदेशों के तेजी से होने के दौरान, केवल उस स्कोर के बहुत करीब पहुंच गया जिस पर अन्य कार्यान्वयन सहमत थे।

गति बहुत डेटा-निर्भर है; मोना लिसा 13 मिनट में kuhnMunkres.py के माध्यम से दौड़ी, लेकिन स्कारलेट Chested Parakeet को 16 मिनट लगे।

परिणाम पैराकेट के लिए यादृच्छिक स्वैप और घुमाव के समान थे:

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

(बाईं ओर kuhnMunkres.py, दाईं ओर यादृच्छिक स्वैप, तुलना के लिए मूल छवि )

हालाँकि, मैंने जिस मोना लिसा छवि के साथ परीक्षण किया, उसके परिणामों में काफी सुधार हुआ था और उसने वास्तव में अपनी 'मुस्कान' को परिभाषित किया था:

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

(बाईं ओर kuhnMunkres.py, दाईं ओर यादृच्छिक स्वैप)


1
संबंधित ... ish। कोडगॉल्फ तालु परिवर्तन में भी इसी तरह की समस्याएं थीं।

1
और छवियों का एक और संबंधित सेट है allRGB जहां प्रत्येक छवि (हालांकि यह है कि आप बहुत ज्यादा एक संकेत का नहीं देता है कि कैसे यह करने के लिए है ... सिर्फ इतना है कि वहाँ एक और क्षेत्र है जहां इस समस्या से संपर्क किया गया है)।

1
मैं काफी सालों पहले एक मोज़ेक निर्माता के साथ इस समस्या में भाग गया था। तब और अब तर्क करने की मेरी लाइन समस्या आपके एल्गोरिथ्म (MSE भाग) के साथ नहीं है, बल्कि आपके इनपुट छवि पैलेट के सीमित आकार के साथ है। एक अरब छवियों के साथ काम करने के लिए नहीं, मैंने कुछ समय के बाद एक छवि को पुन: उपयोग करने की अनुमति देकर इसे रोक दिया। हालांकि, यदि आप अपने दृष्टिकोण के साथ रखना चाहते हैं, तो "अच्छा" फिट के लिए पहले पास करना अच्छा हो सकता है और फिर बाकी छवियों को यादृच्छिक (या यादृच्छिक-ईश) के रूप में माना जाता है - केवल आपके पास सीमित इनपुट सेट के साथ इतने सारे विकल्प।
जे ट्राना

उस उत्कृष्ट लिंक के लिए @ मिचेल्ट धन्यवाद :) कोडगोल्फ विशेष रूप से आकर्षक है। मुझे लगता है कि वोट किए गए सर्वश्रेष्ठ समाधान यादृच्छिक स्वैप (यादृच्छिक घुमाव नहीं) का उपयोग कर रहे हैं और संभवतः काफी समय से चल रहे हैं ...
विल

1
आपके द्वारा उत्तर चुने जाने और इनाम देने के बाद इस पर आना। एक अलग दृष्टिकोण यह एक नकली एनीलिंग समस्या के रूप में माना जाएगा । आप SA को अपने समाधान पाइपलाइन के चरणों में से एक के रूप में उपयोग कर सकते हैं।
andy256

जवाबों:


3

हां, दो बेहतर और तेज दृष्टिकोण हैं।

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

फिर, आप अंतर्निहित एल्गोरिथ्म को बदले बिना एमएसई को अधिक नेत्रहीन सटीक दूरी द्वारा अपनी लागत को समायोजित कर सकते हैं।


धन्यवाद! एलएपी और हंगेरियन विधि वे लीड थे जिनकी मुझे आवश्यकता थी! प्रश्न में परिणाम के साथ अद्यतन करें।
विल

3

मुझे यकीन है कि यह एक एनपी-कठिन समस्या है। एक 'सही' समाधान खोजने के लिए आपको हर संभावना को पूरी तरह से प्रयास करना होगा, और यह घातीय है।

एक दृष्टिकोण यह होगा कि लालची फिट का उपयोग करें और फिर इसे सुधारने का प्रयास करें। यह बुरी तरह से रखी गई छवि (अंतिम वाले में से एक) को लेने और इसे लगाने के लिए एक और जगह ढूंढने से हो सकता है, फिर उस छवि को ले जा सकता है और इसे आगे बढ़ा सकता है। आपको तब किया जाता है जब आप (ए) रन आउट हो जाते हैं (बी) फिट 'काफी अच्छा' है।

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


हां, यह वही है जो आप पहले से कर रहे हैं। बिंदु एक जादुई उत्तर को भूलना और 2 एल्गोरिदम के संदर्भ में सोचना है: पहले भरें, फिर अनुकूलन करें।

भराव हो सकता है: यादृच्छिक, सबसे अच्छा उपलब्ध, पहला सबसे अच्छा, काफी अच्छा, किसी तरह का गर्म स्थान।

अनुकूलन यादृच्छिक हो सकता है, सबसे खराब को ठीक कर सकता है, या (जैसा कि मैंने सुझाव दिया था) नकली एनालिंग या आनुवंशिक एल्गोरिथ्म।

आपको 'अच्छाई' की मीट्रिक और उस पर खर्च करने के लिए तैयार समय की राशि और केवल प्रयोग करने की आवश्यकता है। या किसी ऐसे व्यक्ति को खोजें जिसने वास्तव में किया है।


आप प्रश्न में वर्णित दृष्टिकोण का सटीक वर्णन करते हैं ...?
विल

1

यदि अंतिम टाइलें आपकी समस्या हैं, तो आपको उन्हें किसी भी तरह जल्दी डालने की कोशिश करनी चाहिए;)

एक दृष्टिकोण उस टाइल को देखना होगा जो अपने मैचों के शीर्ष x% से सबसे दूर है (सहज रूप से मैं 33% के साथ जाऊंगा) और इसे अपने सर्वश्रेष्ठ मैच पर रखूंगा। वैसे भी यह सबसे अच्छा मैच हो सकता है।

इसके अलावा आप सबसे खराब टाइल के लिए सबसे अच्छा मैच का उपयोग नहीं करने का चयन कर सकते हैं, लेकिन यह उस स्लॉट के लिए सबसे अच्छे मैच की तुलना में कम से कम त्रुटि का परिचय देता है, ताकि आप "के लिए अपने सर्वश्रेष्ठ मैचों को पूरी तरह से फेंक न दें" क्षति नियंत्रण"।

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

इसके अलावा जगह में बढ़त का पता लगाने के साथ, आप पहले y% को लालच में रखना चाह सकते हैं (हो सकता है कि जब तक आप बचे हुए टाइल्स में "edginess" की एक निश्चित सीमा से नीचे नहीं गिर जाते), ताकि "हॉट स्पॉट" वास्तव में अच्छी तरह से निपटा जाए, और फिर बाकी के लिए "क्षति नियंत्रण" पर स्विच करें।

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