K-means算法應用:圖片壓縮

讀取一張示例圖片或本身準備的圖片,觀察圖片存放數據特色。算法

根據圖片的分辨率,可適當下降分辨率。ui

再用k均值聚類算法,將圖片中全部的顏色值作聚類。spa

而後用聚類中心的顏色代替原來的顏色值。code

造成新的圖片。blog

觀察原始圖片與新圖片所佔用內存的大小。圖片

將原始圖片與新圖片保存成文件,觀察文件的大小。內存

 

from sklearn.datasets import load_sample_image
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

#load_sample_image包的示例圖片加載
Yi = load_sample_image("china.jpg")
plt.imshow(Yi)
plt.show()
print(Yi.shape)

 

fl = load_sample_image("flower.jpg")#原始圖片
plt.imshow(fl)
plt.show()
print(fl.shape)

plt.imshow(fl[:,:,-2])   #改變圖片色調,使圖片失真
plt.show()

 

# mtaplotlib加載圖片
import matplotlib.image as img
bsb = img.imread("E:\software package\Babysbreath.jpeg")     #讀入圖片路徑
plt.imshow(bsb)
plt.show()
print(bsb.shape)

 

bsbth = bsb[::3,::3]   #下降分辨率
plt.imshow(bsb)
plt.show()
n_colors =64 #(256,256,256)  
Z= bsbth.reshape(-2,6) 
model= KMeans(n_colors)
labels = model.fit_predict(Z)    #每一個點的顏色分類,0-63
colors = model.cluster_centers_   #64個聚類中心,顏色值

print(bsb.shape,bsbth.shape,Z.shape)

 

#聚類
import numpy as np
n_colors= 64  #(256,256,256)
model= KMeans(n_colors)
labels = model.fit_predict(Z)    #每一個點的顏色分類,0-63
colors = model.cluster_centers_   #64個聚類中心,顏色值
# 以colors做爲主體,labels做爲下標,每一個元素都替換成相應類別對應的中心值
new_bsbth = colors[labels]
# 還原成原來的維度並轉換數據類型
new_bsbth = new_bsbth.reshape(bsbth.shape)
plt.imshow(new_bsbth.astype(np.uint8))
plt.show
plt.imshow(bsbth);
plt.show()

 

#保存圖片
plt.imsave('C:\\Users\\E5-572\\Desktop\\bella\\bsb.jpg',bsb)
plt.imsave('C:\\Users\\E5-572\\Desktop\\bella\\bsbth.jpg',bsbth)


import sys
# 壓縮先後對比
size1 = sys.getsizeof('C:\\Users\\E5-572\\Desktop\\bella\\bsb.jpg')
size2 = sys.getsizeof('C:\\Users\\E5-572\\Desktop\\bella\\bsbth.jpg')
print('壓縮前:'+str(size1),"\t壓縮後:"+str(size2))

 

理解貝葉斯定理:get

  • M桶:7紅3黃
  • N桶:1紅9黃
  • 如今:拿出了一個紅球
  • 試問:這個紅球是M、N桶拿出來的機率分別是多少?

相關文章
相關標籤/搜索