फ़ोटोशॉप के "ब्लैक एंड व्हाइट" समायोजन परत के पीछे एल्गोरिदम क्या है?


11

क्या कोई फ़ोटोशॉप में "ब्लैक एंड व्हाइट" समायोजन परत के पीछे एल्गोरिथ्म की व्याख्या कर सकता है?

फोटोशॉप स्क्रीनशॉट

मुझे एक एप्लिकेशन के लिए C ++ का उपयोग करके इसे पुन: प्रस्तुत करना होगा जो छवि से गैर-लाल / मैजेंटा (ईश) पिक्सल पर जोर देता है (एक प्रतिशत की तरह कॉन्फ़िगर करने योग्य सहिष्णुता के साथ), और इस संसाधन ने वह व्यवहार दिखाया जिसकी मुझे उम्मीद है।


फिर भी इसे पुन: पेश नहीं किया जा सका, लेकिन मुझे एक सुराग मिला:

प्रत्येक पिक्सेल को दो नियंत्रणों तक परिभाषित किया जाता है, एक एडिटिव (RGB) और एक सबट्रेक्टिव (CMY)।


क्या आपको कभी भी एल्गोरिथ्म का पता लगाने के लिए करीब से जाना गया? मैं यह पता लगाने की कोशिश कर रहा हूँ।
पीज़ाफ़िल्म्स

नहीं, मैंने नहीं किया: /
Blamoo

जवाबों:


4

मैंने MATLAB में एल्गोरिथ्म को पूरी तरह से दोहराया (@ इवान कुकिर के उत्तर पर आधारित ):

function [ mO ] = ApplyBlackWhiteFilter( mI, vCoeffValues )

FALSE   = 0;
TRUE    = 1;

OFF = 0;
ON  = 1;

numRows = size(mI, 1);
numCols = size(mI, 2);
dataClass = class(mI);

numCoeff    = size(vCoeffValues, 1);
hueRadius   = 1 / numCoeff;
vHueVal     = [0:(numCoeff - 1)] * hueRadius;

mHsl = ConvertRgbToHsl(mI);
mO = zeros(numRows, numCols, dataClass);

vCoeffValues = numCoeff * vCoeffValues;

for jj = 1:numCols
    for ii = 1:numRows
        hueVal = mHsl(ii, jj, 1);
        lumCoeff = 0;

        % For kk = 1 we're dealing with circular distance
        diffVal     = min(abs(vHueVal(1) - hueVal), abs(1 - hueVal));
        lumCoeff    = lumCoeff + (vCoeffValues(1) * max(0, hueRadius - diffVal));
        for kk = 2:numCoeff
            lumCoeff = lumCoeff + (vCoeffValues(kk) * max(0, hueRadius - abs(vHueVal(kk) - hueVal)));
        end

        mO(ii, jj) = mHsl(ii, jj, 3) * (1 + lumCoeff);
    end
end


end

वेतन ध्यान से रूपांतरण vPhotoshopValuesकरने के लिए vCoeffValuesके रूप में किया जाना चाहिए vCoeffValues = (vPhotoshopValues - 50) ./ 50
जैसा कि फ़ोटोशॉप का मान [-200, 300] में है और इसे [-5, 5] में रैखिक रूप से मैप किया जाना चाहिए 50 -> 0

यहाँ फ़ोटोशॉप की तुलना है:

यहाँ छवि विवरण दर्ज करें

अधिकतम त्रुटि 1 [0, 255] रेंज में 1 से कम है।

पूर्ण कोड मेरे StackExchange सिग्नल प्रोसेसिंग Q688 GitHub रिपॉजिटरी पर उपलब्ध है


8

प्रत्येक (रंग) छवि RGB घटकों से बनी होती है। जब आप केवल लाल घटकों में सभी पिक्सल के लिए एक निरंतर मूल्य जोड़ते हैं (या कम करते हैं) तो आपको लाल टैब को दाईं ओर ले जाने के बराबर प्रभाव दिखाई देगा, और उसी तरह एक घटक द्वारा लाल घटक को कम करने का उल्टा प्रभाव होगा।

बुद्धिमान की तरह आप प्रत्येक घटक को एक निश्चित मूल्य के अनुसार बढ़ा / घटा सकते हैं। यदि आप सभी RGB घटकों को एक ही मान से बढ़ाते / घटाते हैं तो यह चमक में बदलाव के बराबर होगा (मूल रूप से आप WHITE रंग जोड़ रहे हैं / हटा रहे हैं)।

द सियान, ब्लू, मैजेंटा - सीएमवाईके रंग अंतरिक्ष में इस तरह के परिवर्तन से मेल खाती है। (लेकिन मुझे लगता है, इस रंग अंतरिक्ष में नीला सियान और पीले रंग के मिश्रण से मेल खाता है। इसलिए यह थोड़ा मुश्किल है। परिवर्तन अनिवार्य रूप से सभी के लिए समान है।

अंतिम तत्व टिंट: {ह्यू और संतृप्ति} एक ही ऑपरेशन से मेल खाती है लेकिन यहां, छवियों को पहले एचएसवी मॉडल में बदल दिया जाता है और फिर एचयूई और संतृप्ति को स्वतंत्र रूप से जोड़ा / घटाया जाता है।

मुझे डायल के मार्करों के संबंधित संबंधों के बारे में समान संख्याओं के बारे में पता नहीं है, लेकिन आप व्यावहारिक मूल्यों को आज़माकर समझ सकते हैं।


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

मेरा मानना ​​है कि यह उत्तर गलत और अपूर्ण है। 1. पीएस कार्यान्वयन में, "ब्लू" स्लाइडर को स्लाइड करना सियान-ईश पिक्सल की चमक को प्रभावित नहीं करता है और "सियान" स्लाइडर को स्लाइड करना ब्लू-ईश पिक्सल की चमक को प्रभावित नहीं करता है। इस उत्तर में वर्णित यह दृष्टिकोण उस तरह काम नहीं करेगा। 2. आप यह नहीं बताते हैं कि RGBCMY घटकों में हेरफेर करने के बाद वे कैसे ग्रेस्केल में परिवर्तित हो जाते हैं (हालांकि यह शायद एक dotProduct(color, vec3(0.2989, 0.5870, 0.1140)ऑपरेशन है)। 3. ब्लू किसी भी रंग के स्थान पर "सियान और पीले रंग के मिश्रण के अनुरूप नहीं है"।
स्टीफन मोनोव

4. आप उल्लेख नहीं करते हैं कि टिंट ऑपरेशन को ग्रेस्केल में बदलने के बाद किया जाता है और इससे पहले नहीं।
स्टीफन मोनोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.