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中的闭包
Nov 30 Python
Python应用03 使用PyQT制作视频播放器实例
Dec 07 Python
Python写的一个定时重跑获取数据库数据
Dec 28 Python
Python实现的矩阵类实例
Aug 22 Python
Python通过matplotlib绘制动画简单实例
Dec 13 Python
详解Python中的正则表达式
Jul 08 Python
python将txt等文件中的数据读为numpy数组的方法
Dec 22 Python
对python操作kafka写入json数据的简单demo分享
Dec 27 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
Aug 02 Python
5 分钟读懂Python 中的 Hook 钩子函数
Dec 09 Python
python中random模块详解
Mar 01 Python
python如何进行基准测试
Apr 26 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
收音机的保养
2021/03/01 无线电
destoon公司主页模板风格的添加方法
2014/06/20 PHP
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
PHP开发的微信现金红包功能示例
2017/06/29 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
JQuery 小练习(实例代码)
2009/08/07 Javascript
jquery中获取select选中值的代码
2011/06/27 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
深入理解JavaScript系列(30):设计模式之外观模式详解
2015/03/03 Javascript
jquery实现简单的无缝滚动
2015/04/15 Javascript
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
JQuery的attr 与 val区别
2016/06/12 Javascript
jQuery包裹节点用法完整示例
2016/09/13 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
JavaScript生成随机验证码代码实例
2019/09/28 Javascript
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
Python实现简单截取中文字符串的方法
2015/06/15 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
python3个性签名设计实现代码
2018/06/19 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
大学生求职推荐信
2013/11/27 职场文书
办公室保洁员岗位职责
2013/12/02 职场文书
大学生实习思想汇报
2014/01/12 职场文书
村委会主任先进事迹
2014/01/15 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书