1. 程式人生 > >吳恩達老師機器學習筆記K-means聚類演算法(二)

吳恩達老師機器學習筆記K-means聚類演算法(二)

運用K-means聚類演算法進行影象壓縮

趁熱打鐵,修改之前的演算法來做第二個練習—影象壓縮

原始圖片如下:
在這裡插入圖片描述
程式碼如下:

X =imread('bird.png'); % 讀取圖片
X =im2double(X); % unit8轉成double型別
[m,n,z]=size(X);
X=reshape(X,m*n,z);
x=zeros(m*n,z+1);
x(1:m*n,1:z)=X;
Z_min=9999999; 
centre_best=zeros(16,1); %最優顏色列表
y=zeros(m*n,1); % 最優類別結果
for iter=1:1 % 選擇最優的聚類的結果
    start=round(rand(16,1)*(m*n-1)+1); % 隨機化聚類中心
    start_centre=X(start,:);
    Z_sum=0;
    for j=1:200 % 判斷樣本距離最近的中心
        for i=1:m*n
            Z=sum((x(i,1:z)-start_centre(:,1:z)).^2,2);
            [min_value,min_index]=min(Z);
            x(i,z+1)=min_index;
        end
        for i=1:16 % 壓縮成16種顏色
            start_centre(i,:)=mean(X(x(:,z+1)==i,:)); % 生成新的聚類中心
        end
    end
    for i=1:m*n % 計算成本函式
        Z_sum=sum((x(i,1:z)-start_centre(x(i,z+1),1:z)).^2,2)+Z_sum;
    end
    if Z_min>Z_sum % 選取成本最小的結果作為最優結果
       Z_min=Z_sum;
       y=x(:,z+1);    
       centre_best=start_centre;
    end       
end
for i=1:n*m
    x(i,1:z)= centre_best(y(i,:),:);
end
x(:,4)=[];
X=reshape(x,m,n,z);
imshow(X,[]); % 顯示圖片

壓縮結果如下:
在這裡插入圖片描述