I calculate the LBP via this exemplary code:
from skimage import feature
radius_lbp = 1
n_points_lbp = 8
temp = feature.local_binary_pattern(regions_arr_lbp[i,j,:], n_points_lbp, radius_lbp, method='uniform').ravel()
whereby regions_arr_lbp[i,j,:]
is a 64x64 numpy array with float64 values.
Now for clarification:
exam_pixel
= the pixel we calculate the LBP forneigh_pixel
= the neighborhood pixels of exam_pixel
As far as I understand the LBP, I look at the immediate neighborhood of exam_pixel
and compare its intensity with the intensities of its neigh_pixels. When using the method 'uniform'
, each neigh_pixel whose intensity is greater than exam_pixel
's is assigned a 1, and 0 otherwise. This would lead to a theoretical maximum encoded value of 8 for exam_pixel
if each pixel in neigh_pixel
has a higher intensity.
However, when I run the code above, I get a maximum encoded value of 9 in my temp
array multiple times. How is that possible? Have I misunderstood the LBP and how it works?
There are 9 different rotation-invariant uniform patterns for a neighbourhood of 8 pixels, namely:
00000000
00000001
00000011
00000111
00001111
00011111
00111111
01111111
11111111
For this descriptor to be rotation-invariant the patterns 00000001
, 00000010
, 00000100
, 00001000
, 00010000
, 00100000
, 01000000
and 10000000
are considered the same pattern. The same applies to patterns from 2 to 7.
All the non-uniform patterns (for example 01010101
, 11001100
or 00100100
) are dubbed as 9 and merged into the 10-th bin of the LBP histogram.
Excerpt from the source code of the _local_binary_pattern()
function:
# 1. Constant patterns patterns (with n_ones=0 and
# n_ones=P) and non uniform patterns are given fixed
# code values.