how can remove the object that has the maximum distance from center of image?
1 次查看(过去 30 天)
显示 更早的评论
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:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/145745/image.jpeg)
how can I obtain this image as result:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/145746/image.jpeg)
thanks
4 个评论
Guillaume
2014-10-17
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?
回答(6 个)
Matt J
2014-10-17
编辑:Matt J
2014-10-17
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 个评论
Matt J
2014-10-17
编辑:Matt J
2014-10-17
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 个评论
Matt J
2014-10-17
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
2014-10-17
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:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/176169/image.jpeg)
0 个评论
Image Analyst
2015-1-22
"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 个评论
rsnandi
2019-7-12
'hi image analyst..... 'how can I calculate the distance of each entroid from upper border line of image so that I can remove the nearest objects(centroids)) from the above image. thanks
Image Analyst
2019-7-13
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));
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!