3

I have the following MATLAB code :

meanv = [rmean,gmean,bmean];
for i = 1:1:image_info.Height
    for j = 1:1:image_info.Width      % for every pixel
        x = image_rgb(i,j,1:3);
        pix_color = [x(:,:,1),x(:,:,2),x(:,:,3)];
        d = dist(meanv,pix_color');
        if d <= threshold
            S(i,j) = 1;
        end
    end
end

The above fragment is part of a program that, from an RGB image, segments an object or color from a few points marked by the user. The segmentation is achived by means of the euclidean distance to the mean of the points marked by the user. For each pixel if the distance is less than a given threshold then that pixel is white in the segmented image. Otherwise, black.

The code works well, but it's a bit slow. How can I take advantage of the fact that MATLAB is much faster with vectors and matrices than using loops? In other words, how can this code be vectorized?

Divakar
  • 218,885
  • 19
  • 262
  • 358
David Martínez
  • 902
  • 1
  • 7
  • 11

1 Answers1

4

Approach #1 With bsxfun -

%// Get image size
[m,n,r] = size(image_rgb)

%// Calculate squared distances 
M = sum(bsxfun(@minus,reshape(image_rgb,[],3),meanv).^2,2)

%// Check if sq-ed distance satisfy threshold criteria & reshape back to img size
S = reshape(M <= threshold^2 ,m,n)

Approach #2 With matrix-multiplication based euclidean distance calculations -

%// Get image size
[m,n,r] = size(image_rgb)

%// Calculate squared distances 
A = reshape(image_rgb,[],3);
Bt = meanv(:);
M = [A.^2 ones(size(A)) -2*A ]*[ones(size(Bt)) ; Bt.^2 ; Bt]

%// Check if sq-ed distance satisfy threshold criteria & reshape back to img size
S = reshape(M<= threshold^2,m,n)

Quick runtime tests: Running the codes on a random 512 x 512 x 3 image: image_rgb = randi(255,512,512,3), the runtimes were -

---------------------------------- With Original Approach
Elapsed time is 5.850163 seconds.
---------------------------------- With BSXFUN
Elapsed time is 0.006737 seconds.
-------------------------- With Matrix-multiplication based Eucl. dist
Elapsed time is 0.015704 seconds.

More reasons to go for vectorization!

Community
  • 1
  • 1
Divakar
  • 218,885
  • 19
  • 262
  • 358