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 相关文章推荐
PyMongo安装使用笔记
Apr 27 Python
在Python中操作字符串之rstrip()方法的使用
May 19 Python
Python实现TCP/IP协议下的端口转发及重定向示例
Jun 14 Python
Python生成随机数组的方法小结
Apr 15 Python
Python将一个Excel拆分为多个Excel
Nov 07 Python
Python Excel处理库openpyxl使用详解
May 09 Python
python多项式拟合之np.polyfit 和 np.polyld详解
Feb 18 Python
Python关于反射的实例代码分享
Feb 20 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
Python代码需要缩进吗
Jul 01 Python
python3爬虫中引用Queue的实例讲解
Nov 24 Python
Python函数中apply、map、applymap的区别
Nov 27 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里大量数据循环时内存耗尽的方法
2015/10/10 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
JavaScript实现汉字转换为拼音的库文件示例
2016/12/22 Javascript
js遍历json对象所有key及根据动态key获取值的方法(必看)
2017/03/09 Javascript
js+html5实现复制文字按钮
2017/07/15 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
JS判断数组那点事
2017/10/10 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
2017/12/26 Javascript
JS 实现百度搜索功能
2018/02/01 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
深入分析jQuery.one() 函数
2020/06/03 jQuery
打包发布Python模块的方法详解
2016/09/18 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
2018/05/29 Python
Python Series从0开始索引的方法
2018/11/06 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
python实现简单井字棋小游戏
2020/03/05 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
Vinatis德国:法国领先的葡萄酒邮购公司
2020/09/07 全球购物
Java多态性的定义以及类型
2014/09/16 面试题
蛋糕店的商业计划书范文
2014/01/27 职场文书
前处理班长职位说明书
2014/03/01 职场文书
行政内勤岗位职责
2014/04/07 职场文书
学生党员公开承诺书
2014/05/28 职场文书
大学生活动总结模板
2014/07/02 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
毕业证代领委托书
2014/09/26 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
实习单位推荐信
2015/03/27 职场文书
2015初中团支部工作总结
2015/07/21 职场文书