背景描述:

  RGB编码:对于一个直接用24bit表示每一个而像素的图像来说,每一个pixel使用8-bit无符号整数(0-255)来表示红or绿or蓝。

压缩目的:

  将128x128大小的图片由原来的24bit表示-压缩成->16bit表示每一个像素的图像。

压缩方法:

  对于每一个pixel, 使用 K-Means选择16bits来表示原来的24bits。当然,具体是通过计算每一个像素空间的16bits大小的聚类来表示原来的24bits。

实现步骤:

  1.将原来的128x128大小的图片读入到一个3维矩阵A中。举个例子 A(50, 33, 3)表示原图片中rowNum = 50 columnNum = 33 RGB中的B维 所对应的

颜色值(0-255)。这样我们就得到了一个 X = (m x 3)matrix of piexl colors( where m = 128 * 128 = 16384)。

  2.运行K-Means算法,取K= 16, 这样将每一个pixel聚类到一个Cluster k上(关于K-means初始K个点的选择 其实就是随机在X中选出K个点作为 centroid的)。用k这个centroid point的location来代表原来的像素值。这里K=16,我们可以用四位来表示16种分类的可能。那么也就需要4bits就可以记录当前piexl的压缩后的分类。(当然,最后还需要有一个对照表 k(16个颜色(?为啥不用4bits来映射,2进制转换太繁琐!这里直接映射就好了)) -> RGB(24bits))。

压缩效果:

  压缩前大小:128*128*24 = 393216 bits;

  压缩后大小:128*128*4 + 16*24 = 65920 bits;

  压缩因子接近 6!

  代码在gitlab Machine learning ex7中。

核心思路:

  K-means进行图片压缩,压缩的并不是颜色。原来用24位表示颜色,现在也用24位表示颜色。只不过编码方式发生了改变,将原来的24bits种颜色变成了16bits种颜色。而这个过程正是采用的k-means聚类。那么颜色之间的区分度就变得不是那么明显,导致分辨率下降。

Have fun , good luck!

And this is my picture kebe compressed:

 K-Means结果可视化

  如图每一个颜色代表一个cluster(共计16种)。

一种压缩图片的方法---Machine learning 之 K-Means的更多相关文章

  1. 另一种压缩图片的方法---Machine learning 之 PCA(Principle Component Analysis)

    PCA最主要的用途是用来减少特征向量的数目,N个特征向量 减小到 K个特征向量.如果为了可视化,k可以使3 或者 2.这样可以加速算法的学习速度. PCA用来压缩图像同一有效. 具体方式以及原理在gi ...

  2. OpenCV Machine Learning 之 K近期邻分类器的应用 K-Nearest Neighbors

    OpenCV Machine Learning 之 K近期邻分类器的应用 以下的程序实现了对高斯分布的点集合进行分类的K近期令分类器 #include "ml.h" #includ ...

  3. [实现]Javascript代码的另一种压缩与加密方法——代码图片转换

    代码=图片 图片=代码 JS代码对于喜欢F12的同志来说,连个遮羞布都没有... 虽然把代码变成图片也仅仅只是增加一层纱布而已...但这方法还是挺好玩的,而且代码也被压缩了一点. 第一次看到[图片=代 ...

  4. 10 行 Python 代码,批量压缩图片 500 张,简直太强大了

    本文原创并首发于公众号[Python猫],未经授权,请勿转载. 原文地址:https://mp.weixin.qq.com/s/5hpFDgjCpfb0O1Jg-ycACw 熟悉 "Pyth ...

  5. Android 下压缩图片—微弱失真

    Android下压缩图片的方法: 大概能将3M左右的图片压缩到100K左右, 几乎不失真. 代码如下: import java.io.FileNotFoundException; import jav ...

  6. Canvas DrawImage截取和压缩图片的陷阱

    html5的canvas十分之强大,可以做到快速的截取压缩出新的图片! 不过最近开发过程中遇到一个问题,图片压缩后使用toDataURL取得图片显示为一片漆黑,什么都没有! 折腾了很久,起初以为是上传 ...

  7. JAVA中pdf转图片的方法

    JAVA中实现pdf转图片可以通过第三方提供的架包,这里介绍几种常用的,可以根据自身需求选择使用. 一.icepdf.有收费版和开源版,几种方法里最推荐的.转换的效果比较好,能识别我手头文件中的中文, ...

  8. Python解压ZIP、RAR等常用压缩格式的方法

    解压大杀器 首先祭出可以应对多种压缩包格式的python库:patool.如果平时只用基本的解压.打包等操作,也不想详细了解各种压缩格式对应的python库,patool应该是个不错的选择. pato ...

  9. 使用Python轻松批量压缩图片

    在互联网,图片的大小对一个网站的响应速度有着明显的影响,因此在提供用户预览的时候,图片往往是使用压缩后的.如果一个网站图片较多,一张张压缩显然很浪费时间.那么接下来,我就跟大家分享一个批量压缩图片的方 ...

随机推荐

  1. Error from server at http://127.0.0.1:8983/solr/xxx: undefined field type

    undefined field type就是说没有定义type类型,这样情况下,可以新建一个带type的索引,比如:{type:1, id:1, name:"张三"}

  2. Oracle开发常用函数 max 最大数 自动加 1 的模式

    create sequence bs_com_seq increment by 1 start with 1 minvalue 1 maxvalue 999999 cycle nocache orde ...

  3. 亚马逊免费服务器搭建Discuz!论坛过程(四)

    上述命令还可能因缺少包引发其他错误: 如果出错则安装对应的包即可. 以下供参考: yum install libxml2 yum install libxml2-devel -y yum instal ...

  4. 基础命令history

    history   记录历史命令 环境变量: HISTSIZE: 命令历史记录的条数: HISTFILE:  命令历史记录的文件,~/.bash_history: HISTFILESIZE: 命令历史 ...

  5. 25.TF&IDF算法以及向量空间模型算法

    主要知识点: boolean model IF/IDF vector space model     一.boolean model     在es做各种搜索进行打分排序时,会先用boolean mo ...

  6. [备忘]git常用命令

    网站有点儿久没有维护(因为去做其他事情了呗),现在空下来,回来改了网站的一些东西,却忘记了git的一些常用的命令,于是便写下这篇文,方便查阅,免得每次都去看手册(毕竟我懒啊!!) 检查当前文件状态:g ...

  7. BZOJ 1617 Usaco 2008 Mar. River Crossing渡河问题

    [题解] 显然是个DP题. 设$f[i]$表示送$i$头牛过河所需的最短时间,预处理出$t[i]$表示一次性送i头牛过河所需时间,那么我们可以得到转移方程:$f[i]=min(f[i],f[i-j]+ ...

  8. PAT 1110 Complete Binary Tree

    Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each in ...

  9. 2014秋C++ 第8周项目 分支程序设计

    课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703.课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课 ...

  10. 数据结构(C实现)------- 顺序栈

    栈是限定仅在表的一端进行插入或删除的纯属表,通常称同意插入.删除的一端为栈顶(Top),对应在的.则称还有一端为栈底(Bottom). 不含元素的栈则称为空栈. 所设栈S={a1,a2,a3,..., ...