Как построить круговую диаграмму значений цветов изображения

#python #matplotlib #scikit-learn #k-means

#python #matplotlib #scikit-learn #k-означает

Вопрос:

Я новичок в компьютерном зрении, и я пытаюсь составить график для суммирования идентификации цвета на изображении. Я использовал KMeans для поиска значений пикселей, которые мне нужно было определить. Но я хотел бы улучшить код с помощью визуализации на палитре или круговой диаграмме. Я думаю, я должен подсчитать значения пикселей, приходящиеся на каждый кластер. Однако я просто застрял, и я не знаю, как это сделать.

 from sklearn.cluster import KMeans 
import matplotlib.pyplot as plt
import numpy as np
from collections import Counter
from skimage import io, color

def kmeans_segementation(image, n_clusters, random_state=0):
    rows, cols, channels = image.shape                                #get the image shape
    X = image.reshape(rows*cols, channels)
    kmeans = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
    labels = kmeans.labels_.reshape(rows, cols)    
    labels = kmeans.cluster_centers_                                  # get group of colors   
    ordered_colors = [labels[key] for key,value in enumerate(labels)]
    print(ordered_colors)
    

img2_rgb = io.imread('frame41.png')

n_clusters = 15

kmeans_segementation(img2_rgb, n_clusters, random_state=0)
 

Ответ №1:

Следующий код показывает, как можно создать круговую диаграмму, гистограмму и изображение с повторной выборкой с помощью алгоритма K-средних (изображение из википедии):

 from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np

# image_name = 'astronaut.png' # or 'coffee.png' or 'motorcycle_left.png'
# image = plt.imread('https://raw.githubusercontent.com/scikit-image/scikit-image/main/skimage/data/'   image_name)
image = plt.imread('wikipedia_rainbow_lorikeet.png')

n_clusters = 9
rows, cols, channels = image.shape  # get the image shape
X = image.reshape(rows * cols, channels)
kmeans = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
labels = kmeans.labels_.reshape(rows, cols)
centers = kmeans.cluster_centers_.clip(0, 1)  # get group of colors, make sure they are in the interval 0-1

unique_labels, counts = np.unique(labels, return_counts=True)
label_order = np.argsort(counts)[::-1]  # descending order
unique_labels = unique_labels[label_order]
counts = counts[label_order]
percentages = counts / counts.sum() * 100

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(ncols=2, nrows=2, figsize=(12, 9))

ax1.imshow(image)
ax1.axis('off')

color_labels = [f'{label}:n{perc:.1f} %' for label, perc in zip(unique_labels, percentages)]
ax2.pie(counts, labels=color_labels, colors=centers[unique_labels])

ax3.imshow(centers[labels])
ax3.axis('off')

bars = ax4.bar(unique_labels.astype(str), counts, color=centers[unique_labels], edgecolor='black')
ax4.bar_label(bars, [f'{perc:.1f} %' for perc in percentages])
for spine in ['top', 'right']:
    ax4.spines[spine].set_visible(False)

plt.tight_layout()
plt.show()
 

круговая диаграмма, гистограмма, передискретизированное изображение из kmeans

Пример использования изображения астронавта:

круговая диаграмма и гистограмма из значений k для данных изображения

Пример с 7 цветами флага Южной Африки.

Флаг Южной Африки в виде круговой диаграммы цветов