In your comments above you expressed interest in my suggested method, and so I am providing a more detailed answer here. The method uses the tools available in Whitebox GAT, the open-source GIS that I am lead developer of, but it is entirely possible that similar functions are available in QGIS and GRASS GIS such that you could use the same approach. I am also assuming that you're using SRTM DEM data, which has a good property for this application of having been processed such that large lakes have uniform elevation values. The first step is therefore to acquire the SRTM DEM of the area of interest. You can use Whitebox GAT's Retrieve SRTM DEM Data tool for this purpose, which will automatically import each of the titles for the area of interest, fill missing data gaps, and mosaic the tiles into a single DEM.

Now use the Create New Shapefile tool to digitize a seed point within each of the lakes of interest.


There is a tutorial in the Help menu that describes how to digitize features if that is needed. In the example above, I clearly only have a handful of large lakes, but if you have many lakes, this step may take a bit of time. You could also acquire the necessary seed points by extracting flat areas and then reducing each contiguous flat area to their center points and vectorizing these points; however, my worry is that in flatter terrain, the number of 'flat' points that aren't actually lakes may be quite high and you'll end up with spurious features. Also, remember that SRTM elevation data are stored as integer meters and so the number of grid cells that are apparently flat can be large even in moderately sloping terrain. If your lakes are relatively large and number in the 10s or 100s, then manual digitizing of the seed points is probably your best strategy. Smaller lakes probably haven't been corrected to possess uniform elevations in the SRTM data and so aren't able to be extracted using this approach.
Now use the Simple Region Grow tool with the seed points to delineate the full extent of each lake. I use '0' as the similarly threshold since the SRTM data has been corrected for uniform lake elevations.


Lastly, I tend to vectorize the lake polygons for overlay purposes using the Raster to Vector Polygons tool:

I've used this approach quite often and it is very robust although I would imagine that it would be time consuming if you have thousands of lakes. In that case, you'd probably need to use some automated method of finding the seed points (as described above).