1. 程式人生 > >kmeans圖片壓縮演算法

kmeans圖片壓縮演算法

1. 用K-means算做圖片壓縮

讀取一張示例圖片或自己準備的圖片,觀察圖片存放資料特點。

根據圖片的解析度,可適當降低解析度。

再用k均值聚類演算法,將圖片中所有的顏色值做聚類。

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

形成新的圖片。

觀察原始圖片與新圖片所佔用記憶體的大小。

將原始圖片與新圖片儲存成檔案,觀察檔案的大小。

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import matplotlib.image as img
import numpy as np
import sys

def cut_photo(duolajiang): '''每三個點分割圖片,降低畫素''' duola = duolajiang[::3, ::3] return duola def km_cut(duola,n = 64): '''用kmeans劃分陣列''' X = duola.reshape(-1, 3) # 降低解析度並改變陣列結構 km = KMeans(n_clusters=100) km_china = km.fit_predict(X) colors = km.cluster_centers_ new_image
= colors[km_china] new_image = new_image.reshape(duola.shape) return new_image def plot_photo(X,sub,title): '''畫圖的函式,X是資料集,sub是影象在子圖的位置,title是標題''' plt.figure(1) plt.subplot(sub) plt.imshow(X) plt.title(title) if __name__ == '__main__': duolajiang = img.imread('duolajiang.jpg
') plot_photo(duolajiang,sub = 221,title = '原圖')#畫第一張圖片 duola = cut_photo(duolajiang)#呼叫降低解析度 plot_photo(duola,sub = 222,title = '[:,:,3]解析度降低的圖')#畫第二張圖片 new_image = km_cut(duola,100)#kmeans壓縮圖片 plot_photo(new_image.astype(np.uint8),sub = 223,title = 'kmeans聚類的圖')#畫第三張圖片 '''解決中文亂碼''' plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標籤 plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號 plt.show() '''sys打印出圖片大小''' print('原圖大小是:',sys.getsizeof(duolajiang)) print('[:,:,3]解析度降低的圖大小是:',sys.getsizeof(duola)) print('kmeans聚類的圖大小是:',sys.getsizeof(new_image)) '''儲存圖片,到d盤''' img.imsave('d://duolajiang.jpg',duolajiang) img.imsave('d://duola.jpg', duola) img.imsave('d://new_image.jpg', new_image.astype(np.uint8))

 

'''2. 理解貝葉斯定理:

M桶:7紅3黃
N桶:1紅9黃
現在:拿出了一個紅球
試問:這個紅球是M、N桶拿出來的概率分別是多少?'''
pm_b = (7/(7+3)*1/2)/(7+1)/20
pn_b = (1/(1+9)*1/2)/(7+1)/20
print('m桶的概率為:',pm_b,'\nn桶的概率為:',pn_b)