I got something similar to what i wanted using a modified cellular automata cave generation algorithm from http://www.roguebasin.com/index.php?title=Cellular_Automata_Method_for_Generating_Random_Cave-Like_Levels which is similar to @Alberth 's idea
except i tweaked the settings so that:
-chance of spawning a seed is 20%
-the minimum requirement for filling a tile is that if only 1 tile around it isn't empy space instead of 4+ in the article
-instead of storing the field as booleans, i have them stored as ints, and each distinct int represents a different biome
-on 'growth' cycles, my algorithm finds the most common biome int around the target cell, and if it becomes a non empty space it'll become whatever most common biome around it.
-rather large iteration count of 25 so that i dont have as many empty spaces
on a small scale this seems to work fine, which is all i need for the game i'm making. I generated an image with random colour values for biomes:
i dont seem to get any empty spaces due to the small size and large iteration count. I guess if i got any i could just flood fill them with some random default biome or surrender to a nearby biome type
I think i might want to have an extra 'polish' iteration to remove single block biomes as i sometimes do in the image but that should be easy.
I can imagine this might not be the best algorithm though for anything much larger cause i guess the iteration count would need to be bigger to fill up more space with biomes, which would be incredibly slow.