Function Repository Resource:

FindImageBoundingBoxes

Source Notebook

Calculate the bounding rectangles of elements in a binary image

Contributed by: Pedro Cabral (Wolfram Research)

ResourceFunction["FindImageBoundingBoxes"][img]

returns a list containing the bounding rectangles of the elements of the binary image img.

Details and Options

ResourceFunction["FindImageBoundingBoxes"] is a low-level version of ImageBoundingBoxes. Instead of finding and bounding entities or objects using artificial intelligence, ResourceFunction["FindImageBoundingBoxes"] searches for different morphological components in a binary image, independent of their type or shape.

Examples

Basic Examples (2) 

Find all of the bounding boxes of all the elements of an image:

In[1]:=
ResourceFunction["FindImageBoundingBoxes"][\!\(\*
GraphicsBox[
TagBox[RasterBox[CompressedData["
1:eJzt3c1OIkEUQOHSlUtfwbdw69ItxgeAiMQNJmBifHrUqAvtWwuBqrrknC+Z
SUwmTZ07/HQ3DV4tnmeP56WU7cXHX7P5681mM3+7u/z44X69fVqtlw+365fl
arm5Xnz+s3L2/ef/dr/ttY0Ttvtr9IL6muSzBhDkowYQ9nMGEOfj+zEDsB/d
X8vH90MGYD+7n/78Z7/96H768U+K/qHzHpw//j43Mj/Foy5LfpIBjLrdHI+B
ITc6fgCl/7NwlO8r7+hVdRPncwZgv/3g/lo+ZQD0fvr933770f30/V98f7bj
3/7g+WnOf40Dzy8Zzn+PR26XJEmSJEmSJEmSJKmF1m/FZ36vv/WlGLmv9Wh9
KU7ya31aX4qV/Fqv1pfiTbafawDT5R13fcH2Mw0gWt4x1xduP9EA4P3x8o63
vsr20wzAfvvB/bXlHWt91e0nGUDz5eXOx/fTH//2t15e7nx8f/tvwc6d3+Fb
wFPn9/gW+NT5PX4LQOr8Lr8FInF9aX/+9+dWmm36YF3/e5IOolN75gdCa8mf
CFtL/kLY2uSFljWAaT5qAFE+aQDw/jifMwD77Qf31/IpA6D30+//9tuP7qfv
/+L76ce/+PMf+PNf+POfhX7++8tB7eC59X2XKh34cwf8tQO+7wDfdwzyUQMI
+zkDiPPx/ZgB2I/ur+Xj+yEDgOfjH//220/Ox+//44//6Mf/+PM/+PN/+PO/
hX7+/wu5XZL2Rn7pYO88wPce4UcP8KPHIJ80gDAfNAB4fyUfMwD77Qf3V/Md
wOiV9QHPtx/e77vn7HzfPfejh/B8P3roRw/96GFJ+9WLkiRJkiRJkiRJkiRJ
kiRJkiRJkiRJkiRJkiRJJ+kdo4aFmg==
"], {{0, 192.}, {192., 0}}, {0, 255},
      
ColorFunction->GrayLevel,
ImageResolution->96],
BoxForm`ImageTag[
     "Byte", ColorSpace -> "Grayscale", Interleaving -> None],
Selectable->False],
DefaultBaseStyle->"ImageGraphics",
ImageSizeRaw->{192., 192.},
PlotRange->{{0, 192.}, {0, 192.}}]\)]
Out[1]=

Find all of the bounding boxes:

In[2]:=
ResourceFunction["FindImageBoundingBoxes"][\!\(\*
GraphicsBox[
TagBox[RasterBox[CompressedData["
1:eJztnE1uE0EQRg0rllyBW7BlyTaIAyTCRGyM5CAhTj8kUoBg9/90VVd3vScR
KR5r6nuV6XHPTON3d99vvr4+HA4Pbx5/3Nz+/HA+3/769Pbxl8+nh2/3p+OX
j6cfx/vj+f3d09sOr57/AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABAI9sfRgcZwvaS0WH02TbPDdiuGJ1IlWt9Vw0I6TtqQFjfTwOc+8f0vTQA
/zL/VRtT5r/uoVHkv/DYKPHPDo6JKfDPHR1T0+q/SgPy/rn2TE6r/yoNaNVf
xT93fDv1z2xeyD9z/2N9//T9Lwf+V46pbSv6/28Z37Kufxz8ffuvPv/L4lx/
8eu/Apzrr33/pwjn+ofLDoxOMwLf9gAAAAAAAAAAAPbwfcvO+S1b5/fsnT+z
cf7MLqQv7G+qxUF/yXS2DrGwvlw6a0Ms4i8Vz9opJqYvFE/tFFOKrr/SGaYC
VX+NAVYJ/nr+CgOsGvzx9+yvOf+ZyV++lESFFvBX0jfqL71mNzLA7PiLrtmN
2VvyF/zOhri+JX+x67KEvin/f0kl9mnEX7tyWl/bX712Rl/Xf0BxS/4Dquf0
Nf1HlDfkP6Q+/lb8xwTA37q/bAL88ccff6f+WX38tRiRIK+/tH+0oCV//ZKD
1r8k/SUSxTtuyD+0SbTgMP/4/Y/wqyL1RvrH7n/F2tK/3PPO+7e6MVE8pkQ1
sUKNkVIpuxez4R94/CGXy6R/aUjBXU/h3yGYd/+iBnQoI5NRct9O/E1d/9VG
FN25E//g1NKTf/DSwpS/9H2BwE5d+Qf+r5Mt/wHPhfG35D9gXYh5f72S0pVK
UNd/UVOhVB59/b9FdWrlGKBvDN/2APV4HjNDPjLMoD9jMkVgxuipASF99/5+
GhDW30LbB6aUI+2//lGR9HcwLBL+yXGxChH/KKPz9gb/KRvQLc6U/j0DTdiA
roHm8++caDb/3pEm8+8faX7/dKbsu2byr85U9L7Z/YvFavc7t391evP6VSs8
GvKv5N+S37r+fv/Czwqj+hX+TQrW9aX90w2QUapioL+MUCXS/tJrSHcj7W/9
gUhxvOa/o2H5J8T9yyfNYyh0ave3voKqTGmHv/XVIEVGe/TNUyK0sn8JzvWH
rIW2hXN9D+sXMjjXP1j/JAdYA89DzPcphg8Yz/7OJxjeJ1jO/bm+mMZfIuQ8
15eRmDuzT+Mfzrk7/Sz+WzBo+NUd++0buh+XooGvbmnLP6v/FnyxXmAO/7Co
a//Lb65qNMDft/8c8z81/98KvjSw
"], {{0, 192.}, {192., 0}}, {0, 255},
ColorFunction->GrayLevel,
ImageResolution->96],
BoxForm`ImageTag[
     "Byte", ColorSpace -> "Grayscale", Interleaving -> None],
Selectable->False],
DefaultBaseStyle->"ImageGraphics",
ImageSizeRaw->{192., 192.},
PlotRange->{{0, 192.}, {0, 192.}}]\)]
Out[2]=

Highlight them with a RandomColor:

In[3]:=
HighlightImage[\!\(\*
GraphicsBox[
TagBox[RasterBox[CompressedData["
1:eJztnE1uE0EQRg0rllyBW7BlyTaIAyTCRGyM5CAhTj8kUoBg9/90VVd3vScR
KR5r6nuV6XHPTON3d99vvr4+HA4Pbx5/3Nz+/HA+3/769Pbxl8+nh2/3p+OX
j6cfx/vj+f3d09sOr57/AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABAI9sfRgcZwvaS0WH02TbPDdiuGJ1IlWt9Vw0I6TtqQFjfTwOc+8f0vTQA
/zL/VRtT5r/uoVHkv/DYKPHPDo6JKfDPHR1T0+q/SgPy/rn2TE6r/yoNaNVf
xT93fDv1z2xeyD9z/2N9//T9Lwf+V46pbSv6/28Z37Kufxz8ffuvPv/L4lx/
8eu/Apzrr33/pwjn+ofLDoxOMwLf9gAAAAAAAAAAAPbwfcvO+S1b5/fsnT+z
cf7MLqQv7G+qxUF/yXS2DrGwvlw6a0Ms4i8Vz9opJqYvFE/tFFOKrr/SGaYC
VX+NAVYJ/nr+CgOsGvzx9+yvOf+ZyV++lESFFvBX0jfqL71mNzLA7PiLrtmN
2VvyF/zOhri+JX+x67KEvin/f0kl9mnEX7tyWl/bX712Rl/Xf0BxS/4Dquf0
Nf1HlDfkP6Q+/lb8xwTA37q/bAL88ccff6f+WX38tRiRIK+/tH+0oCV//ZKD
1r8k/SUSxTtuyD+0SbTgMP/4/Y/wqyL1RvrH7n/F2tK/3PPO+7e6MVE8pkQ1
sUKNkVIpuxez4R94/CGXy6R/aUjBXU/h3yGYd/+iBnQoI5NRct9O/E1d/9VG
FN25E//g1NKTf/DSwpS/9H2BwE5d+Qf+r5Mt/wHPhfG35D9gXYh5f72S0pVK
UNd/UVOhVB59/b9FdWrlGKBvDN/2APV4HjNDPjLMoD9jMkVgxuipASF99/5+
GhDW30LbB6aUI+2//lGR9HcwLBL+yXGxChH/KKPz9gb/KRvQLc6U/j0DTdiA
roHm8++caDb/3pEm8+8faX7/dKbsu2byr85U9L7Z/YvFavc7t391evP6VSs8
GvKv5N+S37r+fv/Czwqj+hX+TQrW9aX90w2QUapioL+MUCXS/tJrSHcj7W/9
gUhxvOa/o2H5J8T9yyfNYyh0ave3voKqTGmHv/XVIEVGe/TNUyK0sn8JzvWH
rIW2hXN9D+sXMjjXP1j/JAdYA89DzPcphg8Yz/7OJxjeJ1jO/bm+mMZfIuQ8
15eRmDuzT+Mfzrk7/Sz+WzBo+NUd++0buh+XooGvbmnLP6v/FnyxXmAO/7Co
a//Lb65qNMDft/8c8z81/98KvjSw
"], {{0, 192.}, {192., 0}}, {0, 255},
ColorFunction->GrayLevel,
ImageResolution->96],
BoxForm`ImageTag[
     "Byte", ColorSpace -> "Grayscale", Interleaving -> None],
Selectable->False],
DefaultBaseStyle->"ImageGraphics",
ImageSizeRaw->{192., 192.},
PlotRange->{{0, 192.}, {0, 192.}}]\), Riffle[Table[RandomColor[], Length[%]], %]]
Out[3]=

Possible Issues (2) 

FindBoundingBoxes does not work with matrices or lists:

In[4]:=
ResourceFunction["FindImageBoundingBoxes"][\!\(\*
TagBox[
RowBox[{"(", "", GridBox[{
{"1", "0", "0", "0"},
{"0", "1", "0", "0"},
{"0", "0", "1", "0"},
{"0", "0", "0", "1"}
},
GridBoxAlignment->{"Columns" -> {{Center}}, "Rows" -> {{Baseline}}},
GridBoxSpacings->{"Columns" -> {
Offset[
          0.27999999999999997`], {
Offset[0.7]}, 
Offset[0.27999999999999997`]}, "Rows" -> {
Offset[0.2], {
Offset[0.4]}, 
Offset[0.2]}}], "", ")"}],
Function[BoxForm`e$, 
MatrixForm[BoxForm`e$]]]\)]
Out[4]=

FindBoundingBoxes only works for grayscale images:

In[5]:=
(* Evaluate this cell to get the example input *) CloudGet["https://www.wolframcloud.com/obj/4c2e8e1b-981f-4462-98de-6122de4ca6d6"]
Out[5]=

Publisher

Pedro Cabral

Version History

  • 1.0.0 – 13 October 2020

Related Resources

License Information