Uniform LBP with scikit-image local_binary_pattern function

mavillan picture mavillan · Aug 19, 2015 · Viewed 9.8k times · Source

I'm using the local_binary_pattern from skimage.feature with uniform mode like this:

>>> from skimage.feature import local_binary_pattern
>>> lbp_image=local_binary_pattern(some_grayscale_image,8,2,method='uniform')
>>> histogram=scipy.stats.itemfreq(lbp_image)
>>> print histogram
[[  0.00000000e+00   1.57210000e+04]
 [  1.00000000e+00   1.86520000e+04]
 [  2.00000000e+00   2.38530000e+04]
 [  3.00000000e+00   3.23200000e+04]
 [  4.00000000e+00   3.93960000e+04]
 [  5.00000000e+00   3.13570000e+04]
 [  6.00000000e+00   2.19800000e+04]
 [  7.00000000e+00   2.46530000e+04]
 [  8.00000000e+00   2.76230000e+04]
 [  9.00000000e+00   4.88030000e+04]]

As I'm taking 8 pixels in the neighborhood, it's expected to obtain 59 different LBP codes (because the uniform method), but instead it gives me only 9 different LBP codes. More generally, always return P+1 labels (where P is the number of neighbors).

It's another kind of uniform method, or I'm misunderstanding something?

Answer

Tony S Yu picture Tony S Yu · Aug 20, 2015

Good question. Take a look at the LBP example in the gallery. Specifically, look at the following image:

LBP patterns

  • Uniformity: Since you chose 'uniform', the result only includes patterns where all black dots are adjacent and all white dots are adjacent. All other combinations are labeled 'non-uniform'.
  • Rotation invariance: Note that you chose 'uniform', not 'nri_uniform' (see the API docs), where "nri" means non-rotation invariant. That means 'uniform' is rotation invariant. As a result, an edge that is represented as 00001111 (0s and 1s represent black and white dots in the pic above) is collected into the same bin as 00111100 (the 0s are adjacent because we wrap around from front to back).
  • Rotation-invariant, uniform combinations: Considering rotation invariance, there are 9 unique, uniform combinations:
    • 00000000
    • 00000001
    • 00000011
    • 00000111
    • 00001111
    • 00011111
    • 00111111
    • 01111111
    • 11111111
  • Non-uniform results: If you look at your result more closely, there are actually 10 bins, not 9. The 10th bin lumps together all non-uniform results.

Hope that helps! If you haven't already, the LBP example is worth a look. I hear that somebody spent a lot of time on it ;)