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 21 Python
Python制作爬虫采集小说
Oct 25 Python
python控制台中实现进度条功能
Nov 10 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
Mar 02 Python
python根据list重命名文件夹里的所有文件实例
Oct 25 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
Python从入门到精通之环境搭建教程图解
Sep 26 Python
python matplotlib拟合直线的实现
Nov 19 Python
Python for循环搭配else常见问题解决
Feb 11 Python
在Matplotlib图中插入LaTex公式实例
Apr 17 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
字典算法实现及操作 --python(实用)
Mar 31 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
MYSQL环境变量设置方法
2007/01/15 PHP
PHP编码规范-php coding standard
2007/03/16 PHP
给初学者的30条PHP最佳实践(荒野无灯)
2011/08/02 PHP
Java中final关键字详解
2015/08/10 PHP
PHP编写daemon process详解及实例代码
2016/09/30 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
30分钟就入门的正则表达式基础教程
2013/02/25 Javascript
在百度知道团队中快速审批新成员的js脚本
2014/02/02 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
简单的分页代码js实现
2016/05/17 Javascript
详解Node.Js如何处理post数据
2016/09/19 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
微信小程序表单验证错误提示效果
2017/05/19 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
2018/11/06 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
Python基于gevent实现文件字符串查找器
2020/08/11 Python
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
C语言编程题
2015/03/09 面试题
Servlet面试题库
2015/07/18 面试题
读书心得体会
2013/12/28 职场文书
外贸专业求职信
2014/03/09 职场文书
超市仓管员岗位职责
2014/04/07 职场文书
元旦寄语大全
2014/04/10 职场文书
老干部工作先进事迹
2014/08/17 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
2015年银行员工工作总结
2015/04/24 职场文书
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python
MySQL 开窗函数
2022/02/15 MySQL