课堂实验-[聚类分析]

【实验名称】 实验:聚类算法
【实验目的】
1.了解聚类算法理论基础
2.平台实现算法
3. 编程实现聚类算法
【实验原理】
聚类分析的目标就是在相似的基础上收集数据来分类。聚类源于很多领域,包括数学,计算机科学,统计学,生物学和经济学。
【实验环境】
OS:Ubuntu16.04
PyCharm: 2017.3
【实验步骤】
开始实验之前,我们先安装实验所需依赖依赖库

pip install scikit-learn==0.18.1
pip install scipy==0.19.1
pip install matplotlib==3.1.1

题目:使用聚类算法进行图片压缩
现在我们获得了一张图片flower.jpg

cd /home/ubuntu
wget http://10.90.3.2/HUP/DataMining/6/stu/flower.jpg

我们希望使用聚类算法对图像进行压缩,其思想是:其核心思想是通过聚类将颜色表示数量减少。例如,传统RGB,每个通道0~255(8 bits),则可以表示16777216 (24 bits)种颜色,通过聚类可以减少到16种颜色。
STEP1:完成compress_image函数,该函数实现图片压缩功能,思想是将每个像素作为一个元素进行聚类,然后使用每个类别的质心数值替换原像素数据,以此减少其颜色个数。该函数参数img是图片传入的接口,因此我们需要知道变量img的数据结构,请自行查看。
STEP1.1:将img结构进行转换即每个像素作为一个元素,使之能符合聚类算法数据输入的要求。完成后创建KMeans聚类模型并进行训练。
STEP1.2:分别获取每个数据聚类后的label,以及每个label的质心的值cluster_centers_.squeeze。
STEP1.3:使用质心的数值代替原数据的label值,那么我们将获得一个新的图像。 提示,使用numpy的choose函数进行进行质心值的代替,reshape函数回复原图片的数据结构,并返回结果。

import numpy as np
from scipy import misc 
from sklearn import cluster
import matplotlib.pyplot as plt

###STEP1###
#compress_image函数实现图片压缩功能,compress_image函数将每个像素作为一个元素进行聚类,以此减少其颜色个数。
#参数img是图片传入的接口,因此我们需要知道变量img的数据结构,请自行查看。 
def compress_image(img, num_clusters):
    #思考,聚类算法对输入的数据结构要求如何?
    #STEP1.1:将img结构进行转换即每个像素作为一个元素,使之能符合聚类算法数据输入的要求。
    X = img.reshape((-1, 1))  
    # 创建KMeans聚类模型,并训练。
    kmeans = cluster.KMeans(n_clusters=num_clusters, n_init=4, random_state=5)
    kmeans.fit(X)
    #STEP1.2:分别获取每个数据聚类后的label,以及每个label的质心。    
    labels = kmeans.labels_
    centroids = kmeans.cluster_centers_.squeeze()
    #STEP1.3:使用质心的数值代替原数据的label值,那么我们将获得一个新的图像。 
    # 提示,使用numpy的choose函数进行进行质心值的代替,reshape函数回复原图片的数据结构,并返回结果。
    input_image_compressed = np.choose(labels, centroids).reshape(img.shape)
    return input_image_compressed

STEP2:创建plot_image函数打印图片。

###STEP2###
#plot_image函数打印图片
def plot_image(img, title):
    vmin = img.min()
    vmax = img.max()
    plt.figure()
    plt.title(title)
    plt.imshow(img, cmap=plt.cm.gray, vmin=vmin, vmax=vmax)

STEP3:读入图片,设置压缩率,实现压缩。

###STEP3###
#读入图片,设置压缩率,实现压缩
if __name__=='__main__':
    #设置图片的路径和压缩比例
    input_file = "/home/ubuntu/flower.jpg"
    num_bits = 2
    if not 1 <= num_bits <= 8:
        raise TypeError('Number of bits should be between 1 and 8')
    num_clusters = np.power(2, num_bits)
    # 输出压缩的比例
    compression_rate = round(100 * (8.0 - num_bits) / 8.0, 2)
    print ("\nThe size of the image will be reduced by a factor of", 8.0/num_bits)
    print ("\nCompression rate = " + str(compression_rate) + "%")
    # 加载需要压缩的图片
    input_image = misc.imread(input_file, True).astype(np.uint8)
    # 原始图像的输出
    plot_image(input_image, 'Original image')
    # 压缩后的图像输出 
    input_image_compressed = compress_image(input_image, num_clusters)
    plot_image(input_image_compressed, 'Compressed image; compression rate = ' 
            + str(compression_rate) + '%')

    plt.show()
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值