python中学习K-Means和图片压缩


Posted in Python onNovember 20, 2017

大家在学习python中,经常会使用到K-Means和图片压缩的,我们在此给大家分享一下K-Means和图片压缩的方法和原理,喜欢的朋友收藏一下吧。

python中学习K-Means和图片压缩

通俗的介绍这种压缩方式,就是将原来很多的颜色用少量的颜色去表示,这样就可以减小图片大小了。下面首先我先介绍下K-Means,当你了解了K-Means那么你也很容易的可以去理解图片压缩了,最后附上图片压缩的核心代码。

K-Means的核心思想

python中学习K-Means和图片压缩

python中学习K-Means和图片压缩

k-means的核心算法也就上面寥寥几句,下面将分三个部分来讲解:初始化簇中心、簇分配、簇中心移动。

初始化簇中心

python中学习K-Means和图片压缩

随机取簇中心若是不幸,会出现局部最优的情况;想要打破这种情况,需要多次取值计算来解决这种情况。

代价函数
python中学习K-Means和图片压缩

代码实现

J = zeros(100,1);
M = size(X,1);
min = inf;
for i = 1:100
%随机取k个样本点作为簇中心
randidx = randperm(M);
initial_centroids = X(randidx(1:K),:);
%将所得的中心点进行训练
[centroids0, idx] = runkMeans(X, initial_centroids,10);
for k = 1:M 
J(i) = J(i) + sum((X(k,:) - centroids0(idx(M),:)).^2); 
end
%取最小代价为样本中心点
if(min > J(i))
centroids =centroids0;
end
end

簇分配

将样本点分配到离它最近的簇中心下

tmp = zeros(K,1);
for i = 1:size(X,1)
for j = 1:K
tmp(j) = sum((X(i,:) - centroids(j,:)).^2);
end
[mins,index]=min(tmp);
idx(i) = index;
end

簇中心移动

取当前簇中心下所有样本点的均值为下一个簇中心

for i = 1:m
centroids(idx(i),:) = centroids(idx(i),:) + X(i,:);
end

for j = 1:K
centroids(j,:) = centroids(j,:)/sum(idx == j);
end

图片压缩

% 加载图片
A = double(imread('dragonfly.jpg'));
% 特征缩减
A = A / 255; 
img_size = size(A);
X = reshape(A, img_size(1) * img_size(2), 3);
K = 16; 
max_iters = 10;

%开始训练模型
initial_centroids = kMeansInitCentroids(X, K);
[centroids, idx] = runkMeans(X, initial_centroids, max_iters);

%开始压缩图片
idx = findClosestCentroids(X, centroids);
X_recovered = centroids(idx,:);
X_recovered = reshape(X_recovered, img_size(1), img_size(2), 3);
%输出所压缩的图片
subplot(1, 2, 2);
imagesc(X_recovered)
Python 相关文章推荐
Django 如何获取前端发送的头文件详解(推荐)
Aug 15 Python
用python实现对比两张图片的不同
Feb 05 Python
python的常用模块之collections模块详解
Dec 06 Python
Python实现的KMeans聚类算法实例分析
Dec 29 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
Jun 19 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
Aug 19 Python
Python3 实现减少可调用对象的参数个数
Dec 20 Python
python求一个字符串的所有排列的实现方法
Feb 04 Python
Python图像处理库PIL的ImageDraw模块介绍详解
Feb 26 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
Django+Uwsgi+Nginx如何实现生产环境部署
Jul 31 Python
python入门教程之基本算术运算符
Nov 13 Python
深入理解Python中的super()方法
Nov 20 #Python
python实现读取excel写入mysql的小工具详解
Nov 20 #Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
Nov 20 #Python
python Matplotlib画图之调整字体大小的示例
Nov 20 #Python
python cx_Oracle的基础使用方法(连接和增删改查)
Nov 19 #Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 #Python
python中urlparse模块介绍与使用示例
Nov 19 #Python
You might like
请php正则走开
2008/03/15 PHP
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
php 删除无限级目录与文件代码共享
2008/11/22 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
PHP文件大小格式化函数合集
2014/03/10 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
jquery的clone方法应用于textarea和select的bug修复
2014/06/26 Javascript
js实现鼠标点击左上角滑动菜单效果代码
2015/09/06 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
javascript实现简易计算器
2017/02/01 Javascript
微信小程序 参数传递实例代码
2017/03/20 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
浅谈React组件之性能优化
2018/03/02 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
layui使用label标签的方法
2019/09/14 Javascript
js实现搜索提示框效果
2020/09/05 Javascript
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
在Python中使用base64模块处理字符编码的教程
2015/04/28 Python
Python检测QQ在线状态的方法
2015/05/09 Python
python获取中文字符串长度的方法
2018/11/14 Python
Python-numpy实现灰度图像的分块和合并方式
2020/01/09 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2020/02/17 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
音乐学个人的自荐书范文
2013/11/26 职场文书
《湘夫人》教学反思
2014/02/21 职场文书
孩子教育的心得体会
2014/09/01 职场文书
暑期社会实践心得体会
2014/09/02 职场文书
先进员工事迹材料
2014/12/20 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书
大学生社会服务心得体会
2016/01/22 职场文书
pytorch 如何使用batch训练lstm网络
2021/05/28 Python