อัลกอริทึมในการระบายสีรายการเพลงใน iTunes 11 ทำงานอย่างไร [ปิด]


297

iTunes 11 ใหม่มีมุมมองที่ดีมากสำหรับรายการเพลงของอัลบั้มเลือกสีสำหรับแบบอักษรและพื้นหลังในฟังก์ชั่นปกอัลบั้ม ทุกคนคิดว่าอัลกอริทึมทำงานอย่างไร

ตัวอย่างที่สาม


9
สูตรความคมชัดของสี w3c อาจเป็นส่วนหนึ่งของคำตอบ การทดสอบในแบบของฉันเองแสดงให้เห็นว่า MS Word ใช้สูตรนี้เพื่อตัดสินว่าเป็นแบบอักษรสีอัตโนมัติ ค้นหา "ความสว่างของสีถูกกำหนดโดยสูตรต่อไปนี้" [สูตรความคมชัดของสี w3c] [1] [1]: w3.org/TR/AERT#color-contrast
bluedog

@bluedog ฉันคิดว่าคุณพูดถูก ฉันลองปกอัลบั้มจำนวนมากและแบบอักษรมักจะมีความคมชัดเพียงพอกับพื้นหลังเพื่อดูชัดเจน
LuisEspinoza

1
สิ่งอื่นที่ควรทราบคือดูเหมือนว่าจะแตกต่างกันระหว่าง Mac OS และ Windows: twitter.com/grimfrog/status/275187988374380546
Tom Irving

2
ฉันนึกภาพได้ว่าอาจไม่เพียง แต่ปริมาณของสี แต่ยังรวมถึงค่าความอิ่มตัวของสีเป็นส่วนหนึ่งของการคำนวณด้วย: การทดลองของฉันทำให้ฉันสรุปได้ว่าสีไฮไลท์มักถูกเลือกเป็นสีพื้นหลังแม้ว่าจะเกิดขึ้นในบางพื้นที่ ภาพ. นั่นเป็นเหตุผลที่ฉันเชื่อว่าการดูกราฟฮิสโตแกรมของภาพหน้าปกและจุดสูงสุดของมันอาจมีประโยชน์และขึ้นอยู่กับพารามิเตอร์ที่ปรับแต่งได้อย่างละเอียดบางสีจึงถูกเลือก
Raffael

2
ดูคำตอบอื่นได้ที่panic.com/blog/2012/12/itunes-11-and-colors
Mark Ransom

คำตอบ:


423

ตัวอย่างที่ 1

ฉันประมาณอัลกอริทึมสี iTunes 11 ใน Mathematica เนื่องจากปกอัลบั้มเป็นอินพุต:

เอาท์พุท 1

ฉันทำได้อย่างไร

จากการลองผิดลองถูกฉันพบอัลกอริทึมที่ใช้งานได้กับ 80% ของอัลบั้มที่ฉันทดสอบ

ความแตกต่างของสี

ส่วนใหญ่ของอัลกอริทึมเกี่ยวข้องกับการค้นหาสีที่โดดเด่นของภาพ อย่างไรก็ตามสิ่งที่ต้องมีก่อนในการค้นหาสีที่โดดเด่นกำลังคำนวณความแตกต่างเชิงปริมาณระหว่างสองสี วิธีหนึ่งในการคำนวณความแตกต่างระหว่างสองสีคือการคำนวณระยะทางแบบยุคลิดในพื้นที่สี RGB อย่างไรก็ตามการรับรู้สีของมนุษย์นั้นไม่เข้ากันได้ดีกับระยะทางในพื้นที่สี RGB

ดังนั้นฉันจึงเขียนฟังก์ชั่นเพื่อแปลงสี RGB (ในรูปแบบ{1,1,1}) เป็นYUVซึ่งเป็นพื้นที่สีซึ่งดีกว่ามากเมื่อเทียบกับการรับรู้สี:

(แก้ไข: @cullullionและ@Drakeชี้ให้เห็นว่าพื้นที่สีในตัวของ CIELAB และ CIELUV ของ Mathematica จะเหมาะสมเช่นกัน ... ดูเหมือนว่าฉันจะสร้างวงล้อขึ้นใหม่ที่นี่)

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]

สีที่โดดเด่น

ฉันค้นพบอย่างรวดเร็วว่าฟังก์ชัน Mathematica ในตัวDominantColorsไม่อนุญาตให้มีการควบคุมอย่างละเอียดพอที่จะประมาณอัลกอริทึมที่ iTunes ใช้ ฉันเขียนฟังก์ชันของตัวเองแทน ...

วิธีง่ายๆในการคำนวณสีที่โดดเด่นในกลุ่มพิกเซลคือการรวบรวมพิกเซลทั้งหมดลงในที่เก็บของสีที่คล้ายกันแล้วค้นหาที่เก็บข้อมูลที่ใหญ่ที่สุด

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

โปรดทราบว่า.1การยอมรับความแตกต่างของสีต้องพิจารณาแยกต่างหาก โปรดทราบว่าแม้ว่าอินพุตจะเป็นอาร์เรย์ของพิกเซลในรูปแบบ raw triplet ( {{1,1,1},{0,0,0}}) แต่ฉันกลับRGBColorองค์ประกอบMathematica เพื่อให้ดีขึ้นประมาณ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คือความแตกต่างขั้นต่ำระหว่างสีที่โดดเด่นและพื้นหลัง (ค่าที่สูงกว่าจะให้ชุดสีที่มีความเปรียบต่างสูงกว่า)

Voila!

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

ผลลัพธ์สุดท้าย

หมายเหตุ

อัลกอริทึมสามารถนำไปใช้โดยทั่วไปมาก ฉันปรับแต่งการตั้งค่าข้างต้นและค่าความคลาดเคลื่อนจนถึงจุดที่พวกเขาทำงานเพื่อสร้างสีที่ถูกต้องโดยทั่วไปสำหรับปกอัลบั้มที่ฉันทดสอบประมาณ 80% มีกรณีเล็ก ๆ น้อย ๆ เกิดขึ้นเมื่อDominantColorsNewไม่พบสองสีที่จะส่งคืนสำหรับไฮไลท์ (เช่นเมื่อปกอัลบั้มเป็นแบบขาวดำ) อัลกอริทึมของฉันไม่ได้ตอบสนองต่อกรณีเหล่านี้ แต่มันเป็นเรื่องง่ายที่จะทำซ้ำฟังก์ชั่นของ iTunes: เมื่ออัลบั้มให้ผลการค้นหาน้อยกว่าสองไฮไลต์ชื่อเพลงจะกลายเป็นสีขาวหรือดำขึ้นอยู่กับความคมชัดที่ดีที่สุด จากนั้นเพลงจะกลายเป็นสีไฮไลต์หนึ่งเพลงหากมีหนึ่งสีหรือสีของเพลงจางลงเป็นพื้นหลังเล็กน้อย

ตัวอย่างเพิ่มเติม

ตัวอย่างเพิ่มเติม


3
ตกลง @ เซ็ท ธ อมป์สันดูเหมือนว่าจะมีแนวโน้มมาก ฉันจะลองด้วยตัวเองฉันต้องใช้เวลาสองสามวันโปรดอดใจรอ
LuisEspinoza

6
ทางออกที่ดีเลิศ ตอนนี้ต้องการพอร์ตจาก Mathematica ถึง Objective-C นั่นคือการต่อสู้ที่ยากลำบาก
loretoparisi

1
+1 สำหรับคำตอบที่ละเอียดมาก!
Marius Schulz

1
@cullullion LUV (และ LAB) ทั้งสองมีจุดมุ่งหมายเพื่อความเท่าเทียมกันในการรับรู้ อย่างไรก็ตามฉันไม่พบการอ้างอิงที่ชัดเจนถึงการใช้ระยะทางแบบยูคลิดในช่องว่างสี ฉันเดาว่าถ้าไม่มีอะไรพวกเขาทั้งสองจะดีกว่า RGB
Seth Thompson

6
นี่คือสิ่งที่ฉันต้องการเรียกว่า "Chuck Norris Answer"
MCKapur

44

ด้วยคำตอบของ @ Seth-thompson และความคิดเห็นของ @bluedog ฉันได้สร้างโครงการ Objective-C (Cocoa-Touch) เล็กน้อยเพื่อสร้างโครงร่างสีในฟังก์ชั่นของภาพ

คุณสามารถตรวจสอบโครงการได้ที่:

https://github.com/luisespinoza/LEColorPicker

สำหรับตอนนี้ LEColorPicker กำลังทำ:

  1. ภาพถูกปรับขนาดเป็น 36x36 พิกเซล (ลดเวลาในการคำนวณ)
  2. มันสร้างอาร์เรย์พิกเซลจากภาพ
  3. แปลงอาร์เรย์พิกเซลเป็นพื้นที่ YUV
  4. รวบรวมสีตามรหัสของ Seth Thompson
  5. ชุดของสีจะเรียงลำดับตามจำนวน
  6. อัลกอริทึมเลือกสามสีที่โดดเด่นที่สุด
  7. สิ่งที่โดดเด่นที่สุดคือกำหนดให้เป็นพื้นหลัง
  8. ส่วนใหญ่ที่สองและสามถูกทดสอบโดยใช้สูตรความคมชัดสี w3c เพื่อตรวจสอบว่าสีมีความคมชัดเพียงพอกับพื้นหลังหรือไม่
  9. หากสีข้อความอย่างใดอย่างหนึ่งไม่ผ่านการทดสอบแสดงว่ามีสีขาวหรือดำขึ้นอยู่กับองค์ประกอบ Y

สำหรับตอนนี้ฉันจะตรวจสอบโครงการ ColorTunes ( https://github.com/Dannvix/ColorTunes ) และโครงการ Wade Cosgrove สำหรับคุณสมบัติใหม่ นอกจากนี้ฉันมีความคิดใหม่สำหรับการปรับปรุงผลลัพธ์ชุดสี

Screenshot_Mona


2
+1 - สิ่งที่เจ๋งมากและเป็นตัวอย่างที่ดีของวิธีการพัฒนาอัลกอริทึมและการพัฒนาแอปพลิเคชันที่น่าสนใจในตัวของมันเอง
Yuval Karmi

1
+1 สำหรับการตรวจสอบความคมชัด
brianmearns

ใช่เจ๋ง แต่คุณจะปัดค่าแฮชของแต่ละสีได้อย่างไร? ฉันคิดว่าฉันสามารถทำลายอัลกอริทึมนี้ได้อย่างง่ายดายโดยเพียงเพิ่มโลโก้ "ชัดเจน" สีดำและสีขาวที่ด้านล่างขวาคุณเพิ่มโฟกัสสำหรับขาวดำ อย่างไรก็ตามอัลกอริทึมนี้จะทำงานได้ดีขึ้นสำหรับภาพที่ใช้คลิปอาร์ต แต่ถ้าคุณมีภาพที่ 36x36 กรณีที่ล้มเหลวนั้นจะทำให้หายากมากขึ้นโดยการต่อต้านนามแฝง
Jack Franzen

หนึ่งคำ: ยอดเยี่ยม!
ตุ๊กตา


15

นอกจากนี้คุณยังสามารถชำระเงินColorTunesซึ่งเป็นการใช้ HTML ของมุมมองอัลบั้ม Itunes ซึ่งใช้อัลกอริทึม MMCQ (การวัดปริมาณสีตัดกลาง)


ใช่ฉันตรวจสอบแล้ว น่าเศร้าดูเหมือนว่าเอกสารแทบจะไม่
LuisEspinoza

ความคิดเห็นที่สำคัญในการ ColorTunes คือการอ้างอิงไปยัง (ขั้นตอนวิธีการแบ่งตัด quantization) [ leptonica.com/papers/mediancut.pdf] ฉันเพิ่งนำไปใช้ในงูเหลือมในเวลาประมาณ 2 ชั่วโมงเพียงแค่สร้างคำอธิบายในกระดาษและชอบที่จะนำอัลกอริทึมของ Seth ไปใช้ ฉันชอบผลลัพธ์ที่ดีขึ้นเล็กน้อย แต่ที่สำคัญที่สุดคือค่อนข้างเร็วกว่าเล็กน้อย (แน่นอนว่าฉันสามารถนำอัลกอริทึมของ Seth ไปใช้อย่างไม่ถูกต้อง)
brianmearns

@ sh1ftst0rm คุณมีการนำ python ของคุณไปใช้บน gitHub หรือที่อื่นหรือไม่? ไชโย
Anentropic

@Anentropic ขออภัยฉันทำไม่ได้ มันเป็นส่วนหนึ่งของโครงการส่วนตัวที่ฉันทำงานอยู่และฉันไม่ได้แยกมันออกมาเลย หากฉันมีโอกาสฉันจะพยายามโพสต์ที่ใดที่หนึ่ง แต่อาจจะไม่เร็ว ๆ นี้
brianmearns

5

ด้วยคำตอบของ @ Seth ฉันได้ติดตั้งอัลกอริทึมเพื่อให้ได้สีที่โดดเด่นในสองเส้นขอบด้านข้างของรูปภาพโดยใช้ PHP และ Imagick

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

มันถูกใช้เพื่อเติมพื้นหลังของรูปภาพปกในhttp://festea.com.br


5

ฉันเขียนห้องสมุด JS การดำเนินการประมาณขั้นตอนวิธีการเดียวกับที่หนึ่งที่อธิบายไว้โดย@Seth สามารถใช้งานได้อย่างอิสระบนgithub.com/arcanis/colibrijsและ NPM ในcolibrijsรูปแบบ


4

ผมถามคำถามเดียวกันในบริบทที่แตกต่างกันและก็ชี้ไปhttp://charlesleifer.com/blog/using-python-and-k-means-to-find-the-dominant-colors-in-images/สำหรับ อัลกอริทึมการเรียนรู้ (k หมายถึง) ที่จะทำสิ่งเดียวกันโดยใช้จุดเริ่มต้นแบบสุ่มในภาพ ด้วยวิธีนี้อัลกอริทึมค้นหาสีที่โดดเด่นด้วยตัวเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.