Image Enhancement
The objective of image enhancement is to improve the quality of an image or make particular features appear more prominent. The techniques used are often more general-purpose techniques and a strong model of the degradation process is not assumed (unlike image restoration, which we will see in the next chapter). Some examples of image enhancement techniques are denoising/smoothing (using different classical image processing, unsupervised machine learning, and deep learning techniques), contrast improvement, and sharpening.
In this chapter, we will cover the following recipes for image enhancement (and their implementations using Python libraries):
- Applying filters to denoise different types of noise in an image
- Image denoising with a denoising autoencoder
- Image denoising with PCA/DFT/DWT
- Image denoising with anisotropic diffusion
- Improving image contrast with...
Applying filters to denoise different types of noise in an image
Noise represents random variations of image intensity that cause image quality to deteriorate. Noise can be introduced when the image is captured or transmitted. Image denoising (noise removal) is a vital image processing task that must be done for most of the image processing applications. In this recipe, we will discuss different types of noise with different distributions, such as Gaussian, Salt and Pepper, Speckle, Poisson, and exponential, and image denoising performed for different noise types with a couple of popular filtering techniques (mean and median filters), using the ndimage module from SciPy. The results will be compared for all types of noise.
Getting ready
Image denoising with a denoising autoencoder
An autoencoder is a neural network often used to learn an efficient representation of input data (typically in a reduced dimension) in an unsupervised way. A denoising autoencoder is a stochastic version of an autoencoder that takes (similar) inputs corrupted by noise and is trained to recover the original inputs (typically using some deep learning library functions) in order to obtain a good representation. We can use denoising autoencoders to learn robust representations from a set of similar input images (corrupted with noise) and then generate the denoised images.
Getting ready
We will be using the labeled faces in the wild (lfw) face dataset from scikit-learn (it contains face...
Image denoising with PCA/DFT/DWT
Principal component analysis (PCA), discrete Fourier transform (DFT), and discrete wavelet transform (DWT) are traditional machine learning techniques that can be used to denoise images as well. Each of these techniques will learn a representation (an approximation) of the image space and will retain mostly the information content in the images and remove the noise.
Getting ready
We will use the Olivetti faces dataset for this recipe. The dataset contains a total of 400 grayscale face images (each of size 64 x 64), 10 per each of the 40 objects. As usual, let's start by importing the required libraries:
import numpy as np
from numpy.random import RandomState
import matplotlib.pyplot as...
Image denoising with anisotropic diffusion
In this recipe, you will learn how to use the anisotropic (heat) diffusion equation to denoise an image preserving the edges by using a medpy library function. Isotropic diffusion, on the other hand, is identical to applying a Gaussian filter, which does not preserve the edges in an image, as we have already seen.
Getting ready
In this recipe, we will use the cameraman grayscale image. As usual, let's start by importing the required libraries:
from medpy.filter.smoothing import anisotropic_diffusion
from skimage.util import random_noise
from skimage.io import imread
from skimage import img_as_float
import matplotlib.pylab as plt
import numpyp as np
Improving image contrast with histogram equalization
In Chapter 1, Image Manipulation and Transformation, we saw how the contrast stretching operation can be used to increase the contrast of an image. However, it is just a linear scaling function that is applied to image pixel values, and hence the image enhancement is less drastic than its more sophisticated counterpart, histogram equalization. This recipe will show how to implement contrast stretching using the histogram equalization. It is also a point transform that uses a non-linear mapping that reassigns the pixel intensity values in the input image in such a way that the output image has a uniform distribution of intensities (a flat histogram), and thereby enhances the contrast of the image.
Getting ready
Implementing histogram matching
Histogram matching is an image processing task where an image is altered in such a way that its histogram matches the histogram of another reference (template) image's histogram. The algorithm is described as follows:
- Compute the cumulative histogram for each image.
- For any given pixel value, xi, in the input image, find the corresponding pixel value, xj, in the output image by matching the input image's histogram with the template image's histogram (G(xi)=H(xj), as shown in the following diagram.
- Replace pixel xi in the input with xj as shown in the following diagram:
In this recipe, we will implement histogram matching for colored images on our own.
Getting ready
As usual...
Performing gradient blending
The goal of Poisson image editing is to perform seamless (gradient) blending (cloning) of an object or a texture from a source image (captured by a mask image) with a target image. We want to create a photomontage by pasting an image region onto a new background using Poisson image editing. The idea is from the SIGGRAPH 2003 paper, Poisson Image Editing, by Perez et al., which shows that blending using the image gradients produces much more realistic results.
The gradient of the source and output images in the masked region will be the same after seamless cloning is done. Moreover, the intensity of the target image and the output image at the masked region boundary will be the same. The following diagram shows how a source image patch g is integrated seamlessly with a target image f* (over the region Ω), with a new image patch f (over the region...
Edge detection with Canny, LoG/zero-crossing, and wavelets
Edge detection is a preprocessing technique where the input is typically a two-dimensional (grayscale) image and the output is a set of curves (that are called the edges). The pixels that construct the edges in an image are the ones where there are sudden rapid changes (discontinuities) in the image intensity function, and the goal of edge detection is to identify these changes. Edges are typically detected by finding the local extrema of the first derivative (gradient) or by finding the zero-crossings of the second derivative (Laplacian) of the image. In this recipe, we will first implement two very popular edge detection techniques, namely, Canny and Marr-Hildreth (LoG with Zero crossings). Then, we will implement wavelet-based edge detection.