नए आईट्यून्स 11 में एल्बम कवर के फंक्शन के लिए कलर्स और बैकग्राउंड के लिए रंगों को चुनते हुए एक एल्बम की सॉन्ग लिस्ट के लिए बहुत अच्छा दृश्य है। किसी को पता चला कि एल्गोरिथ्म कैसे काम करता है?
नए आईट्यून्स 11 में एल्बम कवर के फंक्शन के लिए कलर्स और बैकग्राउंड के लिए रंगों को चुनते हुए एक एल्बम की सॉन्ग लिस्ट के लिए बहुत अच्छा दृश्य है। किसी को पता चला कि एल्गोरिथ्म कैसे काम करता है?
जवाबों:
मैंने आईट्यून्स 11 कलर एल्गोरिथ्म को मैथमेटिका में लगा दिया है, जिसमें एल्बम कवर इनपुट के रूप में दिया गया है:
परीक्षण और त्रुटि के माध्यम से, मैं एक एल्गोरिथ्म के साथ आया जो ~ 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 की कार्यक्षमता को डुप्लिकेट करने के लिए तुच्छ होगा: जब एल्बम दो हाइलाइट्स से कम पैदावार देता है, तो पृष्ठभूमि के साथ सबसे अच्छा कंट्रास्ट के आधार पर शीर्षक सफेद या काला हो जाता है। फिर गाने एक हाइलाइट कलर बन जाते हैं अगर एक हो या टाइटल कलर बैकग्राउंड में थोड़ा फीका हो जाए।
@ सेठ-थॉम्पसन के उत्तर और @ब्लेडॉग की टिप्पणी के साथ, मैं एक छवि के कार्य में रंग योजनाओं को उत्पन्न करने के लिए थोड़ा उद्देश्य-सी (कोको-टच) परियोजना का निर्माण करता हूं।
आप इस परियोजना की जाँच कर सकते हैं:
https://github.com/luisespinoza/LEColorPicker
अभी के लिए, LEColorPicker कर रहा है:
अभी के लिए, मैं ColorTunes प्रोजेक्ट ( https://github.com/Dannvix/ColorTunes ) और नए फीचर्स के लिए वेड कॉसग्रोव प्रोजेक्ट की जांच करूंगा । इसके अलावा, रंग योजना के परिणाम में सुधार के लिए मेरे पास कुछ नए विचार हैं।
पैनिक के वेड कॉसग्रोव ने एक अच्छी ब्लॉग पोस्ट लिखी जिसमें उनके एल्गोरिदम को लागू करने का वर्णन किया गया है जो आईट्यून्स में एक है। इसमें उद्देश्य-सी में एक नमूना कार्यान्वयन शामिल है।
आप ColorTunes की जांच भी कर सकते हैं जो कि Itunes एल्बम दृश्य का एक HTML कार्यान्वयन है जो MMCQ (माध्य कट रंग मात्राकरण) एल्गोरिथ्म का उपयोग कर रहा है।
@ सेठ के उत्तर के साथ मैंने PHP और इमेजिक का उपयोग करके चित्र के दो पार्श्व सीमाओं में प्रमुख रंग प्राप्त करने के लिए एल्गोरिथ्म को लागू किया।
https://gist.github.com/philix/5688064#file-simpleimage-php-L81
इसका उपयोग http://festea.com.br में कवर फ़ोटो की पृष्ठभूमि को भरने के लिए किया जा रहा है
मैंने अभी एक JS लाइब्रेरी लिखी है जो लगभग उसी एल्गोरिदम को लागू कर रही है जिसे @Seth द्वारा वर्णित किया गया है । यह स्वतंत्र रूप से github.com/arcanis/colibrijs , और NPM पर उपलब्ध है colibrijs
।
मैंने एक ही संदर्भ में एक ही सवाल पूछा था और http://charlesleifer.com/blog/use-python-and-k-means-to-find-the-dominant-colors-in-images/ के लिए इशारा किया था लर्निंग एल्गोरिदम (k मीन्स) जो छवि में यादृच्छिक शुरुआती बिंदुओं का उपयोग करके समान रूप से करता है। इस तरह, एल्गोरिथ्म अपने आप में प्रमुख रंग पाता है।