利用K-means進行圖像壓縮

前面幾篇文章 淺談支持向量機 神經網絡——手寫數字識別 中涉及的算法都屬於監督學習的範疇,今天小編給大家介紹一種屬於無監督學習範疇的算法——K-means。

K-means是一種應用很廣泛的聚類算法。聚類,通俗的講就是“人以羣分物以類聚”。

K-means是怎麼實現聚類的呢?下面我們以一個簡單的樣例來闡述它的工作原理。

觀察上面的圖,我們一般會認爲這些數據點集中分佈在三個區域,即這些數據點可以聚成三個族。K-means的工作過程是:首先隨機挑選三個點作爲中心點,然後計算所有的數據點離哪個中心點最近,再根據離中心點近的點更新中心點,循環多次直到中心點不怎麼變化即可。

利用K-means聚類上面的數據,中心點更新過程如下。

好了,現在大致瞭解了K-means的作用和工作原理,下面就進入我們這次的主題——圖像壓縮。

上圖是128*128的png圖像,存儲格式是RGB,所以這副圖像佔用的位數是128×128×24=393216。我們怎樣利用K-means算法實現這副圖像的壓縮呢?

我的想法是:這副圖像存在許多很大一塊區域的顏色相近,既然相近,我們就用一種顏色替代一大塊區域中的各色。我們可以人爲的用8、16、24、32種顏色表示整幅圖像的顏色,也即說明聚類的個數爲8、16、24、32。

具體的Python代碼如下。

import matplotlib.pyplot as plt # plt 用於顯示圖片
import matplotlib.image as mpimg # mpimg 用於讀取圖片
from sklearn.cluster import KMeans
import numpy as np

pixel = mpimg.imread('bird_small.png')
pixel = pixel.reshape((128*128 , 3))

kmeans = KMeans(n_clusters=16, random_state=0).fit(pixel)

newPixel = []
for i in kmeans.labels_:
    newPixel.append(list(kmeans.cluster_centers_[i,:]))

newPixel = np.array(newPixel)
newPixel = newPixel.reshape((128,128,3))

plt.imshow(newPixel)
plt.show()

如果用了16個類,則壓縮之後的圖像佔用的位數爲128×128×4 = 65536,壓縮比爲16.7%。但這種壓縮是有損壓縮,圖像質量會下降,使用8、16、24、32壓縮後效果圖如下。

可以看到,圖像的質量較原圖是有所下降的,有點類似在原圖上進行平滑處理,並且分類數越多,圖片質量越接近原圖,這個應該不難理解。

好了,以上就是本次的全部內容。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章