What can be done is something called "Histogram specification".
In Histogram Equalization, we are trying to produce an image with a flat histogram, this means, that all the intensities have the same probability, and so, the accumulative probability function should look like a diagonal line (as the identity curve, in the CurvesTransform. To specify an histogram we "perform" 2 histogram equalizations. First, from the histogram of the image, is is calculated the curve that will turn the histogram flat. Additionally, from the specified histogram (let's suppose that you want to achieve a gaussian function, centered, to achieve lower contrast) you calculate the curve that should equalize that. This second curve is inverted (axes are transposed) and you just apply both curves (the first equalization and the inverted second one).
From there, to a local histogram tool just to defines sliding windows and a clamping parameter to avoid large changes. If someone is up to this task, I may provide help. I would first try the algorithm with a global adjustment (and start modifying the HistogramEqualization tool that I wrote) and then translate that into the LocalHistogramEqualization tool.
On a side note, you may try wavelets to reduce contrast.