आईट्यून्स 11 में गीत सूची को रंग देने के लिए एल्गोरिदम कैसे काम करता है? [बन्द है]


297

नए आईट्यून्स 11 में एल्बम कवर के फंक्शन के लिए कलर्स और बैकग्राउंड के लिए रंगों को चुनते हुए एक एल्बम की सॉन्ग लिस्ट के लिए बहुत अच्छा दृश्य है। किसी को पता चला कि एल्गोरिथ्म कैसे काम करता है?

तीसरा उदाहरण


9
W3c रंग कंट्रास्ट सूत्र उत्तर का हिस्सा हो सकता है। मेरे स्वयं के अनुभवजन्य परीक्षण बताते हैं कि इस सूत्र का उपयोग एमएस वर्ड द्वारा यह तय करने के लिए किया जाता है कि यह ऑटो-रंग फ़ॉन्ट है। "रंग की चमक निम्न सूत्र द्वारा निर्धारित की जाती है" [w3c रंग विपरीत सूत्र] [1] [1]: w3.org/TR/AERT#color-contrast
bluedog

@bluedog, मुझे लगता है कि आप सही हैं। मैंने अपने एल्बम कवर की बहुत कोशिश की और हमेशा फ़ॉन्ट स्पष्ट रूप से देखने के लिए पृष्ठभूमि के साथ पर्याप्त विपरीत है।
लुइसएस्पिनोजा

1
ध्यान देने योग्य कुछ और बात यह है कि यह मैक ओएस और विंडोज के बीच भिन्नता प्रतीत होती है: twitter.com/grimfrog/status/275187988374380546
टॉम इरविंग

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

जवाबों:


423

उदाहरण 1

मैंने आईट्यून्स 11 कलर एल्गोरिथ्म को मैथमेटिका में लगा दिया है, जिसमें एल्बम कवर इनपुट के रूप में दिया गया है:

आउटपुट 1

मैंने यह कैसे किया

परीक्षण और त्रुटि के माध्यम से, मैं एक एल्गोरिथ्म के साथ आया जो ~ 80% एल्बमों पर काम करता है जिसके साथ मैंने इसका परीक्षण किया है।

रंग अंतर

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

इसलिए, मैंने आरजीबी रंगों (फॉर्म में {1,1,1}) को यूयूवी में परिवर्तित करने के लिए एक फ़ंक्शन लिखा , एक रंग स्थान जो अनुमानित रंग संकेत पर बहुत बेहतर है:

(EDIT: @cormullion और @Drake ने बताया कि मैथेमेटिका का अंतर्निहित CIELAB और CIELUV रंग रिक्त स्थान उतने ही उपयुक्त होंगे ... ऐसा लगता है कि मैंने यहां पहिया को थोड़ा मजबूत किया है)

convertToYUV[rawRGB_] :=
    Module[{yuv},
        yuv = {{0.299, 0.587, 0.114}, {-0.14713, -0.28886, 0.436},
            {0.615, -0.51499, -0.10001}};
        yuv . rawRGB
    ]

अगला, मैंने उपरोक्त रूपांतरण के साथ रंग दूरी की गणना करने के लिए एक फ़ंक्शन लिखा:

ColorDistance[rawRGB1_, rawRGB2_] := 
    EuclideanDistance[convertToYUV @ rawRGB1, convertToYUV @ rawRGB2]

प्रमुख रंग

मुझे जल्दी से पता चला कि अंतर्निहित मैथेमेटिका फ़ंक्शन, आई DominantColors-ट्यून्स द्वारा उपयोग किए जाने वाले एल्गोरिथ्म को लगभग ठीक से नियंत्रित करने की अनुमति नहीं देता है। मैंने इसके बजाय अपना स्वयं का फ़ंक्शन लिखा ...

पिक्सेल के समूह में प्रमुख रंग की गणना करने के लिए एक सरल विधि सभी पिक्सेल को समान रंगों की बाल्टियों में इकट्ठा करना और फिर सबसे बड़ी बाल्टी ढूंढना है।

DominantColorSimple[pixelArray_] :=
    Module[{buckets},
        buckets = Gather[pixelArray, ColorDistance[#1,#2] < .1 &];
        buckets = Sort[buckets, Length[#1] > Length[#2] &];
        RGBColor @@ Mean @ First @ buckets
    ]

ध्यान दें कि .1अलग-अलग रंगों को अलग-अलग कैसे माना जाना चाहिए, इसके लिए सहिष्णुता है। यह भी ध्यान दें कि यद्यपि इनपुट कच्चे ट्रिपल रूप में पिक्सल का एक सरणी है ( {{1,1,1},{0,0,0}}), मैं RGBColorअंतर्निहित DominantColorsफ़ंक्शन को बेहतर ढंग से अनुमानित करने के लिए एक गणितज्ञ तत्व वापस करता हूं ।

मेरा वास्तविक कार्य किसी अन्य रंग को फ़िल्टर करने के बाद प्रमुख रंगों DominantColorsNewतक लौटने का विकल्प जोड़ता है n। यह प्रत्येक रंग तुलना के लिए सहिष्णुता को भी उजागर करता है:

DominantColorsNew[pixelArray_, threshold_: .1, n_: 1, 
    numThreshold_: .2, filterColor_: 0, filterThreshold_: .5] :=
    Module[
        {buckets, color, previous, output},
        buckets = Gather[pixelArray, ColorDistance[#1, #2] < threshold &];
        If[filterColor =!= 0, 
        buckets = 
            Select[buckets, 
                ColorDistance[ Mean[#1], filterColor] > filterThreshold &]];
        buckets = Sort[buckets, Length[#1] > Length[#2] &];
        If[Length @ buckets == 0, Return[{}]];
        color = Mean @ First @ buckets;
        buckets = Drop[buckets, 1];
        output = List[RGBColor @@ color];
        previous = color;
        Do[
            If[Length @ buckets == 0, Return[output]];
            While[
                ColorDistance[(color = Mean @ First @ buckets), previous] < 
                    numThreshold, 
                If[Length @ buckets != 0, buckets = Drop[buckets, 1], 
                    Return[output]]
            ];
            output = Append[output, RGBColor @@ color];
            previous = color,
            {i, n - 1}
        ];
        output
    ]

बाकी एल्गोरिथ्म

पहले मैंने एक द्विपक्षीय फ़िल्टर के साथ एल्बम कवर ( 36px, 36px) और कम विवरण को आकार दिया

image = Import["http://i.imgur.com/z2t8y.jpg"]
thumb = ImageResize[ image, 36, Resampling -> "Nearest"];
thumb = BilateralFilter[thumb, 1, .2, MaxIterations -> 2];

iTunes एल्बम के किनारों के साथ प्रमुख रंग ढूंढकर पृष्ठभूमि का रंग चुनता है। हालांकि, यह छवि को क्रॉप करके संकीर्ण एल्बम कवर सीमाओं की उपेक्षा करता है।

thumb = ImageCrop[thumb, 34];

इसके बाद, मुझे एक डिफ़ॉल्ट सहिष्णुता के साथ छवि के सबसे बाहरी किनारे के साथ प्रमुख रंग (ऊपर नए फ़ंक्शन के साथ) मिला .1

border = Flatten[
    Join[ImageData[thumb][[1 ;; 34 ;; 33]] , 
        Transpose @ ImageData[thumb][[All, 1 ;; 34 ;; 33]]], 1];
background = DominantColorsNew[border][[1]];

अंत में, मैंने छवि में 2 प्रमुख रंगों को एक पूरे के रूप में वापस किया, साथ ही पृष्ठभूमि के रंग को भी फ़िल्टर करने के लिए फ़ंक्शन को बताया।

highlights = DominantColorsNew[Flatten[ImageData[thumb], 1], .1, 2, .2, 
    List @@ background, .5];
title = highlights[[1]];
songs = highlights[[2]];

उपरोक्त सहिष्णुता मान इस प्रकार हैं: .1"अलग" रंगों के बीच न्यूनतम अंतर है; .2कई प्रमुख रंगों के बीच न्यूनतम अंतर है (एक कम मूल्य काले और गहरे भूरे रंग में लौट सकता है, जबकि एक उच्च मूल्य प्रमुख रंगों में अधिक विविधता सुनिश्चित करता है); .5प्रमुख रंगों और पृष्ठभूमि के बीच न्यूनतम अंतर है (एक उच्च मूल्य उच्च-विपरीत रंग संयोजन प्राप्त करेगा)

देखा!

Graphics[{background, Disk[]}]
Graphics[{title, Disk[]}]
Graphics[{songs, Disk[]}]

अंतिम आउटपुट

टिप्पणियाँ

एल्गोरिथ्म बहुत आम तौर पर लागू किया जा सकता है। मैंने उपरोक्त सेटिंग्स और सहिष्णुता मूल्यों को उस बिंदु पर ट्विक किया, जहां वे मेरे द्वारा परीक्षण किए गए एल्बम कवर के ~ 80% के लिए आम तौर पर सही रंग बनाने के लिए काम करते हैं। कुछ बढ़त के मामले तब होते हैं जब DominantColorsNewहाइलाइट्स के लिए लौटने के लिए दो रंग नहीं मिलते हैं (यानी जब एल्बम कवर मोनोक्रोम होता है)। मेरा एल्गोरिथ्म इन मामलों को संबोधित नहीं करता है, लेकिन यह iTunes की कार्यक्षमता को डुप्लिकेट करने के लिए तुच्छ होगा: जब एल्बम दो हाइलाइट्स से कम पैदावार देता है, तो पृष्ठभूमि के साथ सबसे अच्छा कंट्रास्ट के आधार पर शीर्षक सफेद या काला हो जाता है। फिर गाने एक हाइलाइट कलर बन जाते हैं अगर एक हो या टाइटल कलर बैकग्राउंड में थोड़ा फीका हो जाए।

और ज्यादा उदाहरण

और ज्यादा उदाहरण


3
ठीक है @ सेठ थॉम्पसन, यह बहुत आशाजनक लगता है। मैं इसे स्वयं करने की कोशिश करने जा रहा हूं, इसमें मुझे कुछ दिन लगेंगे, कृपया धैर्य रखें।
लुइस एस्पिनोज़ा

6
बहुत बढ़िया समाधान। अब गणितज्ञ से उद्देश्य-सी तक एक बंदरगाह की आवश्यकता है, जो एक कठिन संघर्ष है।
loretoparisi

1
इस बहुत विस्तृत जवाब के लिए +1!
मारियस शुल्ज

1
@cormullion LUV (और LAB) दोनों अवधारणात्मक एकरूपता के लिए लक्ष्य हैं। हालाँकि, मुझे किसी भी रंग स्थान में यूक्लिडियन दूरी का उपयोग करने के लिए कोई स्पष्ट संदर्भ नहीं मिला। मेरा अनुमान है कि अगर और कुछ नहीं, तो वे दोनों आरजीबी से बेहतर होंगे।
सेठ थॉम्पसन

6
यह वही है जो मुझे एक "चक नॉरिस उत्तर" कॉल करना पसंद है
MCKapur

44

@ सेठ-थॉम्पसन के उत्तर और @ब्लेडॉग की टिप्पणी के साथ, मैं एक छवि के कार्य में रंग योजनाओं को उत्पन्न करने के लिए थोड़ा उद्देश्य-सी (कोको-टच) परियोजना का निर्माण करता हूं।

आप इस परियोजना की जाँच कर सकते हैं:

https://github.com/luisespinoza/LEColorPicker

अभी के लिए, LEColorPicker कर रहा है:

  1. छवि को 36x36 px पर स्केल किया गया है (यह गणना समय कम करता है)।
  2. यह छवि से एक पिक्सेल सरणी उत्पन्न करता है।
  3. पिक्सेल सरणी को YUV स्पेस में परिवर्तित करता है।
  4. सेठ थॉम्पसन के कोड के अनुसार रंगों को इकट्ठा करें।
  5. रंग के सेट को गिनती द्वारा क्रमबद्ध किया जाता है।
  6. एल्गोरिथ्म तीन सबसे प्रमुख रंगों का चयन करता है।
  7. सबसे प्रमुख पृष्ठभूमि के रूप में असाइन किया गया है।
  8. रंगों की पृष्ठभूमि के साथ पर्याप्त विपरीत है या नहीं, यह जांचने के लिए दूसरे और तीसरे सबसे प्रमुख डब्ल्यू 3 सी रंग विपरीत सूत्र का उपयोग करके परीक्षण किया जाता है।
  9. यदि पाठ रंगों में से एक परीक्षण पास नहीं करता है, तो वाई घटक के आधार पर, सफेद या काले रंग में असाइन किया जाता है।

अभी के लिए, मैं ColorTunes प्रोजेक्ट ( https://github.com/Dannvix/ColorTunes ) और नए फीचर्स के लिए वेड कॉसग्रोव प्रोजेक्ट की जांच करूंगा । इसके अलावा, रंग योजना के परिणाम में सुधार के लिए मेरे पास कुछ नए विचार हैं।

Screenshot_Mona


2
+1 - बहुत अच्छा सामान, और एल्गोरिथ्म विकास और अनुप्रयोग विकास दोनों ही अपने आप में बहुत दिलचस्प हो सकते हैं, इसका एक बड़ा उदाहरण
युवल कर्मी

1
इसके विपरीत की जाँच के लिए +1।
ब्रेनमर्न्स

हाँ शांत, लेकिन आप प्रत्येक रंग के लिए हैश मानों को कैसे गोल कर रहे हैं? मुझे लगता है कि मैं इस एल्गोरिथ्म को आसानी से तोड़ सकता हूं, बस नीचे दाईं ओर थोड़ा काला और सफेद "स्पष्ट" लोगो जोड़कर, आप वास्तव में काले और सफेद के लिए एक फोकस जोड़ रहे हैं। वैसे भी, यह एल्गोरिथ्म क्लिप-आर्ट आधारित छवियों के लिए बेहतर काम करेगा, लेकिन यदि आपके पास 36x36 पर छवि है, तो उन असफल मामलों को एंटी-अलियासिंग द्वारा अधिक दुर्लभ बना दिया जाएगा
जैक फ्रेंगन

एक शब्द: काल्पनिक!
टेडी

16

पैनिक के वेड कॉसग्रोव ने एक अच्छी ब्लॉग पोस्ट लिखी जिसमें उनके एल्गोरिदम को लागू करने का वर्णन किया गया है जो आईट्यून्स में एक है। इसमें उद्देश्य-सी में एक नमूना कार्यान्वयन शामिल है।


15

आप ColorTunes की जांच भी कर सकते हैं जो कि Itunes एल्बम दृश्य का एक HTML कार्यान्वयन है जो MMCQ (माध्य कट रंग मात्राकरण) एल्गोरिथ्म का उपयोग कर रहा है।


हां मैं पहले से ही इसकी जांच कर रहा हूं। दुख की बात है मुश्किल से प्रलेखित।
लुइस एस्पिनोज़ा

ColorTunes में महत्वपूर्ण टिप्पणी (माध्य कट परिमाणीकरण एल्गोरिथ्म) [ leptonica.com/papers/mediancut.pdf] का संदर्भ है । मैंने अभी इसे अजगर में लगभग 2 घंटे में लागू किया, बस कागज में वर्णन तैयार किया, और ऊपर सेठ के एल्गोरिथ्म के मेरे कार्यान्वयन के लिए इसे पसंद किया। मुझे परिणाम थोड़ा बेहतर लगता है, लेकिन सबसे महत्वपूर्ण बात यह है कि यह थोड़ा तेज है (बेशक, मैं सेठ के एल्गोरिथ्म को गलत तरीके से लागू कर सकता था)।
ब्रेनमर्न्स

@ sh1ftst0rm क्या आपके पास गीथूब या कहीं पर अपने अजगर का कार्यान्वयन है? चीयर्स
एंथ्रोपिक

@Anentropic क्षमा करें, मैं नहीं। यह एक निजी परियोजना का हिस्सा था जिस पर मैं काम कर रहा था, और मैंने इसे बिल्कुल नहीं निकाला। अगर मुझे मौका मिलता है, तो मैं इसे कहीं पोस्ट करने की कोशिश करूंगा, लेकिन यह शायद कभी भी जल्द ही नहीं होगा।
1

5

@ सेठ के उत्तर के साथ मैंने PHP और इमेजिक का उपयोग करके चित्र के दो पार्श्व सीमाओं में प्रमुख रंग प्राप्त करने के लिए एल्गोरिथ्म को लागू किया।

https://gist.github.com/philix/5688064#file-simpleimage-php-L81

इसका उपयोग http://festea.com.br में कवर फ़ोटो की पृष्ठभूमि को भरने के लिए किया जा रहा है



4

मैंने एक ही संदर्भ में एक ही सवाल पूछा था और http://charlesleifer.com/blog/use-python-and-k-means-to-find-the-dominant-colors-in-images/ के लिए इशारा किया था लर्निंग एल्गोरिदम (k मीन्स) जो छवि में यादृच्छिक शुरुआती बिंदुओं का उपयोग करके समान रूप से करता है। इस तरह, एल्गोरिथ्म अपने आप में प्रमुख रंग पाता है।

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