Image Denoising with Better Edge Preservation
Sounds like you want to denoise and preserve edges. Have you considered nonlocal means? There's some GPL'd C++ code along with a brief writeup of the algorithm by the original authors here: http://www.ipol.im/pub/algo/bcm_non_local_means_denoising/

One caveat, nonlocal means is very slow and the output can be sensitive to the implementation you have. You may also consider ROF minimzation as it's fast and does a good job of preserving edges. Here's some matlab code that does it: http://www.stanford.edu/~tagoldst/Tom_Goldstein/Split_Bregman.html