For this one example, a start might be to extract the different colour layers.
masks = (ColorReplace[#, {Red -> Black, _ -> White}, .2] &) /@ (ImageRecolor[
i, {# -> Red}] & /@ Rest[DominantColors[i]])
This gives us back two images:

and then we can use these as masks on the original image:
ImageAdd[#, i] & /@ masks

It may be possible to use ImageBoundingBoxes
or (more likely) another neural network based approach to separate the text and the boat - ImageBoundingBoxes
is apparently not trained on pictures of text.
(The "test text" example makes me think this is one of hundreds of images, and it seems unlikely that you will find a blanket solution for this class of problem that doesn't require a fair bit of hand-tweaking per image.)