吳恩達老師機器學習筆記K-means聚類演算法(二)
阿新 • • 發佈:2018-11-05
運用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,[]); % 顯示圖片
壓縮結果如下: