Aquí está el código haciendo uso de PIL y Scipy's cluster package.
Para simplificar he codificado el nombre del archivo como "image.jpg". Cambiar el tamaño de la imagen es para la velocidad: si no le molesta la espera, comente la llamada de cambio de tamaño. Cuando se ejecuta en este sample image of blue peppers, generalmente dice que el color dominante es # d8c865, que corresponde aproximadamente al área amarillenta brillante en la parte inferior izquierda de los dos pimientos. Digo "generalmente" porque el clustering algorithm utilizado tiene un grado de aleatoriedad. Hay varias maneras en que puede cambiar esto, pero para sus propósitos puede ser adecuado. (Echa un vistazo a las opciones de la variante kmeans2() si necesita resultados deterministas.)
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)
Nota: cuando se amplío el número de grupos de encontrar desde 5 a 10 o 15, que con frecuencia dio resultados que eran de color verdoso o azulado Dada la imagen de entrada, esos también son resultados razonables ... No puedo decir qué color es realmente dominante en esa imagen, ¡así que no fallo el algoritmo!
también una pequeña bonificación: guardar la imagen en tamaño reducido, con sólo los N colores más frecuentes:
# 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'
I' Supongo que cambia el tamaño de la imagen para permitir que el algoritmo de reajuste haga algo del promedio por usted. – Skurmedel