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执行外部程序的常用方法小结
Mar 21 Python
Python中使用partial改变方法默认参数实例
Apr 28 Python
python安装以及IDE的配置教程
Apr 29 Python
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
Jul 27 Python
Python 字符串与数字输出方法
Jul 16 Python
Django 视图层(view)的使用
Nov 09 Python
对Python生成器、装饰器、递归的使用详解
Jul 19 Python
Anaconda+vscode+pytorch环境搭建过程详解
May 25 Python
python图片验证码识别最新模块muggle_ocr的示例代码
Jul 03 Python
Python异常处理机制结构实例解析
Jul 23 Python
python pip如何手动安装二进制包
Sep 30 Python
正确的理解和使用Django信号(Signals)
Apr 14 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+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
php之可变变量的实例详解
2017/09/12 PHP
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
2009/10/24 Javascript
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
2013/10/08 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
JavaScript中的toDateString()方法使用详解
2015/06/12 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
jQuery动态星级评分效果实现方法
2015/08/06 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
微信小程序 封装http请求实例详解
2017/01/16 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
nodejs实现套接字服务功能详解
2018/06/21 NodeJs
关于js对textarea换行符的处理方法浅析
2018/08/03 Javascript
angular的输入和输出的使用方法
2018/09/22 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
[06:53]2018DOTA2国际邀请赛寻真——为复仇而来的Newbee
2018/08/15 DOTA
在Python程序中实现分布式进程的教程
2015/04/28 Python
教你使用python实现微信每天给女朋友说晚安
2018/03/23 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
基于pandas中expand的作用详解
2019/12/17 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
2021/01/06 Python
html5中使用hotcss.js实现手机端自适配的方法
2020/04/23 HTML / CSS
英国第一豪华护肤品牌:Elemis
2017/10/12 全球购物
环卫工人节活动总结
2014/08/29 职场文书
公司授权委托书样本
2014/09/15 职场文书
诚实守信主题班会
2015/08/13 职场文书
css实现文章分割线样式的多种方法总结
2021/04/21 HTML / CSS
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server