It seemed to me "scratches" are prominent here and in restoration photography, because they are different from de-noising. There are usually just a few, as in his photo, so you do a few masks. Cracks are easier approached manually then trying to automate their detection, - they can be quite subtle and confused with other parts of the photo. Then developing code that "sees" them is as custom but more complex and time consuming than a good interface for a mask. De-noising is a different problem and I would ask a different question for it, but I think it was answered before on MSE. While I saw no cracks examples besides this one, there are many de-nosing examples, - just search the site or docs - for example this or this. Piling up many complex questions in one usually gets no answers. The method below works very well for few cracks.

I see that you are on the right track using Inpaint
, so you probably seen this video:
Image Processing: Real-World Applications
There is an example there that does exactly what you need. Notebook can be downloaded too. The thing that you are lacking is a good interface to build the mask. So here is the example.
Given this image:

let's import it:
lincoln = Import["http://i.stack.imgur.com/rr105.png"]
and find edges and dimensions:
dims = ImageDimensions[lincoln]
edges = EdgeDetect[lincoln]
{371, 432}

The code for the interface design in top animation (a little more detailed explanation in the video I linked):
Manipulate[
LCPP = ListCurvePathPlot[pts, PlotStyle -> Directive[Thickness[th]]];
Row[{Show[lincoln, LCPP, ImageSize -> dims,
PlotRange -> {{0, dims[[1]]}, {0, dims[[2]]}}],
Show[Inpaint[lincoln,
Dilation[
ImageMultiply[edges,
ColorNegate[
Binarize[
Show[LCPP, ImageSize -> dims,
PlotRange -> {{0, dims[[1]]}, {0, dims[[2]]}},
Axes -> False]]]], 1], Method -> method],
ImageSize -> 370]}], {{pts,
RandomReal[Min[ImageDimensions[lincoln]], {3, 2}]}, {0, 0},
ImageDimensions[lincoln], Locator,
Appearance -> Graphics[{Red, Disk[{0, 0}]}, ImageSize -> 7],
LocatorAutoCreate -> {2, 10}}, {{th, .004, "thickness"},
0, .1}, {{method, "Diffusion"}, {"Diffusion", "TotalVariation",
"FastMarching", "NavierStokes", "TextureSynthesis"}, Setter}]
ImageLines
or manually. 2) You need to define what the "optimum" sharpness is before you automate it. 3) TryMedianFilter
orTotalVariationFilter
. $\endgroup$ – dr.blochwave Mar 21 '16 at 20:17