A fully customizable DynamicModule version (using Andy's solution as foundation).
After a certain point into dynamic interactivity, you will realize that Manipulate is often not enough, because what you want to do, cannot be done in Manipulate. The below code shows a general method how to extend Manipulate for specific requirements. I use such DynamicModule constructs almost all the time (heck, I don't even know anymore how to use Manipulate!). It has various advantages over a simple Manipulate, most importantly: it is fully customizable, you can define complex controller-interdependencies, and you can easily update dynamically only those parts that are necessary to be updated, to improve response time.
DynamicModule[{
contrast, brightness, gamma, sharpen, gauss, size, image, temp,
original = ExampleData[{"TestImage", "Lena"}],
updateImageAdjust, updateSharpen, updateGaussianFilter, reset},
Panel@Grid[{
{Style["Image manipulation", FontFamily -> "Times", Italic, 18],
SpanFromLeft},
{Grid[{
{},
{Item[Button["Reset", reset[]], Alignment -> Left]},
{"contrast",
Slider[Dynamic[
contrast, {(contrast = #; updateImageAdjust[]) &,
image = temp}], {-1, 10}], Dynamic@contrast},
{"brightness",
Slider[Dynamic[
brightness, {(brightness = #; updateImageAdjust[]) &,
image = temp}], {-1, 10}], Dynamic@brightness},
{"gamma",
Slider[Dynamic[
gamma, {(gamma = #; updateImageAdjust[]) &,
image = temp}], {0.0001, 10}], Dynamic@gamma},
{"sharpen",
Slider[Dynamic[
sharpen, {(sharpen = #; updateSharpen[]) &,
image = temp}], {0, 15}], Dynamic@sharpen},
{"gaussian blur",
Slider[Dynamic[
gauss, {(gauss = #; updateGaussianFilter[]) &,
image = temp}], {0, 15}], Dynamic@gauss},
{"size", Slider[Dynamic@size, {50, 1000, 1}], Dynamic@size}
}, Alignment -> {{Right, Left, Left}, Center},
ItemSize -> {{Automatic, Automatic, 4}, Automatic}],
Panel@Dynamic@Show[temp, ImageSize -> size]
}}, Alignment -> {Left, Top}],
Initialization :> (
reset[] := (temp = image = original; contrast = 0; brightness = 0;
gamma = 1; sharpen = 0; gauss = 0; size = 250);
updateImageAdjust[] := (temp =
ImageAdjust[image, {contrast, brightness, gamma}]);
updateSharpen[] := (temp = Sharpen[image, sharpen]);
updateGaussianFilter[] := (temp = GaussianFilter[image, gauss]);
reset[];
)]
