This sounds like a fun little challenge.
My thought was to simply scatter points within the image, duplicating across borders for tiling purposes, and to then generate circles based on distances to neighbours; or something to that effect, I believe.
That'd be my starting point - a random point distribution with random radii assigned to each, with adjustments you can tweak for point count and radius min/mix so you could tweak for the density and variance you want. I'd then do some kind of pairwise iteration of every point with every other point, pushing them apart if they overlap. This would have to be an iterative process, since pushing two circles apart might put them inside others they didn't previously overlap, and might need some edge case handling for cases that don't resolve after some number of iterations (like, say, reducing the radius of circles that aren't in a position where pushing them around can stop them from intersecting). To get it to stabilize, I'd weight each iteration so that it moves things around less than the last, and do the radius adjustment step just once to clean up any remaining intersections.
For tiling, it'd just be a matter of making the distance calculations wrap on the x and y axes, and sampling the image in the same way. Note that this doesn't involve duplication - a single point could generate pixels and outward force in all four corners if it was close to one. My suspicion is that the weakness of this approach would be that it would leave empty spaces without a great way to fill them, but it'd hard to know without seeing it in action.
If I find a moment, I might just have to write a little test program to try this out. I'll share it here if I get any good results.