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

扫描二维码关注公众号,回复: 4038356 查看本文章
'''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)





猜你喜欢

转载自www.cnblogs.com/smallgrass/p/9945551.html
今日推荐