Extract partitions of images after edge detection
MorphologicalComponents
seems like a promising way to go, like High Performance Mark says. So let's try it:
img = Import["https://i.stack.imgur.com/e4dN6.jpg"];
MorphologicalComponents[img] // Colorize
We see here that there are more non-zero pixels (foreground pixels) than the original image lets on from looking at it. This causes MorphologicalComponents
to find spurious components and to merge some components (like the two E characters.) Since those pixels are dark, we can guess that we can remove them using Binarize
:
components = MorphologicalComponents[Binarize[img]];
components // Colorize
This is better, but now there is another problem: there are smaller components inside some of the components, like sixes. We can remove these by first using Dilation
to make sure that the border of the outer component is closed and then using SelectComponents
to remove all components that are enclosed by some other component.
components = MorphologicalComponents[Dilation[Binarize[img], 1]];
components = SelectComponents[components, #EnclosingComponentCount == 0 &];
components // Colorize
Now it looks like we found the right components. ComponentMeasurements
can now be used to find the bounding boxes of the components and ImageTrim
can be used to extract them from the image:
ComponentMeasurements[{img, components}, "Image"][[All, 2]]
img = Import["https://i.stack.imgur.com/e4dN6.jpg"];
Binarize // MorphologicalTransform // ComponentMeasurements // ImageTrim
boxes = MorphologicalTransform[Binarize@img, "BoundingBoxes", ∞]
trim = ComponentMeasurements[boxes, "BoundingBox"][[All, -1]];
ImageTrim[img, trim]
Combining all steps in a function:
imgPartition = ImageTrim[#,
ComponentMeasurements[
MorphologicalTransform[Binarize @ #, "BoundingBoxes", ∞],
"BoundingBox"][[All, -1]]] &;
imgPartition @ img
same picture