GRADIENT-BASED DYNAMIC RANGE COMPRESSION

CONCLUSIONS



OBSERVATIONS

Overall, I was very pleased with the performance of the algorithm. The luminance range was well utilized throughout most of the image, and the execution time required was not overwhelming. My main complaint about the current implementation is the amount of parameter tweaking required for eye-pleasing results. Color, in particular, is hard to tune properly.

Those of you who will go on to read the original paper on this subject by Fattal, et. al might notice that they suggested using Neumann boundary conditions set to zero when solving the Poisson equation, rather than the Dirichlet conditions I use in the code. I originally attempted their suggestion, but for one reason or another I could not get the code for Neumann boundary conditions to work. What is worse, the vast majority of Poisson solvers on the web assume only Dirichlet boundary conditions so that it is difficult to even find a model for comparison, and explicitly stated algorithms for the Neumann case is rarely found in the literature. It was only after several days of frustrating work that I attempted Dirichlet conditions out of desperation, and found that they were much easier to implement than they previous case and performed just as well.

POSSIBLE FUTURE WORK

While the execution time is not exasperatingly long, a minute is still not an insignificant amount of time to wait for an algorithm to run its course. This implementation could benefit from a few changes to speed it up, such as replacing the Poisson solver it currently uses with a more efficient full multigrid algorithm solver. (What might make an even bigger difference would be to move the code off of MATLAB entirely and port it into C/C++.)

Also, if we could find some way to make the algorithm less dependant on hand-tweaking of the various algorithm parameters (alpha, lambda, and s), that would be a significant improvement over the current implementation.. In particular, it would be nice to find some way to specify a desired dynamic range for the output; my implementation does yet include features of this sort, so achieving a given dynamic range is largely a matter of trial and error.