python中学习K-Means和图片压缩

yipeiwu_com6年前Python基础

大家在学习python中,经常会使用到K-Means和图片压缩的,我们在此给大家分享一下K-Means和图片压缩的方法和原理,喜欢的朋友收藏一下吧。

通俗的介绍这种压缩方式,就是将原来很多的颜色用少量的颜色去表示,这样就可以减小图片大小了。下面首先我先介绍下K-Means,当你了解了K-Means那么你也很容易的可以去理解图片压缩了,最后附上图片压缩的核心代码。

K-Means的核心思想

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 3 实现定义跨模块的全局变量和使用教程

尽管某些书籍上总是说避免使用全局变量,但是在实际的需求不断变化中,往往定义一个全局变量是最可靠的方法,但是又必须要避免变量名覆盖。 Python 中 global 关键字可以定义一个变量...

简单谈谈python中的Queue与多进程

简单谈谈python中的Queue与多进程

最近接触一个项目,要在多个虚拟机中运行任务,参考别人之前项目的代码,采用了多进程来处理,于是上网查了查python中的多进程 一、先说说Queue(队列对象) Queue是python中...

Python简单实现TCP包发送十六进制数据的方法

本文实例讲述了Python简单实现TCP包发送十六进制数据的方法。分享给大家供大家参考,具体如下: 举例: 0x12, 0x34可以直接拼成 "\x12\x34"。 客户端代码示例:...

Python基础中所出现的异常报错总结

Python基础中所出现的异常报错总结

今天我们来探索python中大部分的异常报错 首先异常是什么,异常白话解释就是不正常,程序里面一般是指程序员输入的格式不规范,或者需求的参数类型不对应,不全等等。 打个比方很多公司年终...

python之Socket网络编程详解

python之Socket网络编程详解

什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系。在数学上,网络是一种图,一般认为专指加权图。网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象...