本文不談理論,只談應用。
除了sklearn庫之外,我們還需要壹些圖像處理庫。我介紹了以下庫:
我使用pylab圖書館閱讀圖片:
此時讀入的img是壹個形狀為(height,width,3)的三維numpy數組,其中3表示通道數,即三個RGB通道。
但是,KMeans傳入的參數必須是壹個二維數組,因此需要將其分解為兩個維度:
在這種結構中,您只需使用最簡單的方法:
有許多參數,在構建n_clusters之外的其他參數時,我使用默認值:
然後,使用fit()進行訓練:
聚類後,有許多參數,其中兩個參數更重要,需要在此處使用:
聚類完成後,每個像素都需要重新著色,同壹類別中的所有像素都應該用該聚類中心的顏色填充。
在此之前,您需要首先獲得圖片的高度和寬度:
首先,用image.new()重新創建壹張圖片。語法如下所示:
然後您需要使用putpixel()方法來填充像素,但在此之前,您需要處理壹些小細節:
在RGB圖中,每個通道都是0到255之間的整數,但kmeans.cluster_centers_中的元素類型是float64,因此在填充之前,需要稍加處理才能將元素更改為int32類型。
直接改變類型是不合適的,因為kmeans.cluster_centers_畢竟是壹個類似於屬性值的東西,而且名稱太長了,所以改成壹個短的就好。因此,只需制作另壹個副本並使用astype更改數據類型。
如上所述,kmeans.labels_是壹維數組,但圖片是二維的,因此您可以恢復它:
然後妳可以填寫像素:
這裏我們需要註意putpixel()方法,它的兩個參數:
最後,保存圖片:
我在測試中使用了《王者榮耀》中大喬的照片: