热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【阿旭机器学习实战】【19】如何在不减少分辨率的情况下降低图片存储空间?KMeans算法进行图片颜色点分类存储

【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流。本文使用无监督学习算法K-means聚类算法通过对图





【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流。


本文使用无监督学习算法K-means聚类算法通过对图片颜色点进行聚类的方式,达到降低图片存储空间的目的



对于KMeans聚类算法原理的介绍,请参考之前的博文《【阿旭机器学习实战】【16】KMeans算法介绍及实战:利用KMeans进行足球队分类》




目录


  • 前言
  • 1. 加载图片及特征处理
  • 2. 进行KMeans聚类建模
  • 3. 使用算法对原始图片进行聚类
  • 4. 展示原始图片与使用64个聚类中心聚类后的图片
  • 5. 图片存储方式



前言

在如今的互联网时代,网络上充满了海量的数据,当然也包括很多图片。因此图像压缩技术对于压缩图像和减少存储空间变得至关重要。

本文我们将使用无监督学习算法K-means聚类算法通过对图片颜色点进行聚类的方式,达到降低图片存储空间的目的

图像由称为像素的几个强度值组成。在彩色图像中, 每个像素为3个字节, 每个像素包含RGB(红-蓝-绿)值, 该值具有红色强度值, 然后是蓝色, 然后是绿色强度值。

具体方法如下:


  1. 使用K均值聚类算法将图片相似的颜色归为不同的” k”个聚类(例如k = 64),每个簇质心(RGB值)代表其各自簇的RGB颜色空间中的颜色矢量。

  2. 根据Kmeans算法找出图片上每个像素点对应的簇质心(RGB值)的标号值。

  3. 图片存储时,我们只需存储每个像素的标签编号, 并保留每个聚类中心的颜色向量的记录,根据编号及这个聚类中心颜色向量就可以告诉该像素所属的集群,即RGB值。

由上述存储方式可以看出,图片单个像素点的存储由RGB的3个字节,变为了只需存储一个标签编号的数字。存储空间只需原来的30%左右。


1. 加载图片及特征处理

from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# 加载图片
china = datasets.load_sample_image("china.jpg")
plt.imshow(china)

在这里插入图片描述

china.dtype

dtype('uint8')

china.shape

(427, 640, 3)

# 除以255,将像素点的值变为0-1之间
china = china/255

h,w,d = china.shape

# 把像素点展开
img_array = china.reshape((h*w,d))

img_array.shape

(273280, 3)

# 把像素点随机打乱
from sklearn.utils import shuffle
img_array_shuffle = shuffle(img_array,random_state=0)

plt.imshow(img_array_shuffle.reshape((h,w,d)))

在这里插入图片描述


2. 进行KMeans聚类建模

from sklearn.cluster import KMeans
# 用64个聚类来划分这些像素点
km = KMeans(n_clusters=64,random_state=0)

# 仅用前1000个像素点进行模型训练
km.fit(img_array_shuffle[:1000])

KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
n_clusters=64, n_init=10, n_jobs=1, precompute_distances='auto',
random_state=0, tol=0.0001, verbose=0)

# 表示这1000个样本对应的聚类标签,展示前100个标签编号
km.labels_[:100]

array([22, 36, 8, 56, 38, 42, 22, 31, 7, 2, 55, 31, 62, 21, 52, 43, 31,
18, 2, 4, 31, 56, 21, 2, 15, 5, 6, 49, 57, 13, 5, 21, 21, 3,
21, 47, 21, 2, 47, 32, 5, 42, 5, 33, 45, 56, 5, 57, 2, 38, 47,
6, 50, 50, 27, 62, 56, 57, 30, 28, 6, 5, 26, 24, 58, 44, 8, 21,
58, 60, 10, 56, 31, 10, 41, 5, 62, 41, 22, 6, 38, 25, 57, 36, 28,
21, 49, 2, 21, 48, 14, 15, 57, 22, 47, 63, 47, 2, 41, 34])

# # 用聚类中心点的颜色来代表这个聚类的颜色,展示前10个聚类中心
km.cluster_centers_[:10]

array([[0.62570806, 0.60261438, 0.53028322],
[0.15546218, 0.1557423 , 0.12829132],
[0.82063983, 0.89896801, 0.98462332],
[0.42039216, 0.43843137, 0.2227451 ],
[0.69527105, 0.74994233, 0.76516724],
[0.92174422, 0.9556336 , 0.99514194],
[0.07058824, 0.0754637 , 0.0508744 ],
[0.28205128, 0.26395173, 0.19638009],
[0.46509804, 0.43372549, 0.36901961],
[0.71328976, 0.41960784, 0.31851852]])

3. 使用算法对原始图片进行聚类

# 用km模型去对原图进行聚类
labels = km.predict(img_array)

创建一个函数用于重新合成图片

def recreate_img(centers,labels,h,w):
# 行数的作用是将每个像素点的值,用对应编号的聚类中心代替
# 按照h和w创建一个空白图片
img = np.zeros((h,w,3))
# 通过for循环,遍历img中每一个点,并且从labels中取出下标对应的聚类重新给img赋值
label_index = 0
for i in range(h):
for j in range(w):
img[i][j] = centers[labels[label_index]]
label_index += 1
return img

img_re = recreate_img(km.cluster_centers_, labels, h, w)

4. 展示原始图片与使用64个聚类中心聚类后的图片

plt.figure(figsize=(12,6))
axes1 = plt.subplot(121)
axes1.imshow(china)
axes1.set_title("Instaces")
axes2 = plt.subplot(122)
axes2.imshow(img_re)
axes2.set_title("64 colors,K-Means")

Text(0.5,1,'64 colors,K-Means')

在这里插入图片描述


5. 图片存储方式
  1. 存储上面的图片每个像素点对应的聚类编号:labels, 形状为:(273280,)
  2. 存储每个聚类编号对应聚类中心RGB值:km.cluster_centers_。形状为:(64, 3)

依据以上labels与km.cluster_centers_,我们即可还原出聚类之后的图片。相对于原始数据存储量降低了60%以上。

如果内容对你有帮助,感谢记得点赞+关注哦!



欢迎关注我的公众号:阿旭算法与机器学习,共同学习交流。
更多干货内容持续更新中…








推荐阅读
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • 使用多项式拟合分析淘宝双11销售趋势
    根据天猫官方数据,2019年双11成交额达到2684亿元,再次刷新历史记录。本文通过多项式拟合方法,分析并预测未来几年的销售趋势。 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • 使用Python代码高效生成大规模随机数据集(千万级) ... [详细]
  • 通过使用 `pandas` 库中的 `scatter_matrix` 函数,可以有效地绘制出多个特征之间的两两关系。该函数不仅能够生成散点图矩阵,还能通过参数如 `frame`、`alpha`、`c`、`figsize` 和 `ax` 等进行自定义设置,以满足不同的可视化需求。此外,`diagonal` 参数允许用户选择对角线上的图表类型,例如直方图或密度图,从而提供更多的数据洞察。 ... [详细]
  • 每年,意甲、德甲、英超和西甲等各大足球联赛的赛程表都是球迷们关注的焦点。本文通过 Python 编程实现了一种生成赛程表的方法,该方法基于蛇形环算法。具体而言,将所有球队排列成两列的环形结构,左侧球队对阵右侧球队,首支队伍固定不动,其余队伍按顺时针方向循环移动,从而确保每场比赛不重复。此算法不仅高效,而且易于实现,为赛程安排提供了可靠的解决方案。 ... [详细]
  • 针对图像分类任务的训练方案进行了优化设计。通过引入PyTorch等深度学习框架,利用其丰富的工具包和模块,如 `torch.nn` 和 `torch.nn.functional`,提升了模型的训练效率和分类准确性。优化方案包括数据预处理、模型架构选择和损失函数的设计等方面,旨在提高图像分类任务的整体性能。 ... [详细]
  • 机器学习中的标准化缩放、最小-最大缩放及鲁棒缩放技术解析 ... [详细]
  • 在Python网络编程中,多线程技术的应用与优化是提升系统性能的关键。线程作为操作系统调度的基本单位,其主要功能是在进程内共享内存空间和资源,实现并行处理任务。当一个进程启动时,操作系统会为其分配内存空间,加载必要的资源和数据,并调度CPU进行执行。每个进程都拥有独立的地址空间,而线程则在此基础上进一步细化了任务的并行处理能力。通过合理设计和优化多线程程序,可以显著提高网络应用的响应速度和处理效率。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 本章节在上一章的基础上,深入探讨了如何通过引入机器人实现自动聊天、表情包回应以及Adidas官方账号的自动抽签功能。具体介绍了使用wxpy库进行微信机器人的开发,优化了智能回复系统的性能和用户体验。通过详细的代码示例和实践操作,展示了如何实现这些高级功能,进一步提升了机器人的智能化水平。 ... [详细]
author-avatar
一根吃兔子的萝卜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有