mirror of
https://github.com/wassname/scikit-image.git
synced 2026-06-28 14:49:08 +08:00
106 lines
4.1 KiB
Python
106 lines
4.1 KiB
Python
r'''
|
|
===============================
|
|
Histogram of Oriented Gradients
|
|
===============================
|
|
|
|
The Histogram of Oriented Gradient (HOG) feature descriptor is popular
|
|
for object detection
|
|
<http://en.wikipedia.org/wiki/Histogram_of_oriented_gradients>`__.
|
|
|
|
In the following example, we compute the HOG descriptor and display
|
|
a visualisation.
|
|
|
|
Algorithm overview
|
|
------------------
|
|
|
|
Compute a Histogram of Oriented Gradients (HOG) by
|
|
1) (optional) global image normalisation
|
|
2) computing the gradient image in x and y
|
|
3) computing gradient histograms
|
|
3) normalising across blocks
|
|
4) flattening into a feature vector
|
|
|
|
The first stage applies an optional global image normalisation
|
|
equalisation that is designed to reduce the influence of illumination
|
|
effects. In practice we use gamma (power law) compression, either
|
|
computing the square root or the log of each colour channel.
|
|
Image texture strength is typically proportional to the local surface
|
|
illumination so this compression helps to reduce the effects of local
|
|
shadowing and illumination variations.
|
|
|
|
The second stage computes first order image gradients. These capture
|
|
contour, silhouette and some texture information, while providing
|
|
further resistance to illumination variations. The locally dominant
|
|
colour channel is used, which provides colour invariance to a large
|
|
extent. Variant methods may also include second order image derivatives,
|
|
which act as primitive bar detectors - a useful feature for capturing,
|
|
e.g. bar like structures in bicycles and limbs in humans.
|
|
|
|
The third stage aims to produce an encoding that is sensitive to
|
|
local image content while remaining resistant to small changes in
|
|
pose or appearance. The adopted method pools gradient orientation
|
|
information locally in the same way as the SIFT [Lowe 2004]
|
|
feature. The image window is divided into small spatial regions,
|
|
called "cells". For each cell we accumulate a local 1-D histogram
|
|
of gradient or edge orientations over all the pixels in the
|
|
cell. This combined cell-level 1-D histogram forms the basic
|
|
"orientation histogram" representation. Each orientation histogram
|
|
divides the gradient angle range into a fixed number of
|
|
predetermined bins. The gradient magnitudes of the pixels in the
|
|
cell are used to vote into the orientation histogram.
|
|
|
|
The fourth stage computes normalisation, which takes local groups of
|
|
cells and contrast normalises their overall responses before passing
|
|
to next stage. Normalisation introduces better invariance to illumination,
|
|
shadowing, and edge contrast. It is performed by accumulating a measure
|
|
of local histogram "energy" over local groups of cells that we call
|
|
"blocks". The result is used to normalise each cell in the block.
|
|
Typically each individual cell is shared between several blocks, but
|
|
its normalisations are block dependent and thus different. The cell
|
|
thus appears several times in the final output vector with different
|
|
normalisations. This may seem redundant but it improves the performance.
|
|
We refer to the normalised block descriptors as Histogram of Oriented
|
|
Gradient (HOG) descriptors.
|
|
|
|
The final step collects the HOG descriptors from all blocks of a dense
|
|
overlapping grid of blocks covering the detection window into a combined
|
|
feature vector for use in the window classifier.
|
|
|
|
References
|
|
----------
|
|
|
|
.. [1] Dalal, N and Triggs, B, Histograms of Oriented Gradients for
|
|
Human Detection, IEEE Computer Society Conference on Computer
|
|
Vision and Pattern Recognition 2005 San Diego, CA, USA
|
|
'''
|
|
|
|
from scikits.image.feature import hog
|
|
from scikits.image import data
|
|
from scikits.image.color import rgb2grey
|
|
|
|
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
|
|
|
|
# Construct test image
|
|
|
|
image = data.lena()
|
|
|
|
# HOG
|
|
|
|
grey = rgb2grey(image)
|
|
|
|
fd, hog_image = hog(grey, orientations=8, pixels_per_cell=(16, 16),
|
|
cells_per_block=(1, 1), visualise=True)
|
|
|
|
plt.figure(figsize=(12, 5))
|
|
|
|
plt.subplot(121)
|
|
plt.imshow(grey, cmap=plt.cm.gray)
|
|
plt.title('Input image')
|
|
|
|
plt.subplot(122)
|
|
plt.imshow(hog_image, cmap=plt.cm.gray)
|
|
plt.title('Histogram of Oriented Gradients')
|
|
plt.show()
|