【阿旭機器學(xué)習(xí)實戰(zhàn)】【19】如何在不減少分辨率的情況下降低圖片存儲空間?K-Means算法進行圖片顏色點分類存儲

【阿旭機器學(xué)習(xí)實戰(zhàn)】系列文章主要介紹機器學(xué)習(xí)的各種算法模型及其實戰(zhàn)案例,歡迎點贊冻押,關(guān)注共同學(xué)習(xí)交流。

本文使用無監(jiān)督學(xué)習(xí)算法K-means聚類算法通過對圖片顏色點進行聚類的方式盛嘿,達到降低圖片存儲空間的目的洛巢。

對于KMeans聚類算法原理的介紹,請參考之前的博文《【阿旭機器學(xué)習(xí)實戰(zhàn)】【16】KMeans算法介紹及實戰(zhàn):利用KMeans進行足球隊分類》

目錄

前言

在如今的互聯(lián)網(wǎng)時代次兆,網(wǎng)絡(luò)上充滿了海量的數(shù)據(jù)稿茉,當(dāng)然也包括很多圖片。因此圖像壓縮技術(shù)對于壓縮圖像和減少存儲空間變得至關(guān)重要。

本文我們將使用無監(jiān)督學(xué)習(xí)算法K-means聚類算法通過對圖片顏色點進行聚類的方式漓库,達到降低圖片存儲空間的目的恃慧。

圖像由稱為像素的幾個強度值組成。在彩色圖像中, 每個像素為3個字節(jié), 每個像素包含RGB(紅-藍-綠)值, 該值具有紅色強度值, 然后是藍色, 然后是綠色強度值米苹。

具體方法如下:

  1. 使用K均值聚類算法將圖片相似的顏色歸為不同的” k”個聚類(例如k = 64)糕伐,每個簇質(zhì)心(RGB值)代表其各自簇的RGB顏色空間中的顏色矢量。

  2. 根據(jù)Kmeans算法找出圖片上每個像素點對應(yīng)的簇質(zhì)心(RGB值)的標(biāo)號值蘸嘶。

  3. 圖片存儲時良瞧,我們只需存儲每個像素的標(biāo)簽編號, 并保留每個聚類中心的顏色向量的記錄,根據(jù)編號及這個聚類中心顏色向量就可以告訴該像素所屬的集群训唱,即RGB值褥蚯。

由上述存儲方式可以看出,圖片單個像素點的存儲由RGB的3個字節(jié)况增,變?yōu)榱酥恍璐鎯σ粋€標(biāo)簽編號的數(shù)字赞庶。存儲空間只需原來的30%左右。

1. 加載圖片及特征處理

from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 加載圖片
china = datasets.load_sample_image("china.jpg")
plt.imshow(china)
在這里插入圖片描述
china.dtype
dtype('uint8')
china.shape
(427, 640, 3)
# 除以255澳骤,將像素點的值變?yōu)?-1之間
china = china/255
h,w,d = china.shape
# 把像素點展開
img_array = china.reshape((h*w,d))
img_array.shape
(273280, 3)
# 把像素點隨機打亂
from sklearn.utils import shuffle
img_array_shuffle = shuffle(img_array,random_state=0)
plt.imshow(img_array_shuffle.reshape((h,w,d)))
在這里插入圖片描述

2. 進行KMeans聚類建模

from sklearn.cluster import KMeans
# 用64個聚類來劃分這些像素點
km = KMeans(n_clusters=64,random_state=0)
# 僅用前1000個像素點進行模型訓(xùn)練
km.fit(img_array_shuffle[:1000])
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
    n_clusters=64, n_init=10, n_jobs=1, precompute_distances='auto',
    random_state=0, tol=0.0001, verbose=0)
# 表示這1000個樣本對應(yīng)的聚類標(biāo)簽歧强,展示前100個標(biāo)簽編號
km.labels_[:100]
array([22, 36,  8, 56, 38, 42, 22, 31,  7,  2, 55, 31, 62, 21, 52, 43, 31,
       18,  2,  4, 31, 56, 21,  2, 15,  5,  6, 49, 57, 13,  5, 21, 21,  3,
       21, 47, 21,  2, 47, 32,  5, 42,  5, 33, 45, 56,  5, 57,  2, 38, 47,
        6, 50, 50, 27, 62, 56, 57, 30, 28,  6,  5, 26, 24, 58, 44,  8, 21,
       58, 60, 10, 56, 31, 10, 41,  5, 62, 41, 22,  6, 38, 25, 57, 36, 28,
       21, 49,  2, 21, 48, 14, 15, 57, 22, 47, 63, 47,  2, 41, 34])
# # 用聚類中心點的顏色來代表這個聚類的顏色,展示前10個聚類中心
km.cluster_centers_[:10] 
array([[0.62570806, 0.60261438, 0.53028322],
       [0.15546218, 0.1557423 , 0.12829132],
       [0.82063983, 0.89896801, 0.98462332],
       [0.42039216, 0.43843137, 0.2227451 ],
       [0.69527105, 0.74994233, 0.76516724],
       [0.92174422, 0.9556336 , 0.99514194],
       [0.07058824, 0.0754637 , 0.0508744 ],
       [0.28205128, 0.26395173, 0.19638009],
       [0.46509804, 0.43372549, 0.36901961],
       [0.71328976, 0.41960784, 0.31851852]])

3. 使用算法對原始圖片進行聚類

# 用km模型去對原圖進行聚類
labels = km.predict(img_array)

創(chuàng)建一個函數(shù)用于重新合成圖片

def recreate_img(centers,labels,h,w):
    # 行數(shù)的作用是將每個像素點的值摸恍,用對應(yīng)編號的聚類中心代替
    # 按照h和w創(chuàng)建一個空白圖片
    img = np.zeros((h,w,3))
    # 通過for循環(huán)脓斩,遍歷img中每一個點,并且從labels中取出下標(biāo)對應(yīng)的聚類重新給img賦值
    label_index = 0
    for i in range(h):
        for j in range(w):
            img[i][j] = centers[labels[label_index]]
            label_index += 1
    return img
img_re = recreate_img(km.cluster_centers_, labels, h, w)

4. 展示原始圖片與使用64個聚類中心聚類后的圖片

plt.figure(figsize=(12,6))
axes1 = plt.subplot(121)
axes1.imshow(china)
axes1.set_title("Instaces")

axes2 = plt.subplot(122)
axes2.imshow(img_re)
axes2.set_title("64 colors,K-Means")
Text(0.5,1,'64 colors,K-Means')
在這里插入圖片描述

5. 圖片存儲方式

  1. 存儲上面的圖片每個像素點對應(yīng)的聚類編號:labels, 形狀為:(273280,)
  2. 存儲每個聚類編號對應(yīng)聚類中心RGB值:km.cluster_centers_篙贸。形狀為:(64, 3)

依據(jù)以上labels與km.cluster_centers_颊艳,我們即可還原出聚類之后的圖片茅特。相對于原始數(shù)據(jù)存儲量降低了60%以上。

如果內(nèi)容對你有幫助棋枕,感謝點贊+關(guān)注哦白修!

更多干貨內(nèi)容持續(xù)更新中…

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市重斑,隨后出現(xiàn)的幾起案子兵睛,更是在濱河造成了極大的恐慌,老刑警劉巖窥浪,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卤恳,死亡現(xiàn)場離奇詭異,居然都是意外死亡寒矿,警方通過查閱死者的電腦和手機突琳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來符相,“玉大人拆融,你說我怎么就攤上這事蠢琳。” “怎么了镜豹?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵傲须,是天一觀的道長。 經(jīng)常有香客問我趟脂,道長泰讽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任昔期,我火速辦了婚禮已卸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘硼一。我一直安慰自己累澡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布般贼。 她就那樣靜靜地躺著愧哟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哼蛆。 梳的紋絲不亂的頭發(fā)上蕊梧,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音腮介,去河邊找鬼望几。 笑死,一個胖子當(dāng)著我的面吹牛萤厅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播靴迫,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼惕味,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了玉锌?” 一聲冷哼從身側(cè)響起名挥,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎主守,沒想到半個月后禀倔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡参淫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年救湖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涎才。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡鞋既,死狀恐怖力九,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邑闺,我是刑警寧澤跌前,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站陡舅,受9級特大地震影響抵乓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜靶衍,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一灾炭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摊灭,春花似錦咆贬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至煤杀,卻和暖如春眷蜈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沈自。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工酌儒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枯途。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓忌怎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酪夷。 傳聞我的和親對象是個殘疾皇子榴啸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容