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 相关文章推荐
Python3使用PyQt5制作简单的画板/手写板实例
Oct 19 Python
酷! 程序员用Python带你玩转冲顶大会
Jan 17 Python
Python中的random.uniform()函数教程与实例解析
Mar 02 Python
Python Web框架之Django框架Form组件用法详解
Aug 16 Python
Python 合并多个TXT文件并统计词频的实现
Aug 23 Python
python+rsync精确同步指定格式文件
Aug 29 Python
python批量处理文件或文件夹
Jul 28 Python
python通过链接抓取网站详解
Nov 20 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
Feb 20 Python
python导入库的具体方法
Jun 18 Python
浅析python函数式编程
Sep 26 Python
Python中Qslider控件实操详解
Feb 20 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的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
php读取和保存base64编码的图片内容
2017/04/22 PHP
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
2016/09/24 Javascript
bootstrap快速制作后台界面
2016/12/05 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
2017/01/05 Javascript
bootstrap栅格系统示例代码分享
2017/05/22 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
node.js自动上传ftp的脚本分享
2018/06/16 Javascript
在 Vue.js中优雅地使用全局事件的方法
2019/02/01 Javascript
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
2019/10/10 Javascript
vue 解决遍历对象显示的顺序不对问题
2019/11/07 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
Js逆向实现滑动验证码图片还原的示例代码
2020/03/10 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
Python使用matplotlib的pie函数绘制饼状图功能示例
2018/01/08 Python
python,Django实现的淘宝客登录功能示例
2019/06/12 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
英国标准协会商店:BSI Shop
2019/02/25 全球购物
什么是封装
2013/03/26 面试题
求职意向书
2014/04/01 职场文书
社区党员干部承诺书
2015/05/04 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
初二物理教学反思
2016/02/19 职场文书
Android Flutter实现图片滑动切换效果
2022/04/07 Java/Android
改造DE1103三步曲
2022/04/07 无线电