2009-11-05 18 views
27

मेरे पास आरजीबी प्रारूप में लगभग 200 रंगों की एक सरणी है। मैं एक ऐसा प्रोग्राम लिखना चाहता हूं जो किसी भी आरजीबी रंग लेता है और उस सरणी से रंग मिलान करने का प्रयास करता है जो सबसे अधिक "समान" है।सर्वश्रेष्ठ एल्गोरिदम।

मुझे "समान" के लिए एक अच्छी परिभाषा की आवश्यकता है, जो मानव धारणा के लिए जितना संभव हो उतना करीब है।

मैं सटीकता मिलान करने के बारे में कुछ जानकारी भी दिखाना चाहता हूं। उदाहरण के लिए काला-सफेद: 100% और एक समान रंग के लिए थोड़ा अलग रंग: -4%।

क्या मुझे तंत्रिका नेटवर्क का उपयोग करने की आवश्यकता है? क्या कोई आसान विकल्प है?

+0

क्या एक अच्छा समानता समारोह हो सकता है के रूप में एक सुझाव के बारे में सवाल है, या यह एक एल्गोरिथ्म जल्दी से सरणी में सबसे अधिक समान रंग (रों) खोजने के लिए के बारे में, एक दे रंग के सापेक्ष है ? – mjv

+0

दोनों। अगर पहले मुझे क्रेटिंग एल्गोरिदम का प्रयास करने से पहले समानता की कुछ परिभाषा की आवश्यकता है। मुझे लगता है कि "अवधारणात्मक रूप से समान" मैं जो खोज रहा था। –

उत्तर

34

Convert CIE Lab color space करने के लिए रंग के सभी और दूरी की गणना है कि अंतरिक्ष में सबसे कम deltaE साथ

deltaE = sqrt(deltaL^2 + deltaA^2 + deltaB^2) 

रंग सबसे perceptually एक दूसरे के समान हैं।

+0

धन्यवाद, यह वही है जो मुझे चाहिए। –

+11

ध्यान रखें कि आपको sqrt - sqrt एक बढ़ती हुई कार्य करने की आवश्यकता नहीं है, इसलिए यह चरण अनिवार्य है। – Rooke

+2

आप सही हैं, अगर आप सॉर्टिंग से ज्यादा कुछ नहीं कर रहे हैं, तो दूरी का वर्ग दूरी जितना अच्छा होगा। यदि आप "कितना अलग" की तुलना करना चाहते हैं, तो इसे छोड़ दें। – hobbs

4

नहीं, आपको यहां तंत्रिका नेटवर्क की आवश्यकता नहीं है! बस एक एचएसएल रंग मूल्य एक वेक्टर पर विचार करने और इस तरह वेक्टर के लिए एक भारित मापांक समारोह को परिभाषित:

modulus = sqrt(a*H1*H1 + b*S1*S1 + c*L1*L1); 

where a,b,c are weights you should decide based on your visual definition of what 
creates a bigger difference in perceived color - a 1% change in Hue or a 1% 
change in Saturation 

मैं आप का उपयोग a = b = 0.5 और ग = 1

अंत में, यह पता लगाने के सुझाव अपने मॉड्यूलस को समान रंगों को लेना और परिभाषित करना होगा, जिनके पास मॉड्यूलि एक-दूसरे के करीब है (5% कहें)

+2

यह एक अच्छा आसान विकल्प है। आरजीबी से रूपांतरण एचएसएल से आरजीबी से लैब में रूपांतरण की तुलना में बहुत आसान है। :) – hobbs

+0

ठीक है, तो मैं इसे पहले कोशिश करूंगा। –

+0

क्रिमसन, क्या आप कर सकते हैं आप वहां अपने मॉड्यूलस पर गणित की जांच करते हैं? मुझे नहीं लगता कि यह सही है। आप कुछ और चाहते हैं 'ए * (एच 1 - एच 2) ** 2 + '..., हाँ? – hobbs

1

मैं least squares विधि को थोड़ा सा सरल मानता हूं, जैसा कि थोड़ा सा सरल है। यही है, आप एक संख्या का अंतर लेते हैं, इसे चौकोर करते हैं, फिर इन सभी वर्गों के अंतर को जोड़ते हैं।

0

मैं इस चीज़ की तलाश में था लेकिन मुझे बहुत कम जवाब नहीं मिला, मैंने इस छोटी पुस्तकालय को बनाने का फैसला किया।

https://github.com/sebastienjouhans/c-sharp-colour-utilities

+0

कृपया अपने स्वयं के काम को बढ़ावा देने वाले उत्तरों को पोस्ट करते समय बहुत सावधान रहें। सुनिश्चित करें कि आप वास्तव में यहां प्रश्न का उत्तर देते हैं और केवल अपने ब्लॉग/स्रोत का उपयोग बैकअप और संदर्भ के रूप में करते हैं। फिलहाल यह स्पैम के रूप में फ़्लैग होने की संभावना है। – ChrisF

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