While the ViSP library is not intended to be an image processing library or replace a raster graphics editor, some easy image processing techniques can be used to improve the contrast and the sharpness of an image.
histogram stretching in the HSV color space, see the corresponding Gimp documentation.
histogram equalization, see the corresponding Wikipedia entry.
contrast limited adaptive histogram equalization (CLAHE), see the corresponding Wikipedia entry.
unsharp masking, an image sharpening technique, see the corresponding Wikipedia entry.
The first two methods consist of stretching the histogram of an image to make it use the entire range of values. It is more or less similar to the histogram equalization technique (presented in Histogram equalization). The stretching will act like a direct mapping between the old and new intensity values whereas the histogram equalization will linearize the cumulative histogram distribution to try to make each intensity values the same weighting in the image. The CLAHE algorithm will limit the contrast enhancement using a maximum slope value to avoid to amplify too much the image noise. It will also compute the cumulative histogram locally by sliding a window around the current pixel location.
Example code
The following example also available in tutorial-contrast-sharpening.cpp will show the result of each of these methods on a low contrast image.
The low contrast color image used in this tutorial can be downloaded here (By Biem (Own work) [Public domain], via Wikimedia Commons):
Input low contrast color image
The figure below represents the histogram and the cumulative histogram of the low contrast image. Most of the histogram bins are approximately in the [80 - 140] range, resulting in an image with low dynamic.
Histogram and cumulative histogram of the input image
The corresponding histogram and cumulative histogram are the following:
Histogram and cumulative histogram of the stretched histogram image
This method stretches the histogram with a direct mapping between the old and the new intensity values. The histogram bins are more spread out and the image gains some dynamic. It will not change the intensity distribution as the histogram equalization method could do.
The histogram stretching on HSV colorspace can be done with:
The main difference is that this method will stretch the Saturation and Value components and preserve the Hue channel.
From the Gimp documentation:
it works in HSV color space, rather than RGB color space, and it preserves the Hue. Thus, it independently stretches the ranges of the Hue, Saturation and Value components of the colors. Occasionally the results are good, often they are a bit odd.
Histogram and cumulative histogram of the stretched histogram image in HSV colorspace
The histogram and cumulative histogram are similar to the previous method as expected.
To improve the image contrast using the histogram equalization method:
the block radius: the size (2*blockRadius+1) of the neighborhood to consider around the current pixel location
the number of bins for the histogram computation
the maximum slope to limit the contrast enhancement
The histogram of the corrected image is stretched and the local processing plus the limitation of the contrast enhancement avoid the over boosting of the contrast as in the histogram equalization case.
Histogram and cumulative histogram after using the CLAHE method
The unsharp masking will sharpen the edges in an image:
It is applied here on the image after using the CLAHE algorithm:
Unsharp masking (weight=0.5, Gaussian blur size=11) on the processed image after CLAHE
Two parameters can be modified:
the size of the Gaussian kernel, see vpImageFilter::gaussianBlur(const vpImage<double> &, vpImage<double> &, unsigned int, double, bool)
the unsharp masking weighting:
To summarize, the techniques presented to improve the contrast of an image can do a good job in some situations and not in another. The CLAHE algorithm and the unsharp masking can be tuned (but the default values should be good enough in most of the situation).