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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM