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的web框架编写前端模版的教程
Apr 30 Python
Python正则抓取网易新闻的方法示例
Apr 21 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
Python星号*与**用法分析
Feb 02 Python
浅析Python装饰器以及装饰器模式
May 28 Python
Python实现对文件进行单词划分并去重排序操作示例
Jul 10 Python
python matplotlib饼状图参数及用法解析
Nov 04 Python
Python中bisect的使用方法
Dec 31 Python
Python vtk读取并显示dicom文件示例
Jan 13 Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 Python
Python单元测试及unittest框架用法实例解析
Jul 09 Python
一行代码python实现文件共享服务器
Apr 22 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写入WRITE编码为UTF8的文件的实现代码
2008/07/07 PHP
php 结果集的分页实现代码
2009/03/10 PHP
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
javascript操作数组详解
2014/12/17 Javascript
简易的投票系统以及js刷票思路和方法
2015/04/07 Javascript
JS实现的简洁二级导航菜单雏形效果
2015/10/13 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
JavaScript数据类型转换的注意事项
2016/07/31 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
nodejs实现截取上传视频中一帧作为预览图片
2017/12/10 NodeJs
基于js文件加载优化(详解)
2018/01/03 Javascript
浅谈开发eslint规则
2018/10/01 Javascript
微信小程序CSS3动画下拉菜单效果
2018/11/04 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
举例讲解Python中is和id的用法
2015/04/03 Python
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
Python的SQLAlchemy框架使用入门
2015/04/29 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
详解Python3的TFTP文件传输
2018/06/26 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
2020/04/22 Python
Scrapy 配置动态代理IP的实现
2020/09/28 Python
警示教育活动总结
2014/05/05 职场文书
关于感恩的演讲稿800字
2014/08/26 职场文书
报到证办理个人委托书
2014/10/06 职场文书
公司保洁员岗位职责
2015/02/13 职场文书
小学运动会加油稿
2015/07/22 职场文书
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang