2012-02-14 16 views
6

उन लोगों के लिए जो गिंप के "कलर टू अल्फा" फीचर से परिचित नहीं हैं, यहां गिंप के प्रलेखन से यह पृष्ठ है: Color to Alpha। यह वास्तव में एक अच्छा काम करता है, और मुझे आश्चर्य है कि वास्तव में गिंप रंगीन हेरफेर के मामले में कैसे करता है, रंगों में रंगीन रंग भी हो सकता है। धन्यवाद किसी भी संकेत के लिए एक गुच्छा।गिंप के "कलर टू अल्फा" फीचर के पीछे क्या एल्गोरिदम है?

संपादित करें 1:, कुंजी रंग के साथ इसकी समानता (एक आप में संवाद "अल्फा के लिए रंग" का चयन करें) पर आधारित एक पिक्सेल के लिए पारदर्शिता सूचना तैयार हो कुछ लोक की तरह किसी कारण से उसके जवाब को हटाने से पहले का सुझाव दिया, एक अच्छी अंतर्दृष्टि की तरह लग रहा है, लेकिन मुझे लगता है कि यह उससे अधिक जटिल है। आइए मान लें कि हम यूनिट रेंज में 0.0 से 1.0 तक रंग समानता का अनुमान लगाते हैं और हमारे पास एक पिक्सेल है जिसका रंग है, उदाहरण के लिए, 0.4, सफेद रंग का रंग, जैसा कि आप "रंग से" अल्फा "संवाद) और इसलिए पिक्सेल को 0.6 का अल्फा मान मिलता है, तो आप पिक्सेल के वास्तविक रंग को चमक/चमकदारता/संतृप्ति के ढीले को क्षतिपूर्ति करने के लिए कैसे बदलेंगे जब परिणामस्वरूप पिक्सेल 0.6 के अल्फा के साथ एक सफेद पृष्ठभूमि के खिलाफ प्रदर्शित होता है?

संपादित करें 2: वास्तव में एक अद्यतन: उप सवाल पहले संपादन से संबंधित How to change the alpha of a pixel without changing the resulting color? में जवाब दिया गया है लेकिन यह शायद पूरी कहानी नहीं है, क्योंकि जो के लिए "अल्फ़ा के रंग" Gimp के स्रोत में चल रहा है सुविधा इतना आसान नहीं है और सूत्र के बजाए एक विशिष्ट एल्गोरिदम पर आधारित प्रतीत होता है।

+0

संबंधित प्रश्न: http://stackoverflow.com/questions/9282714/how-to-change-the-alpha-of-a-pixel-without-changing-the-resulting-color –

+0

@MarkRansom मुझे पता है कि सवाल यह है कि आपने एक लिंक पोस्ट किया है, जिसने मुझसे पूछा था कि सवाल मुझे था! :) और भले ही आपका फॉर्मूला इस गिंप की सुविधा के प्रभाव को प्राप्त कर सके, फिर भी रहस्य तब भी है जब मैंने गिंप के स्रोतों में जो देखा, उसकी जटिलता आपके सूत्र के मुकाबले ज्यादा है। –

+0

@MarkRansom निरंतर: लेकिन आपका दृष्टिकोण जिम्प की तुलना में अधिक लचीला प्रतीत होता है, समीकरणों की एक पुनर्लेखित प्रणाली के समाधान के साथ, कोई एक रंग की पृष्ठभूमि से एक छवि को "काट" सकता है और इसे किसी अन्य रंग की पृष्ठभूमि पर रख सकता है , और छवि अभी भी वही दिखाई देगी। तो मुझे लगता है कि इस सवाल में अब कोई और बात नहीं है, इसलिए यदि कोई भी बुरा नहीं मानता है तो मैं इस प्रश्न को हटाने के लिए पंजीकृत करूँगा। –

उत्तर

1

आपको रंगों की समानता की तुलना करने के लिए एक तंत्र के साथ आने की आवश्यकता है। कई रंग रिक्त स्थान हैं जिनमें आप यह कर सकते हैं। आरजीबी अक्सर इस तरह की चीज के लिए सबसे अच्छा नहीं है। लेकिन आप एचएसवी, वाईसीबीसीआर, या कुछ अन्य लुमा/क्रोमो स्पेस का उपयोग कर सकते हैं। अक्सर उन रिक्त स्थानों में से एक दूरी आपको आरजीबी में यूक्लिडियन दूरी की तुलना में बेहतर उत्तर देगी। एक बार आपके पास दूरी हो जाने के बाद, आप प्रतिशत प्राप्त करने के लिए अधिकतम दूरी से विभाजित कर सकते हैं। वह प्रतिशत अल्फा के विपरीत होगा जिसे आप उपयोग करना चाहते हैं, एक संभावना के रूप में।

यदि आप जानना चाहते हैं कि जीआईएमपी कैसे करता है, तो आप स्रोत को देख सकते हैं। उदाहरण के लिए, here's one recent code change उस प्लग-इन में।

+0

धन्यवाद, लेकिन मैंने पहले से ही स्रोत देखा है और यह पर्याप्त रूप से सरल नहीं था और खराब दस्तावेज था। और आपके उत्तर के पहले भाग में जो लिखा जा रहा है, वह पहले से ही मेरे प्रश्न के संस्करण में संबोधित है, जो कि सरल शब्दों में है कि दो रंगों के बीच समानता का आकलन करना मुश्किल नहीं है, बल्कि पिक्सेल के रंग के साथ क्या करना है जिसका अल्फा 1.0 से कुछ अन्य मूल्य में बदल गया है, जो वास्तव में जटिल नहीं है: http://stackoverflow.com/questions/9282714/how-to-change-the-alpha-of-a-pixel-without-changing -उत्पादन-रंग –

+0

आपको गिंप के बारे में पता चल रहा है। क्या आप मेरे प्रश्न [यहां] (http://stackoverflow.com/questions/29147244/gimp-colorization-technique) का जवाब देने के लिए पर्याप्त प्रकार हो सकते हैं? –

+0

ऐसा प्रतीत होता है कि प्रश्न हटा दिया गया है, इसलिए मुझे नहीं पता कि वास्तविक सवाल क्या था। माफ़ कीजिये! – user1118321

8

मैंने स्रोत कोड पर एक नज़र डाली, और इसका मांस colortoalpha फ़ंक्शन है। पैरामीटर * ए 1 से * ए 4 क्रमशः इनपुट/आउटपुट लाल, हरा, नीला और अल्फा है, और सी 1 से सी 3 अल्फा बनाने के लिए रंग है।

जब आप किसी विशिष्ट अल्फा के साथ दो रंगों C1 और C2 मेल कर रहे हैं एक (≤ 0 एक ≤ 1), परिणाम

y = a * c1 + (1-a) * c2 

यहाँ हम रिवर्स आपरेशन कर रहे है: हम अंत में पता है परिणाम वाई और पृष्ठभूमि रंग सी 2, और सी 1 और ए को समझना चाहते हैं। चूंकि यह एक निर्दिष्ट निर्दिष्ट समीकरण है, इसलिए असीमित समाधान हैं। हालांकि, श्रेणियों 0 ≤ सी 1 ≤ 255 और 0 ≤ एक ≤ 1 समाधान में सीमा जोड़ता है।

जिस तरह से गिंप प्लगइन काम करता है वह यह है कि प्रत्येक पिक्सेल के लिए यह अल्फा मान को कम करता है (यानी पारदर्शिता को अधिकतम करता है)। इसके विपरीत, इसका मतलब है कि प्रत्येक परिणामी पिक्सेल के लिए जो पूरी तरह से पारदर्शी नहीं है (यानी बिल्कुल पृष्ठभूमि रंग नहीं था), आरजीबी घटकों में से एक या तो 0 या 255 है।

यह एक ऐसी छवि उत्पन्न करता है जो शीर्ष पर ओवरलेड हो निर्दिष्ट रंग मूल छवि (गोल करने वाली त्रुटियों की अनुपस्थिति में) का उत्पादन करेगा और प्रत्येक पिक्सेल के लिए अधिकतम पारदर्शिता होगी।

यह ध्यान देने योग्य है कि पूरी प्रक्रिया आरजीबी रंग की जगह में की जाती है, लेकिन अन्य लोगों में भी प्रदर्शन किया जा सकता है, जब तक कि संयोजन रंग उसी रंग की जगह में किया जाता है।

1

तो मैं GIMP source code में देखा ... ew! मैंने इसे सामान्य और पठनीय बना दिया। हालांकि अभी भी काफी तेज है। गणित स्पष्टीकरण के लिए Sampo's answer देखें। यहाँ सी # कार्यान्वयन (C/C++ करने के लिए आसान परिवर्तनीय) है:

static class PixelShaders { 

    /// <summary> 
    /// Generic color space color to alpha. 
    /// </summary> 
    /// <param name="pA">Pixel alpha.</param> 
    /// <param name="p1">Pixel 1st channel.</param> 
    /// <param name="p2">Pixel 2nd channel.</param> 
    /// <param name="p3">Pixel 3rd channel.</param> 
    /// <param name="r1">Reference 1st channel.</param> 
    /// <param name="r2">Reference 2nd channel.</param> 
    /// <param name="r3">Reference 3rd channel.</param> 
    /// <param name="mA">Maximum alpha value.</param> 
    /// <param name="mX">Maximum channel value.</param> 
    static void GColorToAlpha(ref double pA, ref double p1, ref double p2, ref double p3, double r1, double r2, double r3, double mA = 1.0, double mX = 1.0) { 
     double aA, a1, a2, a3; 
     // a1 calculation: minimal alpha giving r1 from p1 
     if (p1 > r1) a1 = mA * (p1 - r1)/(mX - r1); 
     else if (p1 < r1) a1 = mA * (r1 - p1)/r1; 
     else a1 = 0.0; 
     // a2 calculation: minimal alpha giving r2 from p2 
     if (p2 > r2) a2 = mA * (p2 - r2)/(mX - r2); 
     else if (p2 < r2) a2 = mA * (r2 - p2)/r2; 
     else a2 = 0.0; 
     // a3 calculation: minimal alpha giving r3 from p3 
     if (p3 > r3) a3 = mA * (p3 - r3)/(mX - r3); 
     else if (p3 < r3) a3 = mA * (r3 - p3)/r3; 
     else a3 = 0.0; 
     // aA calculation: max(a1, a2, a3) 
     aA = a1; 
     if (a2 > aA) aA = a2; 
     if (a3 > aA) aA = a3; 
     // apply aA to pixel: 
     if (aA >= mA/mX) { 
      pA = aA * pA/mA; 
      p1 = mA * (p1 - r1)/aA + r1; 
      p2 = mA * (p2 - r2)/aA + r2; 
      p3 = mA * (p3 - r3)/aA + r3; 
     } else { 
      pA = 0; 
      p1 = 0; 
      p2 = 0; 
      p3 = 0; 
     } 
    } 

} 

GIMP के कार्यान्वयन (here) आरजीबी रंग अंतरिक्ष का उपयोग करता है, 0 के साथ float के रूप में 1 श्रृंखला के लिए अल्फा मान का उपयोग करता है, और R, G से float के रूप में बी 0 से 255.

आरजीबी कार्यान्वयन शानदार रूप से विफल रहता है जब छवि में जेपीईजी कलाकृतियां होती हैं, क्योंकि उनका मतलब महत्वहीन रंग विचलन होता है, लेकिन काफी महत्वपूर्ण पूर्ण आर, जी, बी विचलन। एलएबी रंगस्थान का उपयोग करना मामले के लिए चाल करना चाहिए।

तुम सिर्फ छवि से ठोस पृष्ठभूमि को दूर करने के लिए देख रहे हैं, अल्फा एल्गोरिथ्म के लिए रंग एक इष्टतम विकल्प नहीं है। एलएबी रंगस्थान का उपयोग कर प्रत्येक पिक्सेल के लिए रंगस्थान दूरी की गणना करते समय मुझे अच्छे नतीजे मिले। गणना की गई दूरी को मूल छवि के अल्फा चैनल पर लागू किया गया था। इस और कलर से अल्फा के बीच मुख्य अंतर पिक्सल का रंग बदला नहीं जाएगा। पृष्ठभूमि निकालें केवल रंगस्थान अंतर के लिए अल्फा (अस्पष्टता) सेट करता है। अगर पृष्ठभूमि रंग अग्रभूमि छवि में नहीं होता है तो यह अच्छी तरह से काम करता है। अगर ऐसा होता है तो पृष्ठभूमि को हटाया नहीं जा सकता है, या बीएफएस एल्गोरिदम का उपयोग केवल बाहरी पिक्सेल चलने के लिए किया जाना चाहिए (कुछ ऐसा है जैसे कि जीआईएमपी में जादू वंड चयन का उपयोग करना, फिर चयन को हटा देना)। अगर अग्रभूमि छवि पृष्ठभूमि रंग के समान रंग में दोनों छेद और पिक्सल है

पृष्ठभूमि हटाया नहीं जा सकता। ऐसी छवियों को कुछ मैन्युअल प्रसंस्करण की आवश्यकता होती है।

+0

मैंने अभी तक इसका परीक्षण नहीं किया है, लेकिन पहले से ही आपके काम के लिए +1 है;) मुझे इसे एसजीजी छवियों पर लागू करने के लिए अलगो की ज़रूरत है, मुझे इसे करने का कोई समाधान नहीं मिला है ... – abimelex

+0

मुझे आश्चर्य है कि यह क्यों वेक्टर ग्राफिक्स के साथ प्रासंगिक हो। बीटीडब्लू, अब जब मैं इसे देखता हूं तो मुझे आश्चर्य होता है कि 'एमए' और 'एमएक्स' पैरामीटर का क्या अर्थ है। इसमें एलएबी कलर स्पेस रूपांतरणों के लिए आरजीबी की कमी है।यदि कोई रास्टर छवियों से ठोस पृष्ठभूमि को हटाने में रूचि रखता है तो मेरे पास सी # में कुछ कामकाजी कोड है जो मैंने लिखा है (एलएबी कलर स्पेस और बीएफएस अलगो पृष्ठभूमि को हटाते समय ऑब्जेक्ट को बरकरार रखने के लिए)। बस एक और सवाल पूछें, क्योंकि यह केवल "अल्फा रंग" प्रभाव से अधिक है। मैं इसे बुद्धिमान पृष्ठभूमि हटाने के लिए बुलाऊंगा। "हरी स्क्रीन" चित्रों के लिए अच्छा है। – Harry