第九次作业

利用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))

 

截图:

 

贝叶斯解题过程照片:

posted @ 2018-11-01 20:37  我知道你知道我知道  阅读(202)  评论(0编辑  收藏  举报