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 相关文章推荐
Python中input与raw_input 之间的比较
Aug 20 Python
Python编程使用NLTK进行自然语言处理详解
Nov 16 Python
python模仿网页版微信发送消息功能
Feb 24 Python
Python简单定义与使用二叉树示例
May 11 Python
解决python selenium3启动不了firefox的问题
Oct 13 Python
python退出命令是什么?详解python退出方法
Dec 10 Python
Python列表删除元素del、pop()和remove()的区别小结
Sep 11 Python
python实现代码统计器
Sep 19 Python
Python pandas如何向excel添加数据
May 22 Python
python编写一个会算账的脚本的示例代码
Jun 02 Python
详解pytorch tensor和ndarray转换相关总结
Sep 03 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
Apr 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
什么是短波收听SWL
2021/03/01 无线电
PHP.MVC的模板标签系统(五)
2006/09/05 PHP
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
PHP+jquery实时显示网站在线人数的方法
2015/01/04 PHP
PHP调用Linux命令权限不足问题解决方法
2015/02/07 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
img onload事件绑定各浏览器均可执行
2012/12/19 Javascript
jQuery中(function(){})()执行顺序的理解
2013/03/05 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
jQuery取得select选择的文本与值的示例
2013/12/09 Javascript
javascript 数字格式化输出的实现代码
2013/12/10 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
判断iframe里的页面是否加载完成
2014/06/06 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
jQuery html表格排序插件tablesorter使用方法详解
2017/02/10 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
Node.js之readline模块的使用详解
2019/03/25 Javascript
了解在JavaScript中将值转换为字符串的5种方法
2019/06/06 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
Python3读取zip文件信息的方法
2015/05/22 Python
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
python的re正则表达式实例代码
2018/01/24 Python
python OpenCV学习笔记直方图反向投影的实现
2018/02/07 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
详解html5 canvas 微信海报分享(个人爬坑)
2018/01/12 HTML / CSS
自荐书封面下载
2013/11/29 职场文书
优秀学生评语大全
2014/04/25 职场文书
关于感恩的演讲稿200字
2014/08/26 职场文书
python编写函数注意事项总结
2021/03/29 Python