remove pixel and height that doesnt meet certain criteria

hi sir, in my color detection, I used ismember to set object between pixel 100 and 500. Its worked. however, can I know from the bounding box of object detection, how to remove bounding of blobs that doesnt meet height and width criteria ,say width and height of 100x100 pixels?

 Réponse acceptée

Image Analyst
Image Analyst le 6 Nov 2012
Modifié(e) : Image Analyst le 6 Nov 2012
Sure, you just get all the bounding boxes
allBB = [blobMeasurements.BoundingBox];
Then extract every 4th one for the widths and heights.
allWidths = allBB(3:4:end);
allHeights = allBB(4:4:end);
Then use ismember just like you did to filter based on area. You'd do something like this:
% Get a list of the blobs that meet our criteria and we need to keep.
allowableWidthIndexes = (allWidths > 150) & (allWidths < 220);
allowableHeightIndexes = allHeights < 2000; % Take the small objects.
keeperIndexes = find(allowableWidthIndexes & allowableHeightIndexes );
% Extract only those blobs that meet our criteria, and
% eliminate those blobs that don't meet our criteria.
% Note how we use ismember() to do this.
keeperBlobsImage = ismember(labeledImage, keeperIndexes);
You can then relabel keeperBlobsImage and call regionprops on keeperBlobsImage if you want to measure only the keeper blobs.

Plus de réponses (1)

minwidth = 100; maxwidth = 100; %as far as I can tell from your question
minheight = 100; maxheight = 100; %as far as I can tell from your question
rinfo = regionprops(YourLabeledImage, 'BoundingBox');
bb = [rinfo.BoundingBox];
bbmatches = bb(4) >= minheight & bb(4) <= maxheight & bb(3) >= minwidth & bb(3) >= maxwidth;
Now bbmatches would be a logical array and you can do things like
rinfo(bbmatches)
to select just the relevant boxes.

7 commentaires

thanks sir,it really helps!
Tulips
Tulips le 6 Nov 2012
Modifié(e) : Tulips le 6 Nov 2012
sir, how to use ismember for bbmactches?.I have already the bbmatches value. Now, I want bound at bbmatches value. Hv tried up but got error!pls advice.
bb = stats(object).BoundingBox;
bbmatches =find( bb(4) >= minheight & bb(4) <= maxheight & bb(3) >= minwidth & bb(3) <= maxwidth);
Iout = ismember(b,bbmatches);
I thought you had already seen my Image Segmentation tutorial where I went over that - you said you knew how to use ismember(). Well anyway, see my answer above.
yes, noted. however, how can put rectangle of bounding box on that object using ismember/keeperBlobsImage value?
Use the plot function, as shown in my BlobsDemo mentioned above. Run the demo and you'll see bounding boxes calculated. Then you just use rectangle(), or, what I prefer, plot() to plot the box. Display the image or switch to that axes, then do
hold on;
y = [row1 row1 row2 row2 row1];
x = [col1 col2 col2 col1 col1];
plot(x, y, 'r-');
where the row and column variables are your bounding box edges. Or something like
for k = 1 : numberOfBlobs % Loop through all blobs.
% Find the bounding box of this blob.
thisBlobsBoundingBox = blobMeasurements(k).BoundingBox;
% Plot it in the overlay.
rectangle('Position', thisBlobsBoundingBox);
end
I mean, using the ismember values to plot using rectangle.is that possible?
No. ismember() returns a labeled image, not bounding box coordinates. You'd need to either pick out selectively the bounding boxes that meet your criteria from your measurements (what regionprops returned the first time), or, probably easier, just relabel and call regionprops again. It's regionprops() that returns bounding box coordinates, not ismember().

Connectez-vous pour commenter.

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by