Я пытаюсь сделать цветовую сегментацию (следуя коду из книги Hands on ML 2 - github ), но я не понимаю результатов - я получаю лучшее изображение на 1 канале, чем на 3.
Это код для 3 каналов:
from matplotlib.image import imread
import os
image = imread(os.path.join(".","foxes.jpg"))
image.shape #(608, 800, 3)
X = image.reshape(-1, 3) #-------- 3 channels - RGB -----------------
kmeans = KMeans(n_clusters=5).fit(X) # 5 colors
segmented_img = kmeans.cluster_centers_[kmeans.labels_]
segmented_img = segmented_img.reshape(image.shape)
Теперь это оригинальное изображение, которое я использовал:
И этот код для получения сегментированного изображения:
plt.figure(figsize=(10,5))
plt.imshow(segmented_img.astype(np.uint8))
plt.title("5 colors image")
plt.show()
И я получаю:
Пока все хорошо. Теперь я попытался изменить код пятой строки с X = image.reshape(-1, 3)
на X = image.reshape(-1, 1)
, который, как я ожидаю, будет использовать один цветной канал и дать худшее изображение (потому что в нем меньше информации), но я получаю изображение, которое я чувствую намного ближе к исходному изображению:
Я что-то не так делаю? Может ли кто-нибудь объяснить мне, что здесь происходит?
Постскриптум Когда я использую 2 канала, это хуже, чем 3:
А 5 каналов это просто странно:
Может кто-нибудь объяснить мне, что происходит?