Hughes,
This sketch uses Erosion
with a kernel that has the size of your small images:
pills = Binarize[i];
res = Erosion[pills, BoxMatrix[radii], Padding -> 0];
pos = PixelValuePositions[res, 1];
These positions pos
are the coordinates of the center of the small images. Once you have the positions, you need to iterate picking one randomly and removing all the leftover positions that correspond to overlapping small images.
After you have done that, you can extract the small images using ImageTrim
:
ImageTrim[image, {#}, radii] & /@ pos
