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中让MySQL查询结果返回字典类型的方法
Aug 22 Python
Python随手笔记之标准类型内建函数
Dec 02 Python
Python字典实现简单的三级菜单(实例讲解)
Jul 31 Python
Django+Ajax+jQuery实现网页动态更新的实例
May 28 Python
利用Python读取txt文档的方法讲解
Jun 23 Python
python random从集合中随机选择元素的方法
Jan 23 Python
python图形工具turtle绘制国际象棋棋盘
May 23 Python
Python3常用内置方法代码实例
Nov 18 Python
Python接口自动化判断元素原理解析
Feb 24 Python
django迁移文件migrations的实现
Mar 31 Python
python脚本框架webpy模板赋值实现
Nov 20 Python
Python循环之while无限迭代
Apr 30 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
生成缩略图
2006/10/09 PHP
PHP实现显示照片exif信息的方法
2014/07/11 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
javascript天然的迭代器
2010/10/29 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
jQuery实现点击水纹波动动画
2016/04/10 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
2017/07/31 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
Python进行数据提取的方法总结
2016/08/22 Python
Python数据结构之单链表详解
2017/09/12 Python
python环形单链表的约瑟夫问题详解
2018/09/27 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
HTML+CSS3 模仿Windows7 桌面效果
2010/06/17 HTML / CSS
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
世界上最大的隐形眼镜商店:1-800 Contacts
2018/11/03 全球购物
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
竞聘书模板
2014/03/31 职场文书
人事专员岗位说明书
2014/07/29 职场文书
一年级数学上册复习计划
2015/01/17 职场文书
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL
golang中的struct操作
2021/11/11 Golang