Rectangle around the object, Bounding box,

95 views (last 30 days)
Hello, I used this code to make rectangle around the object at binary image:
st = regionprops(BW, 'BoundingBox' );
figure, imshow('MY_IMAGE.jpg')
rectangle('Position',[st.BoundingBox(1),st.BoundingBox(2),st.BoundingBox(3),st.BoundingBox(4)],...
'EdgeColor','r','LineWidth',2 )
but if I have more than one object, this code doesn't working How can I draw N rectangles for N objects on image? Thank you
  4 Comments
Kimo Kalip
Kimo Kalip on 2 Jul 2018
The image segmentation strategy included in that tutorial works great for well defined, solid images on a relatively consistent background. However, what do you do when you're trying to work with objects that aren't perfectly defined or shaped? Like what if you had something with various holes like a slinky or spring?
Image Analyst
Image Analyst on 2 Jul 2018
Well that's where the art of designing an image analysis algorithm comes in. You're right - it's not so straightforward and easy. That's what keeps people like me employed.

Sign in to comment.

Accepted Answer

Image Analyst
Image Analyst on 18 Sep 2013
Put it in a loop (untested)
for k = 1 : length(st)
thisBB = st(k).BoundingBox;
rectangle('Position', [thisBB(1),thisBB(2),thisBB(3),thisBB(4)],...
'EdgeColor','r','LineWidth',2 )
end
  9 Comments
Torkan
Torkan on 16 Oct 2019
Hi,
How can we define the length and width of these rectangles?

Sign in to comment.

More Answers (5)

Tiago Almeida
Tiago Almeida on 11 Oct 2017
Edited: Image Analyst on 11 Oct 2017
How can i draw the rectangles with the same size using this code?
labeledImage = bwlabel(A);
measurements = regionprops(labeledImage, 'BoundingBox', 'Area');
for k = 1 : length(measurements)
thisBB = measurements(k).BoundingBox;
rectangle('Position', [thisBB(1),thisBB(2),thisBB(3),thisBB(4)],...
'EdgeColor','r','LineWidth',2 )
end
  4 Comments
Image Analyst
Image Analyst on 4 May 2018
Try this:
allBB = zeros(length(measurements), 4);
for k = 1 : length(measurements)
thisBB = measurements(k).BoundingBox;
rectangle('Position', [thisBB(1),thisBB(2),thisBB(3),thisBB(4)],...
'EdgeColor', 'r', 'LineWidth', 2)
allBB(k, :) = thisBB;
end

Sign in to comment.


Hafsa Asad
Hafsa Asad on 28 Jan 2017
Edited: Hafsa Asad on 28 Jan 2017
Here is an even simpler way to do it if you have the binary image with white blobs
st = regionprops(my_binary_image, 'BoundingBox', 'Area' );
for ii= 1 : length(st)
Areai(ii)= st(ii).Area;
end
largest_blob_id= find(Areai==max(Areai));
imshow(my_binary_image)
rectangle('Position'[st(largest_blob_id).BoundingBox(1),st(largest_blob_id).BoundingBox(2),st(largest_blob_id).BoundingBox(3),st(largest_blob_id).BoundingBox(4)], 'EdgeColor','r','LineWidth',2 )
  2 Comments
Image Analyst
Image Analyst on 28 Jan 2017
That would be good if he wanted to draw the box around only the largest blob instead of drawing "N rectangles for N objects". An even shorter way would be to get rid of the for loop like this:
st = regionprops(my_binary_image, 'BoundingBox', 'Area' );
[maxArea, indexOfMax] = max([st.Area]);
rectangle('Position'[st(indexOfMax).BoundingBox(1),st(indexOfMax).BoundingBox(2),st(indexOfMax).BoundingBox(3),st(indexOfMax).BoundingBox(4)], 'EdgeColor','r','LineWidth',2 )
Hafsa Asad
Hafsa Asad on 21 Sep 2018
Image Analyst, you are right. thanks.

Sign in to comment.


sidraa Aleem
sidraa Aleem on 4 Apr 2018
@Image Analyst I am trying to use the following code to do exactly what Felix wanted,but I am having error.
for k = 1 : length(st)
thisBB = st(k).BoundingBox;
rectangle('Position', [thisBB(1),thisBB(2),thisBB(3),thisBB(4)],...
'EdgeColor','r','LineWidth',2 )
end
Error using rectangle Value not a numeric scalar Please help me to resolve it.

Masar Uthaib
Masar Uthaib on 1 Dec 2019
Edited: Image Analyst on 3 Apr 2022
Hello
rectangle('Position',[st.BoundingBox(1),st.BoundingBox(2),st.BoundingBox(3),st.BoundingBox(4)],...
'EdgeColor','r','LineWidth',2 )
does not operate with me. Can anyone clarify to me what is wrong?
  1 Comment
Image Analyst
Image Analyst on 3 Apr 2022
No one, except you, did that. This should work if you have a single blob:
rectangle('Position', st.BoundingBox, 'EdgeColor','r','LineWidth',2 )
If you have multiple blobs, try this:
measurements = regionprops(mask, 'BoundingBox');
allBB = vertcat(props.BoundingBox);
hold on;
for k = 1 : length(measurements)
thisBB = measurements(k).BoundingBox; % Or allBB(k, :)
rectangle('Position', thisBB, 'EdgeColor', 'r', 'LineWidth', 2);
end
hold off;

Sign in to comment.


Muhammad Zulkifli
Muhammad Zulkifli on 14 May 2023
How can i get bounding box ?
  1 Comment
Image Analyst
Image Analyst on 14 May 2023
It has been explained about how to use regionprops to get the bounding box of blobs in your binary image. In short:
props = regionprops(binaryImage, 'BoundingBox');
allBoundingBoxes = vertcat(props.BoundingBox)

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!