[PYTHON] Extraire la couleur dominante de l'image par clustering k-means

La couleur dominante est la teinte qui domine la palette de couleurs globale. --Google

Extraire 5 couleurs et dessiner un graphique circulaire proportionnellement.

input.jpg out.png input.jpg out.png input.jpg out.png

Package à utiliser

$ pip install opencv-python
$ pip install scikit-learn
$ pip install matplotlib

Charger l'image

Créez une liste RVB pour rendre les données d'image qui peuvent être regroupées en k-means

import cv2
import itertools

image = cv2.imread('./input.jpg')
rgbs = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
rgb_list = list(itertools.chain(*rgbs.tolist()))

k-means Nombre de couleurs à extraire = Nombre de clusters Voici 5 exemples:

from sklearn.cluster import KMeans

clusters = KMeans(n_clusters=5).fit(rgb_list)

Le centre du cluster est la couleur dominante

colors = clusters.cluster_centers_
print(colors)
[[ 25.29093216 119.84721127 142.13737995]
 [223.23362209 201.96734673 193.59849205]
 [176.3426999  108.01350558 118.93074255]
 [  8.36396613  14.71480369  27.54413049]
 [ 98.95068783  32.240443    48.93265647]]
#rgb

Calculez le pourcentage de chaque cluster

import numpy as np

def cluster_percents(labels):
    total = len(labels)
    percents = []
    for i in set(labels):
        percent = (np.count_nonzero(labels == i) / total) * 100
        percents.append(round(percent, 2))
    return percents
percents = cluster_percents(clusters.labels_)
print(percents)
[9.16, 9.6, 11.51, 48.37, 21.35]
#%

Dessinez un graphique circulaire

Echelle car la couleur de matplotlib n'accepte que les RVB mis à l'échelle de 0 à 1.

import matplotlib.pyplot as plt

colors = clusters.cluster_centers_ / 255
colors = colors.tolist()

Triez les proportions de grande à petite pour rendre le graphique circulaire beau.

percents = cluster_percents(clusters.labels_)
tup = zip(colors, percents)
sorted_tup = sorted(tup, key=lambda n: n[1], reverse=True)
sorted_colors = [c for c,p in sorted_tup]
sorted_percents = [p for c,p in sorted_tup]

Dessinez un graphique circulaire

plt.pie(sorted_percents, colors=sorted_colors, counterclock=False, startangle=90)
plt.show()

Recommended Posts

Extraire la couleur dominante de l'image par clustering k-means
Extraire la couleur de l'objet dans l'image avec le clustering Mask R-CNN et K-Means
[En gros] Clustering par K Means
Extraire la couleur de l'image (RVB)
Extraire les points caractéristiques d'une image
Échelle de gris par matrice-Reinventor of Python image processing-
Traitement d'image par Python 100 Knock # 6 Traitement de réduction de couleur
Analyse d'image de microtomographie à rayons X par Python
Juge Yosakoi Naruko par classification d'image de Tensorflow.
Résumé super (concis) de la classification des images par ArcFace
Cours ROS 119 Corriger la couleur de l'image de la caméra
Image de fermeture
Extraire le tableau des fichiers image avec OneDrive et Python
Traitement d'image par matrice Basics & Contents-Reinventor of Python image processing-
Obtenez l'image de "Suzu Hirose" par recherche d'images Google.
Clustering et analyse en composantes principales par méthode K-means (débutant)