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

10 views (last 30 days)
sara on 17 Oct 2014
Moved: DGM on 12 Feb 2023
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
sara on 17 Oct 2014
Edited: sara on 17 Oct 2014
the distance from the closest point of the object to the centre? I mean this.
remove the object that the closest point of the object to center is maximum...

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.
Walter Roberson on 15 Jul 2015
sara commented "it is good for ELCAP dataset"

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);
idx=L>0;
[~,idx]=max(Lmin);
Image(L==idx)=0;
Matt J on 17 Oct 2014
The error message would have given you the line number of the error. You should be able to use whos() or the workspace browser to inspect the variables used in that line and see which are integers, which are doubles, etc...

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: sara on 19 Oct 2014
Thanks ImageAnalyst and Matt
I think if I remove the top object from my binaryImage maybe my problem solve faster.Dear Matt you said it is easy but I could not write the code for this...so I post this question...when I find the best answer I will come back to this discussion...
Dear ImageAnalyst sometimes the left lung is like a seprated shape and seems to 2 seprate object so all the time biggestblob dose not work... thanks for all of your guidance
sara on 22 Jan 2015
Edited: sara on 22 Jan 2015
dear image analyst
if we have some objects in an image is there any way to extract 2 objects that are neaerest to each other?? for example after that I want to have this result: Is there any way?? thanks

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.
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));

sara on 26 Jan 2015
Edited: sara on 26 Jan 2015

thanks ImageAnalyst

I use this code:

```    if true
I =input('enter an image','s');
Ibw = im2bw(I);
Ibw = imfill(Ibw,'holes');
Ilabel = logical(Ibw);
stat = regionprops(Ilabel,'centroid');
imshow(I); hold on;
for x = 1: numel(stat)
plot(stat(x).Centroid(1),stat(x).Centroid(2),'ro');
end```

for b1 = 1 : numel(stat)

```for b2 = b1 : numel(stat)
```
```distances(b1,b2) = sqrt((stat(b1).Centroid(1)-stat(b2).Centroid(1))^2+(stat(b1).Centroid(2)-stat(b2).Centroid(2))^2)
```
```   end
end```

tmp = distances; tmp(tmp == 0) = Inf; % as above

[colminvals, colminrows] = min(tmp); % find min in each column

[minVal, minCol] = min(colminvals) % find overall min and its column

` [blob1, blob2] = find(distances == minVal)`

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

figure,imshow(binaryImage);

`    end`

but I could not get the answer...and result is like input can you help me??

sara on 26 Jan 2015
my result like these and our endless result is it is like our input without any changes