栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

题目:使用聚类算法进行图片压缩现在我们获得了一张图片flower.jpg,我们希望使用聚类算法对图像进行压缩,其思想是:其核心思想是通过聚类将颜色表示数量减少。

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

题目:使用聚类算法进行图片压缩现在我们获得了一张图片flower.jpg,我们希望使用聚类算法对图像进行压缩,其思想是:其核心思想是通过聚类将颜色表示数量减少。

题目:使用聚类算法进行图片压缩 现在我们获得了一张图片flower.jpg,我们希望使用聚类算法对图像进行压缩,其思想是:其核心思想是通过聚类将颜色表示数量减少。例如,传统RGB,每个通道0~255(8 bits),则可以表示16777216 (24 bits)种颜色,通过聚类可以减少到16种颜色。

import numpy as np

# 图像处理库 Scipy,读取和保存图片时

from scipy import misc

# sklearn.cluster模块提供了常用的非监督聚类算法

from sklearn import cluster

import matplotlib.pyplot as plt

STEP1:完成compress_image函数,该函数实现图片压缩功能,思想是将每个像素作为一个元素进行聚类,然后使用每个类别的质心数值替换原像素数据,以此减少其颜色个数。该函数参数img是图片传入的接口,因此我们需要知道变量img的数据结构,请自行查看。 问题一:代码实现,将img结构进行转换即每个像素作为一个元素,使之能符合聚类算法数据输入的要求。完成后创建KMeans聚类模型并进行训练。 问题二:代码实现,分别获取每个数据聚类后的label,以及每个label的质心的值cluster_centers_.squeeze。 问题三:使用质心的数值代替原数据的label值,那么我们将获得一个新的图像。 提示,使用numpy的choose函数进行进行质心值的代替,reshape函数回复原图片的数据结构,并返回结果。

###STEP1###

#compress_image函数实现图片压缩功能,compress_image函数将每个像素作为一个元素进行聚类,以此减少其颜色个数。

#参数img是图片传入的接口,因此我们需要知道变量img的数据结构,请自行查看。

def compress_image(img, num_clusters):

    #思考,聚类算法对输入的数据结构要求如何?

    #问题一:补全代码,将img结构进行转换即每个像素作为一个元素,使之能符合聚类算法数据输入的要求。

   

    X=img.reshape((-1,1))

   

    # 创建KMeans聚类模型,并训练。

    # n_clusters:整形,缺省值=8 【生成的聚类数,即产生的质心(centroids)数。】

    # n_init:整形,缺省值=10。用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。

    # random_state:整形或 numpy.RandomState 类型,可选

    # 用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个seed。此参数默认值为numpy的随机数生成器。

   

    kmeans = cluster.KMeans(n_clusters=num_clusters, n_init=4, random_state=5)

    kmeans.fit(X)

   

    #问题二:分别获取每个数据聚类后的label,以及每个label的质心。   

    labels = kmeans.labels_

    centroids = kmeans.cluster_centers_.squeeze()

   

    #问题三:使用质心的数值代替原数据的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###

#读入图片,设置压缩率,实现压缩

#设置图片的路径和压缩比例

input_file = "girl.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) + "%")

# 加载需要压缩的图片

import imageio

input_image = imageio.imread(input_file).astype(np.uint8)

# 原始图像的输出

plot_image(input_image, 'Original image')

# 压缩后的图像输出

input_image_compressed = compress_image(input_image, num_clusters).astype(np.uint8)

plot_image(input_image_compressed, 'Compressed image; compression rate = '

            + str(compression_rate) + '%')

plt.show()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/953581.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号