SORU
30 Kasım 2012, Cuma


Nasıl algoritma iTunes 11 şarkı listesi renk?

Yeni iTunes 11 Bir albümün şarkı listesi de oldukça güzel bir görünüm, yazı tipi renkleri ve albüm kapağı fonksiyonu arka planda gönderiyor. Herkes algoritma nasıl çalıştığını anladım?

Third Example

CEVAP
3 Aralık 2012, PAZARTESİ


Example 1

Kapak giriş olarak: albüm verilmiş İncelenmiştir iTunes 11 renk algoritmasını ben yaklaşık

Output 1

Nasıl yaptığımı

Deneme yanılma yoluyla, hangi ile test ettik albümleri ~80% üzerinde çalışan bir algoritma var.

Renk Farklılıkları

Algoritma toplu bir görüntü baskın rengi bulma ile ilgilidir. Baskın renkleri bulmak için bir ön koşul, ancak, iki renk arasında ölçülebilir bir fark hesaplanıyor. İki renk arasındaki farkı hesaplamak için bir yol RGB renk uzayı Öklid uzaklığı hesaplamak için. Ancak insanın renk algısı çok iyi RGB renk alanı mesafe ile örtüşmüyor.

Bu nedenle, bir işlev YUV, renk algısı yaklaşımı çok iyi olan bir renk uzayı RGB renk (şeklinde {1,1,1}) dönüştürmek için yazdım:

(EDİT: @cormullion @Drake * -dahili CIELAB ve renk CİELUV spaces... tekerleği biraz yeniledim gibi) görünüm de bir o kadar uygun olacağını belirtti

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
    ]

Sonraki, bir işlevi yukarıdaki dönüşüm ile renk mesafeyi hesaplamak için yazdım:

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

Baskın Renkler

Ben hızlı bir şekilde yerleşik * fonksiyon DominantColors yeterince ince taneli iTunes kullandığı algoritma için yaklaşık kontrol izin vermez keşfetti. Benim kendi işlevini yerine gönderdim

Piksel bir grup baskın renk hesaplamak için basit bir yöntem benzer renk kova içine tüm pikselleri toplamak ve büyük kova.

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

.1 farklı renk ayrı düşünülmesi ne kadar tahammülü olduğunu unutmayın. Ayrıca unutmayın, ancak giriş bir dizi piksel olarak ham üçlü form ({{1,1,1},{0,0,0}}), dönüş * RGBColor öğe için daha iyi yaklaşık yerleşik DominantColors işlevi.

18 ** benim gerçek işlevi, verilen başka bir renk filtreleme sonra n baskın renge kadar dönme seçeneği ekler. Ayrıca her renk karşılaştırma için tolerans gösterir:

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
    ]

Algoritma geri Kalanı

İlk ikili bir filtre ile albüm kapağı(, *36px*22) & azaltılmış ayrıntı ben yeniden boyutlandırılabilir

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

iTunes albüm kenarları boyunca baskın rengi bularak arka plan rengini seçer. Ancak, dar albüm kırpma tarafından sınırları kapağı yok sayar.

thumb = ImageCrop[thumb, 34];

Sonraki, baskın renk (yeni işlevi, yukarıda) .1 varsayılan bir hoşgörü ile resmin en dış kenarında buldum.

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

Son olarak, bir bütün olarak görüntü 2 hakim renk, işlev, arka plan rengini de filtrelemek için söylüyorum döndü.

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

Tolerans değerlerinin üzerinde aşağıdaki gibidir: .1 minimum arasındaki fark "ayrı" renk; .2 minimum arasındaki fark çok sayıda baskın renkler (düşük Bir değer döndürebilir siyah ve koyu gri iken daha yüksek bir değer sağlar Daha fazla çeşitlilik hakim renk); .5 minimum arasındaki fark baskın renkler ve arka plan (yüksek Bir değer getirebilecek yüksek kontrastlı renk kombinasyonları)

Voila!

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

Final Output

Notlar

Algoritma genel olarak uygulanabilir. Albümün ~80% test kapakları için genellikle doğru renkler üretmek için çalıştıklarını noktaya ayarları ve tolerans değerleri yukarıdaki hızlandırdım. Birkaç kenar durumlar DominantColorsNew olayları (albüm kapağı siyah beyaz olduğunda yani) geri dönmek için iki renk bulamadığında ortaya çıkar. Benim algoritmam yok Adres bu gibi durumlarda, ama olabilir de önemsiz yinelenen iTunes işlevselliği: albümü ne zaman verimi en az iki olayları, başlık olur beyaz ya da siyah bağlı olarak en iyi kontrast ile arka plan. Sonra şarkıları tek tek ise orada vurgu rengi olacak, ya da başlık, renkli arka plana biraz solmuş.

Daha Fazla Örnek

More Examples

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • eurotuner

    eurotuner

    6 Mart 2006
  • Māris Zaharovs

    Māris Zahar

    28 Mayıs 2008
  • michal lelkowski

    michal lelko

    9 Temmuz 2006