In reply to planetmarshall:
Since we can get technical...
I use the global part of that quite heavily. Didn't like the local results much though - I implemented it but never use it.
Most of the time I take a local adaptation image and just enhance in log space then pass to a global operator. It gives better results and ensures no negative numbers no matter what the <s>untrained monkey</s> user types in.
Separable filters are very fast, but I really prefer the results of a bilateral filter. You have fewer hoops to jump through to keep halos down, but the downside is that they are relatively slow. Not tried trilateral yet but my bilateral is now fast enough that I probably could probably build a sensible one if I wanted.
The system I eventually put together lets you define a directed graph of image processors that work on various channels. Nearly all of them work in CIE xyY.
The graph is fed in, modules loaded and it runs a topological sort to decide run order. Typical process is something like:
1. Pull out Y (luminance) channel.
2. perform some blur (bilateral, separable filters, segmentation etc.)
3. pass to contrast enhancement (with or without halo removal)
4. pass results to global tone mapper
I can set it up however I want of course but that's how I run it for most of my pics.
Not really updated it for a while. I do add things from time to time though. There's likely to be a few CUDA modules coming soon to replace the slow bits like bilateral & halo reduction.
Need to get some free time though.
Of course it goes without saying that you have to be a bit weird to write a command line & script based image processing tool. Never quite got around to doing a proper UI