There is possibility that you do not have scanner at the moment and you made a photo of a document with your camera. Here is a small program how you can improve the photo especially if there is nonuniform light and shadows. I found the key idea in the blog of
ABBY company (of course, they use much more advanced method).
initial =
ImageAdjust@
ColorConvert[
Import["http://habrastorage.org/files/76b/906/3d8/\
76b9063d8b9f44aebbb0411f7e51e46c.jpg"], "Grayscale"];
image = ColorNegate@WienerFilter[initial, denoising];
[url=]
We need to define five parameters:
denoising = 1;
enhancement = {4, 3};
smoothing = True;
scale = 30;
gamma = 3
The first three are not important, but the last two are used for local contrast adjustment:
idata1 = Developer`ToPackedArray@ImageData[initial];
idata2 = Developer`ToPackedArray@
ImageData[MeanFilter[initial, scale]];
idata2 = If[Min[idata2] > 0, idata2,
Module[{min = Union[Join @@ idata2][[2]]},
Map[Max[#, min] &, idata2, {2}]]];
The idea is to remove shadows by using local gamma-correction:
localContrast =
ColorNegate@WienerFilter[Image[(idata1/idata2)^gamma], denoising];
mask = If[smoothing, Erosion[Dilation[Binarize[localContrast], 2], 1],
Binarize[localContrast]];
Then one can use the mask to subtract background by inpainting:
background =
Inpaint[ImageMultiply[image, ColorNegate@mask], mask ,
Method -> "NavierStokes"];
backgroundSubtracted =
ImageSubtract[ImageMultiply[image, mask],
ImageMultiply[background, mask]];
result = ColorNegate@
ImageMultiply[
ImageMultiply[backgroundSubtracted, enhancement[[1]]],
ImageMultiply[localContrast, enhancement[[2]]]];
That is it.
Of course, you can delete large artefacts by hands.
largecomponents =
ImageMultiply[
GaussianFilter[
DeleteSmallComponents[Binarize[ColorNegate@result, 0.1], 3000],
10], 4];
ColorNegate@
ImageMultiply[ColorNegate@result, ColorNegate@largecomponents]