https://www.toutiao.com/a6573221465104056846/

压缩图片的原理

k-means算法实现图像的压缩是k-means聚类算法的一个经典的应用,它把一个彩色图压缩成了灰度图,此时的灰度图不再使用三个通道,而使用单通道图,这样就可以节省彩色图片的存储空间,那么单通道图片和多通道图片有什么区别呢?

单通道图片

什么是单通道图片?单通道图片俗称灰度图,每个像素点只能有一个值表示颜色,它的像素值在0到255之间,0是黑色,255是白色,中间值是一些不同等级的灰色,在计算机中的表示如下所示:

计算机中的单通道图

假如现在有一个单通道的图片,我们在计算机中输出它的维度(shape)信息,它的shape为(297L, 364L),这个表示这张图片的数据表示有297行,364列,这是一个二维数组,这就是单通道图片在计算机中的表示形式。

三通道图片

什么是三通道图片?我们可以简单的理解为彩色图片,每个像素点都有3个值表示 ,所以就是3通道。例如RGB图片即为三通道图片,RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。总之,每一个点由三个值表示

计算机中的三通道图片

如上所示就是一张三通道图片在计算机中的表示,我们输出这张图片的维度(shape),其值为:(297L, 364L, 3L),相对于单通道图片的维度来说,此时的图片的维度信息多了一个3L,这个就是三通道的意思,在计算机中值的范围是0~255,比如[245 255 244]这三个就表示红245、绿255、蓝244,那么这三个通道组合而成就是对应的颜色了。

使用聚类的方法来实现图片的压缩操作

我们先来看一下原始图片是什么样的?如下所示,这是一张彩色的三通道图片

彩色的三通道图片

如果在计算机中输出这张图片的维度信息,它的shape是(297L, 364L, 3L),此时的图片结构为:

计算机中的图片表示

如果我们将其维度改变为(297*364,3),那么就实现了图片的压缩操作,那么此时我们的图片结构变为:

(297*364,3)

之所以变成这样就是因为比较方便,这样可以认为有297*364个样本,每个样本是有3个特征。每个特征的值的范围是0~255,下面我们使用聚类算法,将这297*364个样本聚成128簇,为什么要聚成128簇呢?

因为我们知道,图片的像素值得单位是0~255,所以我们的特征值的范围是0~255,这就相当于是256个值,我们聚成128个簇,以后的每个样本所属的簇就作为压缩图片的像素值了,那么像素值最大为128,这样就是实现了图像的压缩,这就是k-means压缩图片的原理。

核心代码

kmeans = KMeans(n_clusters=128, n_init=10, max_iter=200)

  • n_clusters聚类数量,本例我们聚成128, 这个参数根据自己的需要反复调整
  • max_iter=200 在查找聚类时,需要进行迭代,将各个点分配到矩心,然后移动矩心,然后重新分配这些点,重新移动矩心,max_iter表示进行迭代的次数,200一般足够了。
  • n_init=10 控制算法初始化的次数,提出聚类的次数,k-means聚类有一个挑战,完全取决于初始状况,你有时最终会得到不同的聚类结果,然后,你需要多次重复该算法。尽管任意这些聚类可能都不对,但所有聚类的集合总会有满足你要求的聚类。 如果觉得你的聚类特别容易出现糟糕或艰难的初始化过程,就需要调整这个参数

clusters = np.asarray(kmeans.cluster_centers_, dtype=np.uint8)labels = np.asarray(kmeans.labels_, dtype=np.uint8)

以上表示将聚类完成之后的聚类中心和聚类之后的标签封装成一个数组,clusters为聚类中心,有128个,labels为每个样本属于哪一簇,共有297*364个,这二者的结果为:

128个聚类中心

108个样本所属的簇

labels = labels.reshape(rows, cols);

接下来就是最重要的一步,就是将labels也就是[4 4 69 ...29 29 29]转换成row*cols,也就是297*364,那么此时的labels值就是每个像素的值,范围是0~128,那么此时的图片就是我们压缩完的图片,它和原图片相比有以下特点

  1. 原图片shape是(297L, 364L, 3L),而现在的图片是297*364,也就是由彩色图变成了灰度图
  2. 原图片上每个像素值的大小是0~255,现在的图片的像素大小是0~128

压缩之后的图片效果为:

压缩之后的图片效果

全部代码

# -*- coding:utf-8 -*-
from skimage import io
from sklearn.cluster import KMeans
import numpy as np
image = io.imread('test.jpg')
io.imshow(image)
io.show()
rows = image.shape[0]
cols = image.shape[1]
image = image.reshape(image.shape[0]*image.shape[1],3)
kmeans = KMeans(n_clusters=128, n_init=10, max_iter=200)
kmeans.fit(image)
clusters = np.asarray(kmeans.cluster_centers_, dtype=np.uint8)
labels = np.asarray(kmeans.labels_, dtype=np.uint8)
labels = labels.reshape(rows, cols);
io.imsave('compressed_test.jpg', labels)
image = io.imread('compressed_test.jpg')
io.imshow(image)
io.show()

以上就是基于聚类算法完成彩色图片压缩的全部原理及其代码实现

基于经典的机器学习k-means聚类算法实现对三通道图片的压缩操作相关推荐

  1. 基于Spark的机器学习实践 (九) - 聚类算法

    0 相关源码 1 k-平均算法(k-means clustering)概述 1.1 回顾无监督学习 ◆ 分类.回归都属于监督学习 ◆ 无监督学习是不需要用户去指定标签的 ◆ 而我们看到的分类.回归算法 ...

  2. k means聚类算法_一文读懂K-means聚类算法

    1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...

  3. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

  4. 机器学习-k均值聚类算法-k_means原理14

    非监督学习

  5. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  6. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  7. 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)

    其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...

  8. 机器学习之无监督学习-K均值聚类算法

    机器学习之无监督学习-K均值聚类算法 对于无监督学习,有两类重要的应用,一个是聚类,一个是降维.我们今天主要学习聚类中的K均值聚类. 我们先看看下图,图a为原始的数据点,我们想要对图a的数据点进行分类 ...

  9. 机器学习实战-61:K均值聚类算法(K-Means)

    K均值聚类算法(K-Means) 深度学习原理与实践(开源图书)-总目录,建议收藏,告别碎片阅读! 机器学习分为监督学习.无监督学习和半监督学习(强化学习).无监督学习最常应用的场景是聚类(clust ...

最新文章

  1. ANDROID_MARS学习笔记_S01_011ProgressBar
  2. java如何给数组倒置_数组元素倒置-Java
  3. linux bond 脚本,Linux--网卡聚合简单脚本(bond0)(示例代码)
  4. Android 使用控件自定义背景实例
  5. Hdu 5339 Untitled (数学思维)
  6. [代码片断]SQL中解析XML数据
  7. Caffe编译 Mnist训练测试---基本参数学习
  8. Java根据中国姓氏的拼音的首字母进行数组的排序
  9. html5闪光效果,HTML5 canvas元素背景梦幻小星星闪烁特效
  10. MT 101 Request for Transfer转账请求
  11. AJAX读取Json文件
  12. 2021年长安杯电子数据取证大赛
  13. 转载之-中值滤波均值滤波
  14. JS如何实现多线程?
  15. Python入门教学
  16. 数字图像处理之图像增强
  17. rowspan table布局_css如何实现table表格的单元格合并?colspan和rowspan合并单元格(实例)...
  18. 第11周项目七 太乐(泰勒)了
  19. 手机号格式处理(正则)
  20. 约瑟夫环问题逢七过小游戏

热门文章

  1. matplotlib tick_params参数刻度线调整
  2. Java反射原理剖析一
  3. 刘鹏飞 袁玮哲:自动生成论文评审意见!AI可以取代审稿人吗?
  4. 手把手教你用线性回归预测二手房房价
  5. 新书上市 | 6岁的gRPC,终于出书了!
  6. 微博:推动世界的力量(第2版)
  7. 中国计算机学会CCF推荐国际学术会议和期刊目录-人工智能
  8. 中国工业机器视觉产业发展白皮书(附ppt)
  9. 基于深度学习的事件因果关系抽取综述
  10. Attention!注意力机制模型最新综述(附下载)