MatLab - Best way of finding the closest value

I'm working with Matlab's image toolbox. In particular, after binarizing and labeling an image, I run

props = regionprops(labeledImage, 'Centroid');

to get the centroid of all the connected objects. Now, I would like to find the one closer to a pair of coordinates (namely the center of the image). Of course I know I could use a for loop checking each props[i].Centroid pair of coordinates, but that's slow and there must be a matlaby way of doing it...

which is...?

Thanks in advance

Upvotes: 2

Views: 1381

Answers (1)

gnovice
gnovice

Reputation: 125874

The output from REGIONPROPS will be an N-by-1 structure array with one field 'Centroid' that contains a 1-by-2 array. You can first concatenate all these arrays into an N-by-2 array using the function VERTCAT. Then you can replicate your image center coordinates (assumed to be in a 1-by-2 array) using the function REPMAT so that it becomes an N-by-2 array. Now you can compute the distances using vectorized operations and find the index of the value with the minimum distance using the function MIN:

props = regionprops(labeledImage, 'Centroid');
centers = vertcat(props.Centroid);  %# Vertically concatenate the centroids
imageCenter = [x y];                %# Your image center coordinates
origin = repmat(imageCenter,numel(props),1);      %# Replicate the coordinates
squaredDistance = sum(abs(centers-origin).^2,2);  %# Compute the squared distance
[~,minIndex] = min(squaredDistance);              %# Find index of the minimum

Note that since you just want the minimum distance, you can just use the squared distances and avoid a needless call to SQRT. Also note that the function BSXFUN could be used as an alternative to replicating the image center coordinates to subtract them from the object centroids.

Upvotes: 3

Related Questions