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求素数示例分享
Feb 16 Python
Python多线程编程(二):启动线程的两种方法
Apr 05 Python
Python的爬虫程序编写框架Scrapy入门学习教程
Jul 02 Python
使用Python3 编写简单信用卡管理程序
Dec 21 Python
python和shell获取文本内容的方法
Jun 05 Python
解决Python 使用h5py加载文件,看不到keys()的问题
Feb 08 Python
Python collections中的双向队列deque简单介绍详解
Nov 04 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
Sep 22 Python
Django3中的自定义用户模型实例详解
Aug 23 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 07 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
Sep 23 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/05 新手入门
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
2014/11/19 PHP
PHP微信分享开发详解
2017/01/14 PHP
PHP $O00OO0=urldecode & eval 解密,记一次商业源码的去后门
2020/09/13 PHP
Prototype Number对象 学习
2009/07/19 Javascript
juqery 学习之四 筛选过滤
2010/11/30 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
jQuery中的pushStack实现原理和应用实例
2015/02/03 Javascript
底部悬浮通栏可以关闭广告位的实现方法
2016/06/01 Javascript
JS基于正则截取替换特定字符之间字符串操作示例
2017/02/03 Javascript
JavaScript数据结构之数组的表示方法示例
2017/04/12 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
mint-ui的search组件在键盘显示搜索按钮的实现方法
2017/10/27 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
2018/11/02 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
小程序中canvas的drawImage方法参数使用详解
2019/07/04 Javascript
python列表操作使用示例分享
2014/02/21 Python
python通过索引遍历列表的方法
2015/05/04 Python
python字符串过滤性能比较5种方法
2017/06/22 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
在python中画正态分布图像的实例
2019/07/08 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
使用Pyhton集合set()实现成果查漏的例子
2019/11/24 Python
关于Python中定制类的比较运算实例
2019/12/19 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
基于Python3.7.1无法导入Numpy的解决方式
2020/03/09 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
了解AppleTalk协议吗
2014/04/01 面试题
物理教学随笔感言
2014/02/22 职场文书
热爱祖国的演讲稿
2014/05/04 职场文书
微观世界观后感
2015/06/10 职场文书
业务员管理制度范本
2015/08/06 职场文书