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)