İşte PIL ve Scipy's cluster package kod yapma yaramaz.
Kolaylık olması açısından ben "image.jpg" olarak dosya adını kodlanmış ettik. Görüntünün yeniden boyutlandırılması hız içindir: beklemeye aldırmazsanız, yeniden boyutlandırılan aramayı yorumlayın. Bu sample image of blue peppers üzerinde çalışırken, genellikle baskın rengin, iki biberin sol alt kısmındaki parlak sarımsı bölgeye karşılık gelen # d8c865 olduğunu söyler. "Genellikle" diyorum çünkü clustering algorithm kullanılan rasgele bir dereceye sahiptir. Bunu değiştirmenin çeşitli yolları vardır, ancak amaçlarınız için uygun olabilir. (Eğer deterministik sonuçlar gerekirse kmeans2() varyant seçenekleri göz atın.)
import struct
import Image
import numpy as np
import scipy
import scipy.misc
import scipy.cluster
NUM_CLUSTERS = 5
print 'reading image'
im = Image.open('image.jpg')
im = im.resize((150, 150)) # optional, to reduce time
ar = np.asarray(im)
shape = ar.shape
ar = ar.reshape(scipy.product(shape[:2]), shape[2]).astype(float)
print 'finding clusters'
codes, dist = scipy.cluster.vq.kmeans(ar, NUM_CLUSTERS)
print 'cluster centres:\n', codes
vecs, dist = scipy.cluster.vq.vq(ar, codes) # assign codes
counts, bins = scipy.histogram(vecs, len(codes)) # count occurrences
index_max = scipy.argmax(counts) # find most frequent
peak = codes[index_max]
colour = ''.join(chr(int(c)) for c in peak).encode('hex')
print 'most frequent is %s (#%s)' % (peak, colour)
Not: Ben 5 ila 10 veya 15'e bulmak için kümelerinin sayısını artırmak, bunun sıkça yeşilimsi olan sonuçlar verdi veya mavimsi. Giriş görüntüsü göz önüne alındığında, bunlar da makul sonuçlardır ... Bu resimde hangi rengin gerçekten baskın olduğunu anlayamıyorum, bu yüzden algoritmayı hata etmiyorum!
Ayrıca küçük ikramiye: Sadece N en-sık renklerle indirgenmiş boyutlu görüntüyü kaydetmek: PIL size mod "P" ile bir görüntü verip vermediğini
# bonus: save image using only the N most common colours
c = ar.copy()
for i, code in enumerate(codes):
c[scipy.r_[scipy.where(vecs==i)],:] = code
scipy.misc.imsave('clusters.png', c.reshape(*shape))
print 'saved clustered image'
Ben Yeniden boyutlandırma algoritmasının sizin için ortalamanın bir kısmını yapmasını sağlamak için resmi yeniden boyutlandırdığını tahmin ediyorum. – Skurmedel