In GRASS-GIS version 7.0 (a FOSS package -- not only freeware), still the development version, though fully working and more or less for production-workflows ready, there is i.segment. More upon the module and its implemenation in a dedicated GRASS-Wiki page (along with some sample screenshots).
At its current state, the module does (as per the module's manual):
This segmentation algorithm sequentially examines all current segments in the raster map. The similarity between the current segment and each of its neighbors is calculated according to the given distance formula. Segments will be merged if they meet a number of criteria, including:
1. The pair is mutually most similar to each other (the similarity distance will be smaller than to any other neighbor),
2. The similarity must be lower than the input threshold. The process is repeated until no merges are made during a complete pass.