EDIT: I found a version of the source image with fewer jpeg artifacts.
My idea would be to extract pixels along the border of the shadow, inside and outside of the shadow. Then I have a list of pairs of RGB values, and I can find a suitable transformation from "shadowed" pixels to "non-shadowed" pixels.
But first, I must find the shadow area. I would apply a mean shift filter to remove the texture:
im = Import["http://www.cs.sfu.ca/~mark/ftp/Eccv04/path.jpg"]
ms = ms = MeanShiftFilter[GaussianFilter[im, 2], 10, 0.1, MaxIterations -> 5]

I can simply binarize this with default thresholds:
bin = DeleteSmallComponents[ColorNegate[DeleteSmallComponents[Binarize[ms]]]]

Next step: Extract edges and normal directions:
edges = EdgeDetect[bin];
dx = GaussianFilter[ImageData[bin], 5, {0, 1}];
dy = GaussianFilter[ImageData[bin], 5, {1, 0}];
edgePixels = Position[ImageData[edges], 1];
normalDirection = Transpose[{Extract[dy, edgePixels], Extract[dx, edgePixels]}];
Now edgePixels
contains a list of edge pixel indices and normalDirection
contains a list of normal vectors for each of these edge pixels.
Next step: for each border pixel, go 40 pixels in the normal direction, and get the RGB value at that point. Go 40 pixels the other way, and pick up that RGB value, too:
pixels = ImageData[GaussianFilter[im, 5]];
colorsInsideShadow = Extract[pixels, Round[edgePixels + normalDirection*40]];
colorsOutsideShadow = Extract[pixels, Round[edgePixels - normalDirection*40]];
Just to illustrate, the colors picked up look like this:
ImageAssemble[{{Image[ConstantArray[colorsInsideShadow, 10]]}, {Image[ConstantArray[colorsOutsideShadow, 10]]}}]

I would simply try a linear model from colors "inside the shadow" to colors "outside the shadow":
rgbToModel[{r_, g_, b_}] := {1, r, g, b}
colorTransform = LeastSquares[rgbToModel/@colorsInsideShadow, colorsOutsideShadow]
Now I can apply this linear model to the shadow area:
applyColorTransform = ImageApply[rgbToModel[#].colorTransform &, im, Masking -> DeleteSmallComponents@ColorNegate[Binarize[ms]]]

As a last step, I'll use inpainting to remove the artifacts at the border of the shadow area:
result = Inpaint[applyColorTransform, Dilation[EdgeDetect[Binarize[ms]], DiskMatrix[1]]]

The whole algorithm is still quite ad-hoc (no camera calibration, I didn't even try to model the illumination invariants described in the linked papers), but considering it's simplicity (less than 15 lines of code), I'd say the result isn't that bad.
Inpaint
? $\endgroup$Inpaint[]
works well for retouching small selected areas of the image by replacing them with a "mean" of its surroundings. The way of taking the "mean" depends on theMethod
used. But I am not aware of how to use it for this specific problem $\endgroup$