2010-11-13 20 views
5

मैं दूरी सूत्र का उपयोग करने के लिए करता है, तो रंग तो एक दूसरे से मेल खाता है मेरे पास है खोजने के लिए कहा गया था,ढूँढना निकटतम आरजीबी रंग

struct RGB_SPACE 
{ 
    float R, G, B; 
}; 

RGB_SPACE p = (255, 164, 32); //pre-defined 
RGB_SPACE u = (192, 35, 111); //user defined 

long distance = static_cast<long>(pow(u.R - p.R, 2) + pow(u.G - p.G, 2) + pow(u.B - p.B, 2)); 

यह सिर्फ एक दूरी देता है, लेकिन मैं कैसे पता है कि रंग से मेल खाता होगा उपयोगकर्ता द्वारा परिभाषित कम से कम 25%?

मुझे यकीन नहीं है लेकिन मुझे यह देखने के लिए प्रत्येक रंग मान की जांच करने का विचार है कि अंतर 25% है या नहीं। उदाहरण के लिए।

float R = u.R/p.R * 100; 
float G = u.G/p.G * 100; 
float B = u.B/p.B * 100; 

if (R <= 25 && G <= 25 && B <= 25) 
{ 
    //color matches with pre-defined color. 
} 

उत्तर

7

मैं सुझाव दूंगा कि आरजीबी स्पेस में जांच न करें। यदि आपके पास (0,0,0) और (100,0,0) हैं तो वे कबाबुंग सूत्र के अनुसार समान हैं (साथ ही कैसाब्लांका के अनुसार जो बहुत सारे रंग समान मानते हैं)। हालांकि, वे बहुत अलग दिखते हैं।

HSL and HSV रंग मॉडल रंगों की मानव व्याख्या पर आधारित हैं और आप आसानी से एक दूसरे के स्वतंत्र रूप से रंग, संतृप्ति और चमक के लिए दूरी निर्दिष्ट कर सकते हैं (आपके मामले में "समान" का अर्थ क्या है) के आधार पर।

+0

असल में यह [प्रयोगशाला] है (http: //en.wikipedia।संगठन/विकी/Lab_color_space) अंतरिक्ष जो मानव व्याख्या – zenpoy

2

ध्यान दें कि अधिकतम संभव दूरी (255, 255, 255) और के बीच है (0, 0, 0), जो 3 * 255^2 की दूरी पर हैं। जाहिर है ये दो रंग कम से कम (0% मैच) से मेल खाते हैं और वे दूरी 100% अलग हैं। फिर कम से कम 25% मैच का मतलब 75% से कम दूरी है, यानी 3/4 * 3 * 255^2 = 9/4 * 255 * 255। तो आप बस जांच सकते हैं कि:

distance <= 9/4 * 255 * 255 
+0

अधिकतम दूरी निश्चित रूप से वर्ग है (3 * 255^2)। 25% मैच, मुझे लगता है, इसका मतलब अंतर नहीं होना चाहिए और फिर पूरी श्रृंखला के 1/4। तो अंतिम सूत्र होना चाहिए: दूरी <= sqrt (3)/4 * 255. – cababunga

+0

@ कबाबबुंगा: आप 'वर्ग' के बारे में सही हैं, मैंने अनदेखा किया क्योंकि ओपी ने इसे अपने समीकरण में शामिल नहीं किया था। हालांकि, "कम से कम 25% मैच" का मतलब अभी भी 75% से कम दूरी का मतलब होगा, क्योंकि अधिक दूरी का मतलब कम मिलान है। – casablanca

4

"कम से कम 25% से मेल खाता" एक अच्छी तरह से परिभाषित समस्या नहीं है। क्या कम से कम 25% से मेल खाता है, और मीट्रिक के अनुसार? बहुत सारे संभावित विकल्प हैं। यदि आप आरजीबी रंगों की तुलना करते हैं, तो स्पष्ट वेक्टर मानदंडों से प्राप्त दूरी मीट्रिक्स हैं। तीन सबसे महत्वपूर्ण होते हैं:

  • 1-आदर्श या "मैनहट्टन दूरी": दूरी = पेट (आर 1-r2) + पेट (G1-G2) + पेट (बी 1-बी 2)
  • 2-आदर्श या यूक्लिडियन दूरी: दूरी = वर्ग (पाउ (आर 1-आर 2, 2) + पाउ (जी 1-जी 2, 2) + पाउ (बी 1-बी 2, 2)) (आप इसके वर्ग को गणना करते हैं, जो ठीक है - आप इससे बच सकते हैं sqrt अगर आप थ्रेसहोल्ड को स्क्वायर करके केवल थ्रेसहोल्ड के खिलाफ जांच कर रहे हैं)
  • इन्फिनिटी-मानदंड: दूरी = अधिकतम (abs (r1-r2), abs (g1-g2), abs (b1-b2))

बेशक कई अन्य संभावनाएं हैं। आप जांच सकते हैं कि वे एक-दूसरे की दूरी के भीतर हैं या नहीं: यदि आप एक रंगीन चैनल में 25% अंतर (संभव आरजीबी मूल्यों की सीमा से अधिक) की अनुमति देना चाहते हैं, तो 3 विधियों के लिए उपयोग करने के लिए थ्रेसहोल्ड 3/4 हैं * क्रमशः 255, वर्ग (3)/4 * 255 और 255/4। यद्यपि यह एक बहुत मोटे मीट्रिक है।

रंगों के बीच दूरी को मापने का एक बेहतर तरीका है अपने रंगों को एक अवधारणात्मक वर्दी रंग स्थान जैसे CIELAB में परिवर्तित करना और वहां तुलना करना; इस विषय पर भी काफी अच्छा Wikipedia article है। यह आपके इच्छित अनुप्रयोग के आधार पर अधिक हो सकता है, लेकिन वे रंग रिक्त स्थान हैं जहां मापा दूरी मानव मानव प्रणाली द्वारा महसूस की गई दूरी के साथ सबसे अच्छा सहसंबंध है।

+0

+1 पर आधारित है। आप अपने खुद के एक अच्छे सवाल के साथ जवाब देते हैं! – augustin

+0

मेरा मतलब है कि उपयोगकर्ता द्वारा परिभाषित रंग कम परिभाषित रंग से कम से कम 25% से मेल खाता है। – user963241

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