Filter centroids to find only those of interest in binary image

1 Ansicht (letzte 30 Tage)
I have defined the following centroids within a region of interest (blue rectangle) for my binary image. How can I remove or centroids within the red boxed region?

Akzeptierte Antwort

Image Analyst
Image Analyst am 18 Feb. 2021
If you know the rows and columns outlining your box you can erase the image inside that box before computing the centroids
mask(row1:row2, col1:col2) = false;
props = regionprops(mask, 'Centroid');
Or you can keep the mask as-is, and just remove the measurements from the output of regionprops():
xy = vertcat(props.Centroid);
xCentroids = xy(:, 1);
yCentroids = xy(:, 2);
badIndexes = xCentroids >= col1 & xCentroids <= col2 & yCentroids >= row1 & yCentroids <= row2;
% Delete the bad ones.
prop(badIndexes) = [];
  2 Kommentare
Lauren
Lauren am 18 Feb. 2021
Thank you for the help! I was able to make a few changes to your code to fit my purposes. This is what I ended up using:
xCentroids = CentroidsInsideROI(:, 1);
yCentroids = CentroidsInsideROI(:, 2);
badIndexes = yCentroids >= 300 & yCentroids <= 600 ;
for c = 1:length(badIndexes)
if badIndexes(c) == 0
idx = c;
Centroids = CentroidsInsideROI(idx,:);
plot(Centroids(:,1),Centroids(:,2),'m*')
end
end
and this was my final result!
Image Analyst
Image Analyst am 19 Feb. 2021
Instead of that for loop, you could have just inverted the badIndexes and used that as a logical index to the centroids to plot only those good locations:
xCentroids = CentroidsInsideROI(:, 1);
yCentroids = CentroidsInsideROI(:, 2);
badIndexes = yCentroids >= 300 & yCentroids <= 600 ;
plot(xCentroids(~badIndexes), yCentroids(~badIndexes), 'm*')

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Lauren
Lauren am 18 Feb. 2021
I'm not sure the mask is working correctly. I used the following and it shows props as empty and mask as all zero values.
mask(800:1145, 300:600) = false;
props = regionprops(mask, 'Centroid');
xy = vertcat(props.Centroid);
xCentroids = xy(:, 1);
yCentroids = xy(:, 2);
badIndexes = xCentroids >= 300 & xCentroids <= 600 & yCentroids >= 800 & yCentroids <= 1145;
% Delete the bad ones.
prop(badIndexes) = [];
I think overlaying the mask and deleting the bad indices is the way I would prefer to do it.

Community Treasure Hunt

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

Start Hunting!

Translated by