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 17 Python
简单谈谈Python流程控制语句
Dec 04 Python
Python实现压缩和解压缩ZIP文件的方法分析
Sep 28 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 Python
python多进程使用及线程池的使用方法代码详解
Oct 24 Python
python time.sleep()是睡眠线程还是进程
Jul 09 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 Python
python之pymysql模块简单应用示例代码
Dec 16 Python
Python 文件数据读写的具体实现
Jan 24 Python
使用python的turtle函数绘制一个滑稽表情
Feb 28 Python
Python远程linux执行命令实现
Nov 11 Python
python中print格式化输出的问题
Apr 16 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之第四天
2006/10/09 PHP
谈谈PHP语法(5)
2006/10/09 PHP
中篇:安装及配置PHP
2006/12/13 PHP
php实现的mongodb操作类
2015/05/28 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
2016/09/30 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
ext读取两种结构的xml的代码
2008/11/05 Javascript
关于javascript document.createDocumentFragment()
2009/04/04 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
2013/06/08 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
AngularJS基础 ng-repeat 指令简单示例
2016/08/03 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
RGB和YUV 多媒体编程基础详细介绍
2016/11/04 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
vue简单练习 桌面时钟的实现代码实例
2019/09/19 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
Python多进程分块读取超大文件的方法
2016/04/13 Python
python实现中文转换url编码的方法
2016/06/14 Python
详解python脚本自动生成需要文件实例代码
2017/02/04 Python
Python实现求笛卡尔乘积的方法
2017/09/16 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
python实现雨滴下落到地面效果
2018/06/21 Python
python pandas 时间日期的处理实现
2019/07/30 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
优秀员工年终发言演讲稿
2014/01/01 职场文书
Python Pandas常用函数方法总结
2021/06/15 Python
MySQL索引是啥?不懂就问
2021/07/21 MySQL