for i = 1:Kidx = find(DAL(:,K+1) == i);X(idx,:) = repmat(CENTS(i,:),size(idx,1),1); end
full code is given below:
clcclear allclose all%%Load Image
[filename,pathname]=uigetfile({'*.*';'*.bmp';'*.tif';'*.gif';'*.png'},'Pick an Image File');I= im2double(imread([pathname,filename]));size(I)[nrows,ncols,colorchannels]=size(I);F = reshape(I,nrows*ncols,colorchannels); size(F)K = 8; % Cluster Numbers
CENTS = F( ceil(rand(K,1)*size(F,1)) ,:); % Cluster Centers
DAL = zeros(size(F,1),K+2); % Distances and Labels
KMI = 10; % K-means Iteration
for n = 1:KMI %first step is to find nearby cluster for each pixel
for i = 1:size(F,1) for j = 1:K DAL(i,j) = norm(F(i,:) - CENTS(j,:)); %compare the distance between every pixel value with cluster centre.
end [Distance, CN] = min(DAL(i,1:K)); % 1:K are Distance from Cluster Centers 1:K
DAL(i,K+1) = CN; % K+1 is Cluster Label
DAL(i,K+2) = Distance; % K+2 is Minimum Distance
end for i = 1:K A = (DAL(:,K+1) == i); % Cluster K Points
CENTS(i,:) = mean(F(A,:)); % New Cluster Centers
if sum(isnan(CENTS(:))) ~= 0 % If CENTS(i,:) Is Nan Then Replace It With Random Point
NC = find(isnan(CENTS(:,1)) == 1); % Find Nan Centers in first column of cents
for Ind = 1:size(NC,1) CENTS(NC(Ind),:) = F(randi(size(F,1)),:); end end end endX = zeros(size(F));for i = 1:Kidx = find(DAL(:,K+1) == i);X(idx,:) = repmat(CENTS(i,:),size(idx,1),1); endT = reshape(X,nrows,ncols,colorchannels);%%Show
figure()subplot(121); imshow(I); title('original')subplot(122); imshow(T); title('segmented')disp('number of segments ='); disp(K)
Best Answer