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实现随机密码字典生成器示例
Apr 09 Python
使用wxPython获取系统剪贴板中的数据的教程
May 06 Python
Python中基础的socket编程实战攻略
Jun 01 Python
Python新手入门最容易犯的错误总结
Apr 24 Python
python中利用Future对象回调别的函数示例代码
Sep 07 Python
Python星号*与**用法分析
Feb 02 Python
python获取当前文件路径以及父文件路径的方法
Jul 10 Python
python字符串的拼接方法总结
Nov 18 Python
Python文本文件的合并操作方法代码实例
Mar 31 Python
解决Keras使用GPU资源耗尽的问题
Jun 22 Python
使用Python+Appuim 清理微信的方法
Jan 26 Python
python使用PySimpleGUI设置进度条及控件使用
Jun 10 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自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
2019/05/06 PHP
漂亮的提示信息(带箭头)
2007/03/21 Javascript
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
2011/09/20 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
jQuery ajax调用WCF服务实例
2014/07/16 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
JS实现的仿淘宝交易倒计时效果
2015/11/27 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
2016/06/16 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
ECMAScript6--解构
2017/03/30 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
详解Chai.js断言库API中文文档
2018/01/31 Javascript
Vue.js添加组件操作示例
2018/06/13 Javascript
vue采用EventBus实现跨组件通信及注意事项小结
2018/06/14 Javascript
详解vue2.0监听属性的使用心得及搭配计算属性的使用
2018/07/18 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
Vue中keep-alive组件作用详解
2020/02/04 Javascript
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
从零学Python之hello world
2014/05/21 Python
python决策树之CART分类回归树详解
2017/12/20 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
利用Python绘制Jazz网络图的例子
2019/11/21 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
UNIX文件系统常用命令
2012/05/25 面试题
美术国培研修感言
2014/02/12 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
幼儿园家长寄语
2014/04/02 职场文书
厨房管理计划书
2014/04/27 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
银行业务授权委托书
2014/10/10 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
工作证明格式范文
2015/06/15 职场文书
Python中三种花式打印的示例详解
2022/03/19 Python
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL