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基础教程之udp端口扫描
Feb 10 Python
Python Trie树实现字典排序
Mar 28 Python
Python查询IP地址归属完整代码
Jun 21 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
Mar 04 Python
致Python初学者 Anaconda入门使用指南完整版
Apr 05 Python
Django添加sitemap的方法示例
Aug 06 Python
通过pykafka接收Kafka消息队列的方法
Dec 27 Python
浅谈python中get pass用法
Mar 19 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
Python Sphinx使用实例及问题解决
Jan 17 Python
Python中实现输入超时及如何通过变量获取变量名
Jan 18 Python
Pandas —— resample()重采样和asfreq()频度转换方式
Feb 26 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会话控制:Session与Cookie详解
2014/09/27 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
js实现点击添加一个input节点
2014/12/05 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
JS实现的自定义网页拖动类
2015/11/06 Javascript
jQuery多文件异步上传带进度条实例代码
2016/08/16 Javascript
Angular 4.x 路由快速入门学习
2017/05/03 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
详解Node.js异步处理的各种写法
2019/06/09 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
js布局实现单选按钮控件
2020/01/17 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
Python代理抓取并验证使用多线程实现
2013/05/03 Python
python装饰器与递归算法详解
2016/02/18 Python
python实现抖音视频批量下载
2018/06/20 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
HTML5调用手机摄像头拍照的实现思路及代码
2014/06/15 HTML / CSS
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
材料加工硕士生求职信
2013/10/10 职场文书
大学生冰淇淋店商业计划书
2014/01/14 职场文书
优秀教师事迹简介
2014/02/02 职场文书
幼儿园教研活动总结
2014/04/30 职场文书
团日活动总结书
2014/05/08 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
电影地道战观后感
2015/06/04 职场文书
公司宣传语大全
2015/07/13 职场文书
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android
Python多个MP4合成视频的实现方法
2021/07/16 Python
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB