一种压缩图片的方法---Machine learning 之 K-Means

背景描述:

  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:

时间: 2024-10-04 16:24:18

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

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

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

OpenCV Machine Learning 之 K最近邻分类器 K-Nearest Neighbors

K-Nearest Neighbors 该算法存储所有的训练样本(已知标签),然后通过分析新给的样本(标签未知)与已知标签的训练样本的相似度,选出其中的K个最相似的训练样本进行投票得到新样本的标签,并计算加权和等. 该方法有时被称为是"learning by example",因为他总是根据新样本的特征向量与已知标签的样本特征向量的相似度来判断新样本的类别. CvKNearest class CvKNearest : public CvStatModel 该类实现了 K-Nearest

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

OpenCV Machine Learning 之 K最近邻分类器的应用 下面的程序实现了对高斯分布的点集合进行分类的K最近令分类器 程序运行结果: OpenCV Machine Learning 之 K最近邻分类器的应用 K-Nearest Neighbors,布布扣,bubuko.com

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

代码=图片 图片=代码 JS代码对于喜欢F12的同志来说,连个遮羞布都没有... 虽然把代码变成图片也仅仅只是增加一层纱布而已...但这方法还是挺好玩的,而且代码也被压缩了一点. 第一次看到[图片=代码]的想法,是在一个演示视屏拼图的博客里看到的. 最近有点闲,想起了这个,就试了试. 对于中文等字符,需要先转为十六禁止后,再转为图片的RGB像素 document.write(escape("字") ); //%u5B57 document.write(unescape("%u

等比压缩图片的方法

- (UIImage*)imageEqualRatioScaledToSize:(CGSize)targetSize { UIImage *sourceImage = self; UIImage *newImage = nil; CGSize imageSize = sourceImage.size; CGFloat srcWidth = imageSize.width; CGFloat srcHeight = imageSize.height; CGFloat targetWidth = ta

linux下几种压缩、解压缩方法

解压.tar.gz 和.gz文件解压的方式 1.tar.gz 使用tar命令进行解压 tar -zxvf file.tar.gz 解压到指定的文件夹 tar -zxvf file.tar.gz -C /usr/local/src 注意:zv可以直接省略 2.gz文件的解压 gzip 命令 gzip -b java.gz 或者 使用zcat 命令,然后将标准输出 保存文件 zcat file.gz > file.log 原文地址:https://blog.51cto.com/11288550/24

压缩图片大小的方法介绍

上传图片的时候我们会发现很多网站对图片大小的限制一般都是最大不超过20k,可能这是一个最佳的大小吧,既然规定了,就只能按照规定的大小进行上传,不过超过20k的图片那真的数不胜数了,遇到过大的图片只能进行大小的压缩,下面是压缩图片大小的方法介绍,不知道方法的话可以来学习一下!具体方法如下:图片压缩软件请添加链接描述可以压缩图片1:打开压缩软件,点击图片压缩就好. 2:添加要进行压缩的图片,点击添加文件或者添加文件夹的按钮就可以选择文件,一次可以同时压缩很多张图片.3:在添加文件下面有输出格式以及压

图片压缩的具体方法你知道多少

在我们日常的工作中,会接触到很多图片文件,而有些图片还需要经常的进行大小的改变,如果一个网站对于图片有大小的限制,那么我们就需要将我们手中的图片压缩变小,图片压缩的具体方法你知道多少呢?下面小编为大家介绍一个压缩图片的方法,希望可以帮到你!参考迅捷压缩软件1:电脑上安装图片压缩软件,压缩软件有三个压缩的功能.点击图片压缩就可以. 2:添加要进行压缩的图片,点击页面中的添加文件或者添加文件夹的按钮,选择目标文件. 3:点击选择一个合适的压缩选项,在添加文件下有输出格式和压缩选项的设置,根据实际情况

Android压缩图片和libjpeg库

前言 Fjpeg使用 Fjpeg 注意 如何使用 如何压缩图片只改变在硬盘的存储大小 如何改变图片分辨率让其Bitmap对象可以加载到内存中 关于重载版本 开始学习之旅 补充知识的结论 修改图片分辨率 防止在Android加载Bitmap的时候oom内存溢出 解决方案1 解决方案2 希望压缩图片方便网络传输 第一种方案利用Bitmapcompress方法压缩 第二种利用libjpeg压缩 在Android50测试两个 图片压缩 在Android60测试两个 图片压缩 解释Android50和60