# how can remove the object that has the maximum distance from center of image?

1 view (last 30 days)

Show older comments

if we have some objects in a binary image how can remove the object that has the maximum distance from center of image? for example if this is my image:

how can I obtain this image as result:

thanks

##### 4 Comments

Guillaume
on 17 Oct 2014

By define, I meant tell us what you mean. Is the distance of the object to the centre

- the distance from the object centroid to the centre?
- the distance from the furthest point of the object to the centre?
- the distance from the closest point of the object to the centre?
- something else?

### Answers (6)

Matt J
on 17 Oct 2014

Edited: Matt J
on 17 Oct 2014

how can I obtain this image as result:

I don't recommend that you use distance as a criterion. It would work, but for the object you've shown, it seems quicker and easier to use solidity,

S=regionprops(Image,'Solidity','PixelIdxList');

[~,idx]=min([S.Solidity]);

Image(S(idx).PixelIdxList)=0;

This is also shift-invariant, whereas the distance criterion is not.

##### 9 Comments

Matt J
on 17 Oct 2014

Edited: Matt J
on 17 Oct 2014

Using distance as the criterion,

L=bwlabel(Image);

[M,N]=size(Image);

[X,Y]=ndgrid((1:M)-M/2-.5,(1:N)-N/2-.5);

distmask=(X.^2+Y.^2).*Image;

idx=L>0;

Lmin=accumarray(L(idx),distmask(idx),[],@min);

[~,idx]=max(Lmin);

Image(L==idx)=0;

##### 4 Comments

Matt J
on 17 Oct 2014

Image Analyst
on 17 Oct 2014

sara: Try the attached code (below the image in blue). I basically threshold, do a morphological opening to break away the thin table line, then extract the biggest blob. A snippet:

% Get the binaryImage

binaryImage = grayImage > 135;

% Erode to break away the table from the body

binaryImage = imopen(binaryImage, [1;1;1]);

biggestBlob = ExtractNLargestBlobs(binaryImage, numberToExtract);

It gives the image below:

##### 0 Comments

Image Analyst
on 22 Jan 2015

"Close" has several definitions. See Hausdorf distance. But let's just assume you want the pair that has the lowest distance between the centroids. Just get the centroids using regionprops() into two arrays centroidx and centroidy. Then calculate the distances, something like

distances = zeros(numberOfBlobs, numberOfBlobs);

for b1 = 1 : numberOfBlobs

for b2 = b1 : numberOfBlobs

distances(b1,b2) = sqrt((centroidx(b1)-centroidx(b2))^2+(centroidy(b1)-centroid(b2))^2);

end

end

Then find the min pair

[blob1, blob2] = find(distances == min(distances(:)));

Then use ismember() to extract those two blobs:

binaryImage = ismember(labeledImage, [blob1, blob2]) > 0;

or something like that. That's just off the top of my head and may need editing.

If this answers your question, can you "Accept" my answer?

##### 3 Comments

rsnandi
on 12 Jul 2019

Image Analyst
on 13 Jul 2019

Get the bounding box

props = regionprops(binaryImage, 'BoundingBox');

allBB = vertcat(props.BoundingBox);

% Find just top lines alone.

topLines = allBB(:, 2); % Extract column 2.

% Find out which ones are farther away than some threshold.

keepers = topLines > someLineNumber; % Whatever you want, for example 40.

% Extract out those into a new binary image.

newBinaryImage = ismember(binaryImage, find(keepers));

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!