背景描述:

  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. 【转载】使用IntelliJ IDEA 配置Maven(入门)

    1. 下载Maven 官方地址:http://maven.apache.org/download.cgi 解压并新建一个本地仓库文件夹 2.配置本地仓库路径   3.配置maven环境变量      ...

  2. [测试工具]----iperf

    iperf https://sourceforge.net/projects/iperf/ http://downloads.es.net/pub/iperf/ https://github.com/ ...

  3. Light Oj - 1134 Be Efficient

    题目传送门:Be Efficient 题意:输入n和m,然后输入有n个元素的一个序列,问有多少个子序列元素的和能整除m. 思路:求前缀和,利用一个前缀的一个定理求解. 前缀和的一个定理是:每次求的前缀 ...

  4. Heaters (codeforces 1066B)

    贪心题 策略 在最左边设置一个array 0,每一次从右往左,如果有heater的话就寻找heater左边界是不是小于等于目前的上一个heater的右边界,如果没有一个这样的,那么就直接输出-1 代码 ...

  5. String s = new String("xyz");创建了几个对象?

    两个或一个都有可能 . ”xyz”对应一个对象,这个对象放在字符串常量池,常量”xyz”不管出现多少遍,都是常量池中的那一个. new String每写一遍,就创建一个新的对象,它使用常量”xyz”对 ...

  6. 【Mail.Ru Cup 2018 Round 2 A】 Metro

    [链接] 我是链接,点我呀:) [题意] [题解] 1:一直往右走的情况. 2:中间某个地方中转 (不会出现超过1次的转弯. (如果超过了和1次是等价的 [代码] #include <bits/ ...

  7. SVN学习总结(3)——分支合并

    首先在主干trunck上,创建分支branch1.0.0,如下图: 从主干切换到branch1.0.0,在branch1.0.0中添加test.java文件, 分支与主干的合并,首先应将主干trunc ...

  8. 像 IDE 一样使用 vim

    本文转载自:https://github.com/yangyangwithgnu/use_vim_as_ide ##[目录] 0 vim 必知会........0.1 .vimrc 文件....... ...

  9. 重庆OI2017 老 C 的任务

    老 C 的任务 时间限制: 2 Sec  内存限制: 512 MB 题目描述 老 C 是个程序员. 最近老 C 从老板那里接到了一个任务——给城市中的手机基站写个管理系统.作为经验丰富的程序员,老 C ...

  10. A. Treasure Hunt Codeforces 线性代数

    A. Treasure Hunt time limit per test 1 second memory limit per test 256 megabytes input standard inp ...