Rectangle around the object, Bounding box,

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 Kommentare

sukku
sukku am 30 Mär. 2017
I want to find out an region properties of below image
Image Analyst
Image Analyst am 30 Mär. 2017
Use regionprops(). See my Image Segmentation Tutorial where I cover all that code.
Kimo Kalip
Kimo Kalip am 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 am 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.

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

Image Analyst
Image Analyst am 18 Sep. 2013

8 Stimmen

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 Kommentare

Felix
Felix am 19 Sep. 2013
It is good! thank you!
Rupali
Rupali am 12 Dez. 2013
thanks a lot
Explorer
Explorer am 19 Jan. 2014
Bearbeitet: Explorer am 19 Jan. 2014
INPUT IMAGE:
___________________________________________________________________________ MATLAB CODE: ___________________________________________________________________________ clear all; close all; clc image=imread('a_ASL3.jpg'); BW=binary_image(image); BW = ~BW; st = regionprops(BW, 'BoundingBox' ); for k = 1 : length(st) thisBB = st(k).BoundingBox; rectangle('Position', [thisBB(1),thisBB(2),thisBB(3),thisBB(4)],... 'EdgeColor','r','LineWidth',2 ) end ___________________________________________________________________________
OUTPUT IMAGE:
___________________________________________________________________________ Problem: I want bounding box just around hand so that I can crop it and do further operations but I am getting image as output in which there is bounding box around every object.
Image Analyst
Image Analyst am 19 Jan. 2014
Can you start your own thread so you'll get emails about updates instead of Felix?
Explorer
Explorer am 19 Jan. 2014
Sure
syhem samti
syhem samti am 19 Nov. 2015
does it work the same way as "vision.BlobAnalysis"? same results?
Torkan
Torkan am 16 Okt. 2019
Hi,
How can we define the length and width of these rectangles?
DANIEL SYAFIQ
DANIEL SYAFIQ am 4 Jan. 2023
THANK YOU SO MUCH IMAGE ANALYST.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (5)

Tiago Almeida
Tiago Almeida am 11 Okt. 2017
Bearbeitet: Image Analyst am 11 Okt. 2017

2 Stimmen

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 Kommentare

Instead of having variable widths and heights, like this thisBB(3),thisBB(4), replace that with some fixed widths and heights.
rectangle('Position', [thisBB(1),thisBB(2), fixedWidth, fixedHeight],...
'EdgeColor','r','LineWidth',2 )
how can we store/save the four values of bounding box for more than one images in a mat/text file calculated through following code
for k = 1 : length(measurements)
thisBB = measurements(k).BoundingBox;
rectangle('Position', [thisBB(1),thisBB(2),thisBB(3),thisBB(4)],...
'EdgeColor','r','LineWidth',2 )
end
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
Maham Khan
Maham Khan am 7 Mai 2018
Thanks @Image Analyst

Melden Sie sich an, um zu kommentieren.

Hafsa Asad
Hafsa Asad am 28 Jan. 2017
Bearbeitet: Hafsa Asad am 28 Jan. 2017

0 Stimmen

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 Kommentare

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 am 21 Sep. 2018
Image Analyst, you are right. thanks.

Melden Sie sich an, um zu kommentieren.

sidraa Aleem
sidraa Aleem am 4 Apr. 2018

0 Stimmen

@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 am 1 Dez. 2019
Bearbeitet: Image Analyst am 3 Apr. 2022

0 Stimmen

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 Kommentar

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;

Melden Sie sich an, um zu kommentieren.

Muhammad Zulkifli
Muhammad Zulkifli am 14 Mai 2023

0 Stimmen

How can i get bounding box ?

1 Kommentar

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)

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

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

Start Hunting!

Translated by