第九次作业
利用KMeans进行图片的压缩:
代码:
from sklearn.datasets import load_sample_image from matplotlib import pyplot as plt from sklearn.cluster import KMeans import numpy as np china = load_sample_image('china.jpg') plt.imshow(china) plt.show() # mtaplotlib加载图片 import matplotlib.image as img import matplotlib.pylab as plt #myimg = img.imread(r'images\menghuan.jpg') myimg = load_sample_image('china.jpg') plt.imshow(myimg) plt.show() # 若只取图片的颜色列,会导致图片失真 myimgs = myimg[:,:,0] plt.imshow(myimgs) plt.show() # 缩小分辨率 myimgs2 = myimg[::3,::3] plt.imshow(myimgs2) plt.show() # 重造数组 myimgs2des = myimgs2.reshape(-1,3) # 聚类 est = KMeans(n_clusters=64) model = est.fit(myimgs2des) # 拿到中心和每个元素对应的类别 colors = model.cluster_centers_ labels = model.predict(myimgs2des) # 进行颜色填充(利用nympy的数组的数据结构) # 以colors作为主体,labels作为下标,每个元素都替换成相应类别对应的中心值 new_images = colors[labels] # 还原成原来的维度并转换数据类型 new_images = new_images.reshape(myimgs2.shape) new_images = new_images.astype(np.uint8) # 并画图 plt.imshow(new_images) plt.show() # 存成文件 plt.imsave('images/china.jpg',myimg) plt.imsave('images/chinasmall.jpg',new_images) # 对比 size1 = sys.getsizeof('images/china.jpg') size2 = sys.getsizeof('images/chinasmall.jpg') print('压缩前:'+str(size1),"\t压缩后:"+str(size2))
截图:
贝叶斯解题过程照片: