How can I alterate a mask for Kmeans segmentation

1 view (last 30 days)
Dear all,
For K-means segmentation I used this code:
K = 4; % cluster number
men = menu('Choose the region of analysis','ALL image','Bounding box');
%%
[fname path]=uigetfile('*.*','Enter and Image');
fname=strcat(path, fname);
im=imread(fname);
figure, imshow(im)
%% ROI
if men==1
rect=[1,1,size(im,2)-1,size(im,1)-1];
elseif men==2
figure(),imshow(im)
rect = ceil(getrect());
close
end
% Mask
M = false(size(im(:,:,1)));
M(rect(2):rect(2)+rect(4),...
rect(1):rect(1)+rect(3)) = true;
%% function
[L,C_RGB] = kmeansfcn(im,K,M);
hold on;
figure('Position',[168,182,1625,744])
subplot(2,1,1),imshow(im)
title('Imagine originala')
% legend
leg = {}; hold on
for i=1:K
Col = (C_RGB(i,:)./255);
leg(i,:)={['Cluster ',num2str(i)]};
plot(1,1,'LineWidth',12,'Color',Col)
end
legend(leg,'FontSize',12);hold off
L=L(1:4:end, 1:4:end,:); % subsampling-iau din 4 in 4 pixeli=> micsorez aria de 4 ori
subplot(2,1,2),imshow(L,[])
title('Segmentare pe clustere')
with this function:
function [L,C_RGB] = kmeansfcn(img,K, mask)
if length(size(img))==3
X = [reshape(img(:,:,1),[],1),...
reshape(img(:,:,2),[],1),...
reshape(img(:,:,3),[],1)];
else
X = reshape(img(:,:,1),[],1);
end
mask = reshape(mask,[],1);
X2 = X(mask,:);
[Clust,C] = kmeans(double(X2),K,'Replicates',6);
C_RGB = round(C);
idx =uint8(mask);
idx2 = find(idx);
for i=1:length(idx2)
idx(idx2(i)) = Clust(i);
end
L= reshape(idx,size(img,1),size(img,2));
The code works just fine on sole images, but now I want to run it on an image database and I don't need anymore the whole ROI and the menu thing BUT I don't know how change the mask in the main code.
M = false(size(im(:,:,1)));
M(rect(2):rect(2)+rect(4),...
rect(1):rect(1)+rect(3)) = true;
I understand that this is related to the first part where I draw a rectangle over the region of interest but I can't see how to eliminate that first part without affecting the rest of my code.
Thanks in advance!!
LATER EDIT: I wish to use the full image option for all images, not the bounding box one.
  2 Comments
Rik
Rik on 16 Jun 2019
Do you want to use the full image for all images, or the bounding box?

Sign in to comment.

Accepted Answer

Walter Roberson
Walter Roberson on 16 Jun 2019
M = true(size(im,1), size(im,2));

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!