Hier ist Code, der das Cluster-Paket von Pillow and Scipy verwendet .
Der Einfachheit halber habe ich den Dateinamen als "image.jpg" fest codiert. Das Ändern der Bildgröße dient der Geschwindigkeit: Wenn Ihnen das Warten nichts ausmacht, kommentieren Sie den Größenänderungsaufruf aus. Wenn dieses Beispielbild von blauen Paprikaschoten verwendet wird , heißt es normalerweise, dass die dominierende Farbe # d8c865 ist, was ungefähr dem hellgelben Bereich links unten von den beiden Paprikaschoten entspricht. Ich sage "normalerweise", weil der verwendete Clustering-Algorithmus einen gewissen Grad an Zufälligkeit aufweist. Es gibt verschiedene Möglichkeiten, dies zu ändern, aber für Ihre Zwecke kann es gut passen. (Überprüfen Sie die Optionen für die Variante kmeans2 (), wenn Sie deterministische Ergebnisse benötigen.)
from __future__ import print_function
import binascii
import struct
from PIL 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))
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)
counts, bins = scipy.histogram(vecs, len(codes))
index_max = scipy.argmax(counts)
peak = codes[index_max]
colour = binascii.hexlify(bytearray(int(c) for c in peak)).decode('ascii')
print('most frequent is %s (#%s)' % (peak, colour))
Hinweis: Wenn ich die Anzahl der zu findenden Cluster von 5 auf 10 oder 15 erhöhe, wurden häufig grünliche oder bläuliche Ergebnisse erzielt. Angesichts des Eingabebildes sind dies auch vernünftige Ergebnisse ... Ich kann auch nicht sagen, welche Farbe in diesem Bild wirklich dominiert, also kann ich den Algorithmus nicht bemängeln!
Auch ein kleiner Bonus: Speichern Sie das verkleinerte Bild nur mit den N häufigsten Farben:
import imageio
c = ar.copy()
for i, code in enumerate(codes):
c[scipy.r_[scipy.where(vecs==i)],:] = code
imageio.imwrite('clusters.png', c.reshape(*shape).astype(np.uint8))
print('saved clustered image')