2009-11-12 9 views
16

मेरे पास एक सेंसर से एक रंग (आरजीबी) पढ़ा जा रहा है। मेरे पास "ज्ञात" रंगों की एक सूची भी है, प्रत्येक स्ट्रिंग नाम के साथ जोड़ा गया है।किसी सरणी में किसी अन्य रंग में निकटतम रंग खोजने के लिए सबसे अच्छा एल्गोरिदम क्या है?

इस सूची के नजदीकी रंग का नाम खींचने के लिए सबसे अच्छा तरीका (यानी मानव चुनने वाले रंगों की तरह व्यवहार करना) क्या होगा?

मैंने आरजीबी के साथ एक छोटी सी कार्टेशियन दूरी की कोशिश की है, लेकिन यह भूरे या सफेद से भूरे रंग के करीब भूरे रंग के करीब बनाता है।

+1

मेरा मानना ​​है कि इससे मदद मिल सकती है (बहुत ही समान समस्या): http://stackoverflow.com/questions/1678457/best-algorithm-for-matching-colours/1678498#1678498 – Rooke

उत्तर

19

आरजीबी का उपयोग करने के बजाय, HSL (Hue, Saturation, Lightness) or HSV (Hue, Saturation and Value) रंग मॉडल का उपयोग करने का प्रयास करें। फिर पूर्वाग्रह के विभिन्न तत्वों के साथ प्रयोग करें, उदा। जब आप दूरी की गणना कर रहे हों तो ल्यूमिनेंस से अधिक महत्वपूर्ण हो रहा है।

+0

@AlbertRenshaw: मुझे सच में यकीन नहीं है कि जानकारी आपकी टिप्पणी का मतलब है ... –

+4

इसके अलावा, अगर यह किसी और की मदद करता है ... मुझे एचयूई को 47.5% महत्व देते हुए, मेरे 28.75% महत्व, और ब्रिताननेस 23.75% महत्व देने पर मेरे ऐप में सबसे अच्छे परिणाम मिलते हैं। –

+0

@AlbertRenshaw: हालांकि भाषा/मंच में क्या? मेरा अनुमान उद्देश्य-सी है ... लेकिन सवाल में शामिल मंच का बिल्कुल कोई संकेत नहीं है। –

3

मुझे लगता है कि यदि आप 3-स्पेस में आरजीबी निर्देशांक के रूप में रंगों का इलाज करते हैं और समेकित से ज्ञात मूल्यों से दूरी की गणना करते हैं, तो आप निकटतम मैच निर्धारित कर सकते हैं। मैं शायद आंख संवेदनशीलता (यानी, वाई = 0.3 * आर + 0.5 9 * जी + 0.11 * बी) के अनुसार आर जी बी को स्केल करने का प्रयास करता हूं, आपको सबसे अच्छा परिणाम

+3

आरजीबी का उपयोग करने और दो रंगों के बीच परिमाण को खोजने का एकमात्र मुद्दा यह है कि आयाम दो रंगों के समान समान हो सकता है, लेकिन रंग की तुलना में दिशाओं के विरोध में। उदाहरण के लिए (सादगी के लिए, यह खाते में आंख संवेदनशीलता के लिए स्केलिंग नहीं लेता है): यदि आरजीबी 0xFF0000 है, और इसकी तुलना 0x00FF00 और 0x0000FF के मुकाबले की जाती है, तो परिमाण समान होते हैं, लेकिन नीले रंग से लाल रंग के करीब हरे रंग के होते हैं? –

7

जॉन स्कीट सही है। यदि आप मैच के रंग घटक के बारे में चिंतित हैं तो आपको आरजीबी के बजाय घटक के रूप में ह्यू के साथ एक सिस्टम का उपयोग करने की आवश्यकता है। एचएसएल या एचएसवी दोनों इस उद्देश्य के लिए ठीक काम करेंगे।

तब आपको परिणामों के साथ खुश होने तक वजन बढ़ाने के लिए दूरी सूत्र के साथ परेशान करने की आवश्यकता है। ध्यान दें कि आप पाएंगे कि समस्या वास्तव में अनिवार्य रूप से अघुलनशील है जब तक कि आपके पास मिलान करने के लिए बड़ी संख्या में रंग न हों या आपके इनपुट रंग संभावित मानों की एक छोटी सी सीमा तक ही सीमित हों। ऐसा इसलिए है क्योंकि यद्यपि ऐसा लगता है कि आप किसी भी रंग को पिन कर सकते हैं जिसे आप 8 (लाल, नारंगी पीला, हरा, नीला, बैंगनी, काला और सफेद) में से एक या 16 में से एक में जोड़ सकते हैं, वास्तव में आपको पता चल जाएगा कि आपका एल्गोरिदम हमेशा मिलेगा जो स्पष्ट रूप से गलत मिलान प्रतीत होता है क्योंकि आंदोलन के 3 अक्ष (रंग, संतृप्ति, मूल्य या लाल, हरा, नीला) के साथ, पहले नज़र में आप सोच सकते हैं उससे कहीं अधिक "मूल" रंग हैं।

+1

विचार यह है कि सेंसर रंगों की सूची में "निकटतम" रंग पाता है। इस समस्या का उपयोग एक रोबोट है जिसे सफेद पृष्ठभूमि पर 4 पूर्वनिर्धारित रंगों के स्प्लोज़ का पता लगाना चाहिए। – Eric

+2

"निकटतम" साधनों पर निर्भर करता है। आपके मूल कोड में आरजीबी आरएमएस त्रुटि द्वारा ग्रीन ग्रे के निकटतम था। तो क्या यह गलत था? यह देखते हुए कि आप हां कहते हैं, आप रंग धारणा के आधार पर निकटतम के किसी अन्य प्रकार के विचार को स्पष्ट रूप से लागू कर रहे हैं। और मैं आपको बता रहा हूं कि आप पाएंगे कि आप परिणाम के साथ वास्तव में खुश नहीं हैं जब तक कि आपके पास मिलान करने के लिए 64 अच्छी तरह से चुने गए रंगों की तरह कुछ न हो। कम से कम मानव आंखों के लिए। आपके कोड को प्रस्तुत करने के लिए 4 पूर्व निर्धारित स्प्लोट की तुलना करने के लिए काम करना चाहिए, मानते हैं कि स्प्लॉच एक-दूसरे की तरह बहुत ज्यादा नहीं दिखते हैं। –

संबंधित मुद्दे