Reputation: 369
In this code, I have a cluster image with 10 classes and i want to extract 10 different images for each level and save as a 10 images Below is the code, I used
tic
numberOfClasses = 10;
segment_label_images = cell(1,numberOfClasses);
pixelCount = zeros(1,numberOfClasses);
[rs, cs] = size(classImage);
% classImage has intensity range from 1-numberOfClasses
for k = 1:numberOfClasses
for i = 1:rs
for j = 1:cs
if classImage(i,j) == k
segment_label_images{k}(i,j) = 1;
else
segment_label_images{k}(i,j) = 0;
end
end
end
pixelCount(k) = sum(segment_label_images{k}(:));
%figure, imshow(segment_label_images{k},[]);
end
toc
Here, I have 3 for loops and I think that is affecting computational time. Elapsed time is 0.089413 seconds.
Any suggestions to avoid for loop to improve comp time.? Thanks, Gopi
Upvotes: 0
Views: 42
Reputation: 16791
Assuming MATLAB 2016b (or Octave):
k = permute(1:numberOfClasses, [1,3,2]);
segment_label_images = (classImage == k);
pixelCount = squeeze(sum(sum(segment_label_images, 1), 2));
For pre-2016b MATLAB, just add bsxfun
:
k = permute(1:numberOfClasses, [1,3,2]);
segment_label_images = bsxfun(@eq, classImage, k);
pixelCount = squeeze(sum(sum(segment_label_images, 1), 2));
Of course, both of these leave segment_label_images
as a 3D array rather than a cell array. Given that all of the arrays are the same size, I prefer to work with multi-dimensional arrays rather than cell arrays, for speed and convenience. It can, of course, be converted to a cell array if necessary.
Upvotes: 0
Reputation: 11628
Assuming classImage
is a matrix you could speed it up with
for k = 1:numberOfClasses
segment_label_images{k} = classImage == k;
pixelCount(k) = sum(segment_label_images{k}(:));
end
Upvotes: 3