2013-07-06 13 views
5

मैं रंगों की एक अनिर्दिष्ट संख्या के औसत को खोजने का एक तरीका ढूंढ रहा हूं। मैंने ऐसा करने के लिए एक रास्ता तलाशने में काफी समय बिताया। सबसे पहले मैंने अपने रंगों को सीएमवाईके में बदलने और उन्हें औसत करने की कोशिश की, लेकिन इससे मुझे अपेक्षित नतीजे नहीं मिले। तब मैंने देखा कि कई अलग-अलग स्थानों में, रंगों को सीआईई एल * ए * बी * स्पेस में परिवर्तित करना और फिर औसत करना यह करने का पसंदीदा तरीका है। इसलिए मैंने देखा कि आरजीबी रंगों को एलएबी स्पेस में कैसे परिवर्तित किया जाए और ऐसा करने के लिए जावास्क्रिप्ट को आवश्यक एल्गोरिदम में परिवर्तित किया जाए।मुझे एन रंगों का औसत कैसे मिल सकता है?

अब जब कि मैं प्रयोगशाला अंतरिक्ष में अपना रंग, मैंने सोचा कि यह मेरे रंग की औसत खोजने के रूप में सरल हो सकता है, तो मैं चाल करने के लिए इस समारोह ने लिखा है:

color.mixRGB = function() { 
    var cols = Array.prototype.slice.call(arguments), 
     i = cols.length, 
     lab = {l: 0, a: 0, b: 0}; 

    while(i--) { 
     if (typeof cols[i].r === "undefined" && typeof cols[i].g === "undefined" && typeof cols[i] === "undefined") { 
      console.log("Not enough parameters supplied for color " + i + "."); 
      return; 
     } 

     if(cols[i].r === 0 && cols[i].g === 0 && cols[i].b === 0) { 
      cols.splice(i, 1); 
     } else { 
      cols[i] = color.RGBtoLAB(cols[i]); 
      lab.l += cols[i].l; 
      lab.a += cols[i].a; 
      lab.b += cols[i].b;    
     } 
    } 

    lab.l /= cols.length; 
    lab.a /= cols.length; 
    lab.b /= cols.length; 

    return color.LABtoRGB(lab); 
}; 

अगर मैं प्रवेश आरजीबी (255, 0, 0) और आरजीबी (0, 0, 255) फ़ंक्शन में, मुझे आरजीबी (202, -59, 136) मिलता है। यह रंग रंग हेक्सा का कहना है कि उन दो आरजीबी का औसत है, जो आरजीबी (128, 0, 128), ए.के.ए. बैंगनी है।

मैं वापस अपने सभी कोड पर चला गया, और अब तक मैं निर्धारित करने के लिए है कि समस्या डबल और उन्हें Color Hexa और EasyRGB के खिलाफ ट्रिपल जाँच करके मेरी रूपांतरण एल्गोरिदम से किसी के साथ झूठ नहीं करता है प्रबंधित किया है। इसका मतलब है या तो ए) इस मुद्दे को झूठ बोलना चाहिए कि मैं रंगों का औसत कैसे कर रहा हूं या बी) मुझे गलत जानकारी मिली है और मुझे सीआईई एल * ए * बी * स्पेस में रंगों को मिश्रण करने का प्रयास नहीं करना चाहिए।

मुझे वास्तव में क्या याद आ रहा है? मेरे वर्तमान एल्गोरिदम का उपयोग करके, औसत आरजीबी (255, 0, 0) और आरजीबी (0, 0, 255) औसत क्यों नहीं है जो मुझे रंग हेक्सा (या यहां तक ​​कि दृश्य अनुमान) प्रदान करता है? (here's a fiddle मेरी समस्या का)

+2

एक रंगीन स्थान में औसत एक अलग रंग स्थान में औसत के समान नहीं है। एक ही परिणाम की उम्मीद नहीं करेगा। –

+0

मैं समझता हूं; यह प्रासंगिक क्यों है? –

+1

क्योंकि आप आश्चर्यचकित हैं कि आप अलग-अलग परिणाम प्राप्त कर रहे हैं;) (हालांकि संभवतः मैं चीजों को गलत तरीके से पढ़ रहा हूं ...) –

उत्तर

3

मान लें कि आपके रंग R0, G0, B0 और R1, G1, B1 द्वारा परिभाषित किए गए हैं। फिर मिश्रित/औसत रंग में निम्नलिखित आरजीबी मान होंगे:

RA = (R0+R1)/2; 
GA = (G0+G1)/2; 
BA = (B0+B1)/2; 

मूल रूप से यह है।

+0

मुझे लगता है कि मुझे कुछ याद आना चाहिए। क्या यह वास्तव में इतना आसान हो सकता है? मैंने इस अलगो को कोड किया और मैं बस थोड़ा परीक्षण कर रहा हूं। –

+0

ठीक है, यह रंग हेक्सा रास्ता है। यदि आप मुझसे पूछें तो सही नहीं है। एचएलएस या एचएसबी कलर स्पेस में ऐसा करने का प्रयास करें। इसके लिए लाब भ्रमित हो सकता है। –

+0

अच्छा, ऐसा लगता है कि यह चाल है (यह निश्चित रूप से मुझे चाहिए)। मुझे लगता है कि मैं अभी आपके उत्तर को स्वीकार करने जा रहा हूं। सामान्य ज्ञान की आवाज होने के लिए धन्यवाद, जबकि मैं अत्यधिक जटिल रंग रिक्त स्थान के बारे में चिंतित था। :-) –

2

एक शून्य वापसी का मतलब है कि एक त्रुटि हुई है।

color.mixRGB = function() { 
    var cols = Array.prototype.slice.call(arguments), 
     i = cols.length, 
     rTotal = 0, gTotal = 0, rTotal = 0, colTotal = 0; 

    while(i--) { 
     // NOTE: you had && in your code, I think they should be || 
     if (typeof cols[i].r === "undefined" || typeof cols[i].g === "undefined" || typeof cols[i] === "undefined") { 
      console.log("Not enough parameters supplied for color " + i + "."); 
      return null; 
     } 
     colTotal++; 
     rTotal += cols[i].r; 
     gTotal += cols[i].g; 
     bTotal += cols[i].b; 
    } 
    if(colTotal === 0) return null; 

    // I am not sure what you are trying to return, just build it up with your rgb values 
    return (new color(Math.round(rTotal/colTotal), Math.round(gTotal/colTotal), Math.round(bTotal/colTotal))); 
}; 
संबंधित मुद्दे