% 1.計算樣本之間距離function D=sampledist(X,C,method)[n,p]=size(X);k=size(C,1);D=zeros(n,k);switch lower(method(1)) case 'e' %euclidean即歐氏距離 for i=1:k D(:,i)=(X(:,1)-C(i,1)).^2; for j=2:p D(:,i)=D(:,i)+(X(:,j)-C(i,j)).^2; end end case 'c' %cityblock即城市距離 for i=1:k D(:,i)=abs(X(:,1)-C(i,1)); for j=2:p D(:,i)=D(:,i)+abs(X(:,j)-C(i,j)); end end end%2.提取特徵向量function vec=extractvecotr(img)[m,n,~]=size(img);vec=zeros(m*n,3);img=double(img); for j=1:n for i=1:m %提取顏色特徵 color=img(i,j,:); %提取距離特徵 wx=1;wy=1; dist=[wx*j/n,wy*i/m]; dist=[]; %提取紋理特徵 texture=[]; %組成特徵向量 vec((j-1)*m+i,:)=[color(:);dist(:);texture(:)]; endend%3.搜索樣本空間初始聚類中心function C=searchintial(X,method,varargin) switch lower (method(1)) case 's' k=varargin{1}; C=X(randsample(size(X,1),k),:); case 'u' Xmins=min(X,[],1); Xmaxs=max(X,[],1); k=varargin{1}; C=unifrnd(Xmins(ones(k,1),:),Xmaxs(ones(k,1),:)); end%4.圖像聚類分割function [F,C]=imkmeans(I,C)if isempty(C) k=2; C=[];elseif isscalar(C) k=C; C=[];else k=size(C,1);endX=exactvecotr(I);if isempty(C) C=searchintial(X,'sample',k);endCprev=rand(size(C));while true D=sampledist(X,C,'euclidean'); [~,locs]=min(D,[],2); for i=1:k C(i,:)=mean(X(locs==i,:),1); end if norm(C(:)-Cprev(:))<eps break end Cprev=C;end
[m,n,~]=size(I); F=reshape(locs,[m,n]);需要調用的函數編輯好之後就可以讀取圖像進行調試和使用。
clcclose allI=imread('IMG1.jpg');I=double(I)/255;subplot(2,3,1),imshow(I),title('原始圖像') for i=2:6F=imkmeans(I,i);subplot(2,3,i);imshow(F,[]);title(['聚類個數=',num2str(i)])end經過2-6個聚類個數分割的結果如圖所示,不同的圖像可以根據情況調整聚類個數以便於達到理想效果。
以上就是今天介紹的基於K-means聚類算法的MATLAB圖像分割,有需要的朋友們可以自己動手嘗試,歡迎大家分享到朋友圈,讓更多有需要的朋友看到!也歡迎更多MATLAB愛好者和使用者前來交流!參考資料:
[1]陳剛、魏晗、高毫林.MATLAB在數字圖像處理中的應用
[2]楊文茵、徐麗新.MATLAB R2016a數字圖像處理算法分析與實現
圖片來源:由作者拍攝