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?
CEVAP
Kapak giriş olarak: albüm verilmiş İncelenmiştir iTunes 11 renk algoritmasını ben yaklaşık
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:
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]];
.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[]}]
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ş.
Nasıl SQLite veritabanı dosyası tablol...
Nasıl sözlük değerlere göre sözlükler ...
Nasıl klon ya da Python içinde bir lis...
Nasıl içeren bir taahhüt verilen şube ...
Nasıl tamir: Handler " PageHandlerFact...