[cs229] k-means 图像压缩

本文介绍了一种使用K-means算法进行图像压缩的方法。通过减少RGB颜色表示的数量,从24位降至16种颜色,实现了有损图像压缩。文章展示了压缩前后图像的对比,并提供了MATLAB代码。

k-means 算法因为简单易实现,所以有许多应用。其中一个有意思是应用于有损图像压缩。其核心思想是通过聚类将颜色表示数量减少。例如,传统RGB,每个通道0~255(8 bits),则可以表示16777216 (24 bits)种颜色,通过聚类可以减少到16种颜色。下面以此为例,比较一下原始图像与压缩图像。

迭代次数 50 次,聚类数目 16。
图像来源:http://cs229.stanford.edu/ps/ps3/mandrill-large.tiff

可见颜色减少了很多,图像变得没那么细腻了。

原始图像:
原始图像

压缩图像:
压缩图像(16 cluster)

matlab 代码如下:

A = double(imread('mandrill-large.tiff'));
[M, N, V] = size(A);

% Training param
numIter = 50;  % 迭代次数
K = 16;        % 聚类数
m = M*N;       % 样本数

% reshape to X, y
y = 1 : M*N;            % 聚类结果
X = reshape(A, M*N, V); % 样本

% Init centroids (choose 16 sample randomly).
cen = X(randperm(M*N, K), :);

% k-means 迭代
for t = 1:numIter
    % 为每个样本选择一个质心。
    for i = 1:m
        y(i) = nearest(X(i,:), cen);  % 最近的质心(欧式距离,请自定义)
    end
    % 更新所有质心。
    for j = 1:K
       cluster = X(y == j, :);
       cen(j,:) =  sum(cluster, 1) / size(cluster, 1);
    end
end

% 聚类量化
Z = X;
for i = 1:m
    Z(i, :) = cen(y(i), :);
end

B = reshape(Z, M, N, V);
imshow(uint8(round(B)));
figure();
imshow(uint8(round(A)));
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值