2012-06-21 18 views
5

मैं 4 रंग है कि मैं आरजीबी से परिवर्तित CIELAB को एल * एक * ख * मॉडल है।सीआईईएलबीएल एल * ए * बी * मॉडल में परिभाषित 4 रंगों के मिश्रण की गणना कैसे करें?

  1. मैं इन 4 रंगों के मिश्रण की गणना कैसे कर सकते हैं जब मैं ऐसे प्रत्येक रंग के लिए (L,a,b) है?

  2. मैं उसी मिश्रण की गणना कैसे कर सकता हूं, अगर मैं ऐसे 4 रंगों पर वजन (w1, w2, w3, w4) रखना चाहता हूं, जिसमें 1 अधिकतम और 0 न्यूनतम (कोई नहीं) वजन है?

+4

आप इस मिश्रण को उत्पादन करने की क्या उम्मीद करते हैं? वजन घटाने के साथ आप 4 रंगों को घटक-दर-घटक के साथ औसत कर सकते हैं, और आपको वैध रंग मिलेंगे। लेकिन क्या वे आपके द्वारा अपेक्षित रंग होंगे या अधिक जानकारी के बिना कहना मुश्किल नहीं होगा। क्या आपने बस अपने संबंधित वजन से प्रत्येक को गुणा करने की कोशिश की है, फिर उन्हें घटक-वार और 4 से विभाजित कर रहे हैं? यदि वह आपको वह नहीं देता है जो आप उम्मीद करते हैं, तो क्या आप उम्मीद कर सकते हैं कि आप क्या उम्मीद करते हैं? यदि आप एक तस्वीर पोस्ट करते हैं, तो इससे मदद मिलेगी। – user1118321

+4

क्या आपने प्रोग्रामिंग भाषा टैग का एक गुच्छा शामिल किया है, जितना संभव हो उतने संभावित दर्शक आकर्षित करने की उम्मीद है? – DavidO

+0

@ डेविडो - मैंने उन प्रोग्रामिंग भाषा को शामिल किया जो मैं 10+ सालों से काम करता हूं। –

उत्तर

10

मान लिया जाये कि आप इस तरह से एक संरचना है:

typedef struct LabColor { 
    uint8_t L; 
    uint8_t a; 
    uint8_t b; 
} LabColor; 

और उनमें से 4 की एक सरणी:

LabColor colors[4]; 
getMeSomeColors (colors); 

और वज़न:

float weights[4]; 
getMeSomeWeights (weights); 

एक संभव सम्मिश्रण विधि यह होगी:

float LSum = 0.0; 
float aSum = 0.0; 
float bSum = 0.0; 
float weightSum = 0.0; 
for (int i = 0; i < 4; i++) 
{ 
    LSum += ((float)colors [ i ].L * weights [ i ]); 
    aSum += ((float)colors [ i ].a * weights [ i ]); 
    bSum += ((float)colors [ i ].b * weights [ i ]); 
    weightSum += weights[i]; 
} 
LabColor result; 
result.L = (uint8_t)(LSum/weightSum); 
result.a = (uint8_t)((aSum/weightSum) + 127); 
result.b = (uint8_t)((bSum/weightSum) + 127); 

यह मानता है कि वजन 0 और 1 के बीच हैं। यदि नहीं, तो आपको कुछ क्लैंपिंग करना होगा। यदि वजन 1 तक है, तो आप विभाजन चरण को छोड़ सकते हैं।

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

+0

फ्रो एक [भारित औसत] (https://en.wikipedia.org/wiki/Weighted_mean), आप * वजन के योग * द्वारा विभाजित होते हैं, न कि आप औसत चीज़ों की संख्या। तो आप 'परिणाम' एल = (uint8_t) ((फ्लोट) एलएसयूएम/डब्ल्यूएसयूएम) ', जहां' wSum = वजन [0] + वजन [1] + वजन [2] + वजन [3] '। – Rahul

+0

@RahulNarain अच्छा बिंदु! इसे पकड़ने के लिए धन्यवाद। मैंने इसे ठीक कर दिया है। – user1118321

+0

ए और बी एल * ए * बी * स्पेस में मूल्यों पर हस्ताक्षर किए गए हैं। – ergosys

5

सबसे यथार्थवादी परिणाम आपके L*a*b* मानों को रैखिक (गामा-सही नहीं) RGB स्थान, उन मानों को एकत्रित करने और वापस परिवर्तित करने के लिए परिवर्तित करने से आएंगे। इस प्रकार भौतिक प्रकाश स्रोत बातचीत करते हैं।

L*a*b* रंग स्थान रंग हेरफेर के लिए आविष्कार नहीं किया गया था, के रूप में यह स्वाभाविक गैर रेखीय है।

+0

आरजीबी मिश्रण यथार्थवादी रंग नहीं देगा: http://farm1.static.flickr.com/147/417347616_60b05096f3_o।पीएनजी –

+2

@ user1215106, जिन्होंने "मिश्रण मोड गुणा" के बारे में कुछ भी कहा? मैंने कहा "योग"। यद्यपि आपके मामले में आप "मिश्रण" की तलाश कर रहे हैं, लेकिन इसके लिए प्रत्येक रंग के ऑर्डर और अस्पष्टता को निर्दिष्ट करने की आवश्यकता होती है। –

+0

आरजीबी और सीएमवाईके रंग मॉडल के विपरीत, लैब रंग मानव दृष्टि को अनुमानित करने के लिए डिज़ाइन किया गया है - http://en.wikipedia.org/wiki/CIE_Lab। सीआईई एल * ए * बी * (सीआईईएलएबी) अंतर्राष्ट्रीय आयोग द्वारा रोशनी (फ्रेंच आयोग इंटरनेशनल डी एल'एक्लेयरेज, इसलिए इसकी सीआईई प्रारंभिकता) द्वारा निर्दिष्ट सबसे पूर्ण रंग स्थान है। यह मानव आंखों के लिए दिखाई देने वाले सभी रंगों का वर्णन करता है और संदर्भ के रूप में उपयोग किए जाने वाले डिवाइस स्वतंत्र मॉडल के रूप में कार्य करने के लिए बनाया गया था। –

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