Я пытаюсь сделать цветовую сегментацию (следуя коду из книги 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)
Теперь это оригинальное изображение, которое я использовал:
![enter image description here](https://i.stack.imgur.com/sD5Cn.png)
И этот код для получения сегментированного изображения:
plt.figure(figsize=(10,5))
plt.imshow(segmented_img.astype(np.uint8))
plt.title("5 colors image")
plt.show()
И я получаю:
![](https://i.stack.imgur.com/w9TGX.png)
Пока все хорошо. Теперь я попытался изменить код пятой строки с X = image.reshape(-1, 3)
на X = image.reshape(-1, 1)
, который, как я ожидаю, будет использовать один цветной канал и дать худшее изображение (потому что в нем меньше информации), но я получаю изображение, которое я чувствую намного ближе к исходному изображению:
![i](https://i.stack.imgur.com/Nyv42.png)
Я что-то не так делаю? Может ли кто-нибудь объяснить мне, что здесь происходит?
Постскриптум Когда я использую 2 канала, это хуже, чем 3:
![enter image description here](https://i.stack.imgur.com/llXk5.png)
А 5 каналов это просто странно:
![enter image description here](https://i.stack.imgur.com/rDFcS.png)
Может кто-нибудь объяснить мне, что происходит?