#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()
Пример использования изображения астронавта:
Пример с 7 цветами флага Южной Африки.