iTunes 11 ใหม่มีมุมมองที่ดีมากสำหรับรายการเพลงของอัลบั้มเลือกสีสำหรับแบบอักษรและพื้นหลังในฟังก์ชั่นปกอัลบั้ม ทุกคนคิดว่าอัลกอริทึมทำงานอย่างไร
iTunes 11 ใหม่มีมุมมองที่ดีมากสำหรับรายการเพลงของอัลบั้มเลือกสีสำหรับแบบอักษรและพื้นหลังในฟังก์ชั่นปกอัลบั้ม ทุกคนคิดว่าอัลกอริทึมทำงานอย่างไร
คำตอบ:
ฉันประมาณอัลกอริทึมสี iTunes 11 ใน Mathematica เนื่องจากปกอัลบั้มเป็นอินพุต:
จากการลองผิดลองถูกฉันพบอัลกอริทึมที่ใช้งานได้กับ 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: เมื่ออัลบั้มให้ผลการค้นหาน้อยกว่าสองไฮไลต์ชื่อเพลงจะกลายเป็นสีขาวหรือดำขึ้นอยู่กับความคมชัดที่ดีที่สุด จากนั้นเพลงจะกลายเป็นสีไฮไลต์หนึ่งเพลงหากมีหนึ่งสีหรือสีของเพลงจางลงเป็นพื้นหลังเล็กน้อย
ด้วยคำตอบของ @ Seth-thompson และความคิดเห็นของ @bluedog ฉันได้สร้างโครงการ Objective-C (Cocoa-Touch) เล็กน้อยเพื่อสร้างโครงร่างสีในฟังก์ชั่นของภาพ
คุณสามารถตรวจสอบโครงการได้ที่:
https://github.com/luisespinoza/LEColorPicker
สำหรับตอนนี้ LEColorPicker กำลังทำ:
สำหรับตอนนี้ฉันจะตรวจสอบโครงการ ColorTunes ( https://github.com/Dannvix/ColorTunes ) และโครงการ Wade Cosgrove สำหรับคุณสมบัติใหม่ นอกจากนี้ฉันมีความคิดใหม่สำหรับการปรับปรุงผลลัพธ์ชุดสี
Wade Cosgrove of Panic เขียนโพสต์บล็อกที่ดีอธิบายการใช้อัลกอริทึมที่ใกล้เคียงกับหนึ่งใน iTunes มันรวมถึงการใช้งานตัวอย่างใน Objective-C
นอกจากนี้คุณยังสามารถชำระเงินColorTunesซึ่งเป็นการใช้ HTML ของมุมมองอัลบั้ม Itunes ซึ่งใช้อัลกอริทึม MMCQ (การวัดปริมาณสีตัดกลาง)
ด้วยคำตอบของ @ Seth ฉันได้ติดตั้งอัลกอริทึมเพื่อให้ได้สีที่โดดเด่นในสองเส้นขอบด้านข้างของรูปภาพโดยใช้ PHP และ Imagick
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/using-python-and-k-means-to-find-the-dominant-colors-in-images/สำหรับ อัลกอริทึมการเรียนรู้ (k หมายถึง) ที่จะทำสิ่งเดียวกันโดยใช้จุดเริ่มต้นแบบสุ่มในภาพ ด้วยวิธีนี้อัลกอริทึมค้นหาสีที่โดดเด่นด้วยตัวเอง