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?
Good question. Take a look at the LBP example in the gallery. Specifically, look at the following image:
'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'.'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).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 ;)