Code covered by the BSD License  

Highlights from
Local binary patterns

4.22727
4.2 | 23 ratings Rate this file 357 Downloads (last 30 days) File Size: 17.1 KB File ID: #36484 Version: 1.9
image thumbnail

Local binary patterns

by

Nikolay S. (view profile)

 

01 May 2012 (Updated )

Calculates image LBP (Local binary patterns).

| Watch this File

File Information
Description

The LBP tests the relation between pixel and it's neighbors, encoding this relation into a binary word. This allows detection of patterns/features, while being immune to contrast changes.
Current submission presents pixel-wise implementation, and filtering based implementation, achieving much shorter run-times. Both implementations achieve same results, while running at different passes. Do not use ‘pixelwiseLBP’ unless for educational or debugging purposes.
Current implementation is aligned with "Gray Scale and Rotation Invariant Texture Classification with Local Binary Patterns" from http://www.ee.oulu.fi/mvg/files/pdf/pdf_6.pdf.
The differences:
This implementation supports multi-color inputs (RGB).
Rotation invariance can be same for all channels, or channel wise manner.

Acknowledgements

This file inspired Losib (Local Oriented Statistics Information Booster) For Texture Retrieval, Shift Based Lbp, Efficient Llbp (Line Local Binary Pattern), and Opposite Color Local Binary Patterns (Oc Lbp).

Required Products Image Processing Toolbox
Signal Processing Toolbox
MATLAB
MATLAB release MATLAB 7.10 (R2010a)
MATLAB Search Path
/
/efficientLBP
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (71)
20 May 2015 Mohamad Faizal Ab Jabal

How I want to cite your works?

Comment only
26 Apr 2015 Nikolay S.

Nikolay S. (view profile)

Hi M. Janse.
Only radial shaped filters are supported build-in. For the other cases You will have to construct your own filter- in the case of this implementation it will a 3D matrix, where i'th 2D slice of it is the filter for a i'th neighbor.
This is not hard, when you understand how your filter looks like.
Best regards,
Nikolay

Comment only
16 Apr 2015 M. Janse

Hi Nikolay,
Your implementation is alligned with the paper by Ojala et. al.
They propose in their paper using the 'U' value to filter out a lot of patterns. How can I easily do this using your implementation as it is not built-in?
Best Regards,
M. Janse

09 Apr 2015 Amruta

Amruta (view profile)

I am referring IEEE transaction paper for project (BRINT: Binary Rotation Invariant and Noise Tolerant Texture Classification JUL 2014)in that on page no.3076 at last paragraph they have given joint histogram of feature vectors. But i didn't get it.
So, please help to get the concept of joint histogram.

Comment only
08 Apr 2015 Nikolay S.

Nikolay S. (view profile)

Hi Amrutra.
There are several ways to combine feature (in this case histogram) vectors. the easiest one is to concatenate the using Matlab cat command. In your case this will result in a 36+2=38 elements vector. I do not think you need to find a combination to result in 36*2=72 elements feature vector.
Try it out,
Best regards,
Nikolay

Comment only
07 Apr 2015 Amruta

Amruta (view profile)

How to calculate joint histogram of two histograms which are feature vectors?

For example, x is histogram of 36 bins and y is histogram of 2 bins and i have to calculate joint histogram of x and y which will be of 72 bins size.

Comment only
01 Apr 2015 noo no

noo no (view profile)

Hi Nikolay,
efficent is the same accuracy ??

Comment only
13 Mar 2015 jayanti  
24 Feb 2015 Yeshudas Muttu

Hi Nikolay, thanx for this code.but i am stuck about how will the feature vector of image look like. can you please load an example of LBP feature vector ?
after taking LBP of image , i have extracted feature vector from an histogram of image. Is this the right way to do? here is what i got.
Bins = 0.0537 0.1612 0.2687 0.3761 0.4836 0.5910 0.6985 0.8060 0.9134 1.0209

Comment only
15 Jan 2015 Amruta

Amruta (view profile)

Thank you!!!

Comment only
14 Jan 2015 Nikolay S.

Nikolay S. (view profile)

Good evening Amruta.
1) By using rotation invariant spatial LBP you can identify rotated textures as the same texture.
2) Both spatial and frequency domain can be used for texture classification. In case of LBP I'm not familiar with utilization of frequency domain.
3) Scale invariance can be achieved via pyramid of the image, or using changing neighborhood radius. Both will do the trick.
best regards.

Comment only
12 Jan 2015 Amruta

Amruta (view profile)

hi Good Afternoon,
Thanks for your valuable comment.
So,1) Can i do rotation invariant texture classification in transform domain?
2)Which domain is more suitable for texture classification ?
3)Can we do feature extraction from dataset(texture images) having different sizes?

Comment only
09 Jan 2015 Nikolay S.

Nikolay S. (view profile)

Good night Amruta.
As far as I remember- rotation of an image in spatial domain, also rotates the frequency transform image. I assume here that when you say transform domain, you actually mean frequency transom domain.
Texture, in very simplified case, is composed of some repeating pattern, resulting in several spikes in freq. domain. When we perform rotation invariant analysis- we are able to identify textures, even if they are at different directions. You can try visualizing what each texture means in transform domain, by tacking Brodatz or alike images, applying FFT2 with fftshift, spectra=abs(ffthsift(fft2(img))); and presenting imshow( log10(spectra) ,[] ).
You can also try my GUI for Visualization of Gabor filter bank- it is not the same, but related: http://www.mathworks.com/matlabcentral/fileexchange/30107-gabor-filetr-gui

Hope this helps.
Regards, Nikolay

Comment only
07 Jan 2015 Amruta

Amruta (view profile)

lbp is in spatial domain. Can we implement rotation invariant in transform domain?

please can you help me to understand, what is mean by texture in transform domain?

Comment only
06 Jan 2015 Nikolay S.

Nikolay S. (view profile)

Hi Olga.
Well I was wrong- the update after Michael bug fix included obsolete file copies, and thus the issue remained. I've resubmitted, hoping it will be fine now.
Thanks for finding the issue.
Best regards,
Nikolay.

Comment only
06 Jan 2015 Olga

Olga (view profile)

Hi Nikolay,
I have the same problem as Michael :) Can you help me?
Thanks!
-----
04 Sep 2014 Michael

When I run demoEfficientLBP.m, I receive the following error message:
Error using circshift>ParseInputs (line 71)
Invalid shift type: must be a finite, nonsparse, real integer vector.

Error in circshift (line 34)
[p, sizeA, numDimsA] = ParseInputs(a,p);

Error in pixelwiseLBP>sortNeighbours (line 198)
minLBP=weigthVec*circshift(origBinWord, iCircShift);

Error in pixelwiseLBP (line 147)
[minLBP, ~]=sortNeighbours(binaryWord, weigthVec,...

Error in demoEfficentLBP (line 49)
pwLBP=pixelwiseLBP(imgRGB, 'filtR', filtR, 'isRotInv', true, 'isChanWiseRot',
false);

Any idea what's wrong here?
-----------------

Regards,
Olga

Comment only
11 Dec 2014 Nikolay S.

Nikolay S. (view profile)

Hi sinanda.
I'll briefly reply here. if you need additional explanations, please email me. I'm not familiar with the concept circular bi-linear interpolation. Regular bi-linear interpolation is basically about calculating value lying between nearest neighbors (interpolation ) values, via weighted average based on their distances to the desired value position (bi-linear). See First Order Hold as well.
In case of LBP, having a central point, and angle, and a radius, usually results in a point "falling" between pixels. This demands calculation of this value via interpolation. bi-linear is the easiest one. Bi-cubic for example is another, more expensive option.
Now again- in LBP image, each pixel value is calculated via sum of neighboring pixels (of when speaking of the whole image via it's shifted versions). As the shift is not always an integer value it demands interpolation. that's about all. See matlab imresize function, or any bi-linear based image zoom method for visualization.
Hope I've made things a bit more clear.

Comment only
11 Dec 2014 sunanda

Hi Nikolay ..
I am very much new to LBP.
I have successfully calculated LBP.
Can you tell me how to calculate circular bi-linear interpolation. I am confused about radius of circular LBP and how circular neighbourhoods are calculated using bilinear interpolation.

Pls help me. I read Ojala's paper , but confused about uniform LBP and circular neighbourhood.
sc312009@gmail.com

04 Nov 2014 Anju Panicker

Never mind. I fixed it. Thanks for the code.

03 Nov 2014 Nikolay S.

Nikolay S. (view profile)

Hi Kathrin.
Using 32 neighbors to an image of [nxmxk] dimensions, results in storing an nxmx(kx32) matrix to the memory. Moreover, usage of 32 elements means storing LBP data in uint32, rather then uint8 (for up to 8 neighbors), which means *4 more memory. Altogether, the usage scenario you propose can indeed cause "out of memory" problem.
Currently I do not have a version with fever memory demands, so the only advice I can give you, it to devide the image to patches/windows, and applying the LBP to each such part in turn. You can then concatenate the sub-windows LBP into a single LBP. You can use my image concatenate function for this.
Regarding your grade (3/5)- I find it a bit insulting. Indeed, my implementation fails to deal with the hush scenario of 32 neighbors, especially if the image investigated is of large dimensions.
But you must understand, that some methods are limited, and you cannot apply them to any kind of data expecting it to work. perhaps there is an optimization, besides what I've proposed beforehand, but I have not figured one out so far. You are welcome to propose a better implementation, so I will be able to use and grade it.
Best regards.

Comment only
03 Nov 2014 Kathrin

Hi Nikolay,
If I set the number of neighbors to be 32(r=4), the program failed with warning 'out of memory' because of the size of a variable was 2.^nNeigh. I wonder if it can be programmed in another way to avoid the memory problem because the variable is sparse.

28 Oct 2014 Nikolay S.

Nikolay S. (view profile)

Hi Amruta.
Assuming I got your question correctly, I'm using bi-linear interpolation, for neighbor elements falling between pixels.

Comment only
28 Oct 2014 Amruta

Amruta (view profile)

Hi Nikolay, I am an Mtech student,doing project on LBP metohd.I want your help for interpolation method used in your LBP method.I want formulae of interpolation used in LBP method and therotical information about it.Which interpolation method is used in this given file?

Comment only
23 Oct 2014 hamad mahmood

Thank you Nikolay.

23 Oct 2014 hamad mahmood  
22 Oct 2014 Nikolay S.

Nikolay S. (view profile)

Hi hamad mahmood.
I have not used LBP for face detection, but the topic is highly researched. Here is one of most referenced papers: http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=1717463&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D1717463
I've also participated in a project where Vaioa Jones OpenCV LBP implementtation was used: http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html, http://docs.opencv.org/modules/contrib/doc/facerec/facerec_api.html#Ptr<FaceRecognizer> createLBPHFaceRecognizer(int radius, int neighbors, int grid_x, int grid_y, double threshold). You should give it a glance too.
Best regards,
Nikolay.

Comment only
22 Oct 2014 hamad mahmood

Hi Nikolay, i'm trying to extract the features from faces using matlab, but could not be able to get good results, kindly help me in this using LBP.

Comment only
16 Oct 2014 Nikolay S.

Nikolay S. (view profile)

Hi mahdi.
thank for the high grading. I've replied to your email.
Best regards,
Nikolay.

Comment only
16 Oct 2014 mahdi

mahdi (view profile)

Hi Nikolay,Thanks a lot. Would you be able to email me your nonparametric classifier codes described in your paper at http://www.ee.oulu.fi/mvg/files/pdf/pdf_6.pdf ? I need it for texture recognition and compare with my results. my email address is mahdi1982ir@yahoo.com Thanks a lot

08 Oct 2014 saurabh agarwal  
24 Sep 2014 anin keyen  
17 Sep 2014 Kathrin

Thank you! I have got your idea.

Comment only
15 Sep 2014 Nikolay S.

Nikolay S. (view profile)

Hi Kathrin.
Well, the use of the term bi-linear interpolation was a bit misleading. I'm actually doing a calculation we can refer to as bi-linear decomposition. That is, for a real number, I'm trying to find his nearest integer neighbors and their distances to him.
The bi-linear interpolation of those neighbors should result in the number we had in the first place. From my calculation the above statements is true for my formula.
Would you agree with me?
Best regards.

Comment only
15 Sep 2014 Kathrin

Hi Nikolay,
I have calculated the bilinear interpolation referring to expressions on the page (http://en.wikipedia.org/wiki/Bilinear_interpolation).
As you can see, the weight is calculated by the multiplication of two differentials. Would you agree with me?
Best regards.

Comment only
13 Sep 2014 Nikolay S.

Nikolay S. (view profile)

Hi Kathrin.
Thanks for your comment- it seems you've gone intensively through my code.
The filter elements is composed of an average between "ceil" (larger neighbor) and "floor" (smaller neighbor) value of the x and y components, aimed to calculate weight of nearest neighbors from a fractional number. As you have noticed, it is indeed a linear interpolation, implying I could used build in functions, rather than implementing it myself.
Anyhow, I do not see a reason to use multiplication here, and unless I'm being mistaken here the proposed equation seems to be fine.
Best regards, Nikolay.

Comment only
12 Sep 2014 Kathrin

Hi Nikolay,
Thanks for the code.I'm comfused about an equation in generateRadialFilterLBP.m.That is ' radInterpFilt( rowsFloor(iP), colsFloor(iP), iP )= radInterpFilt( rowsFloor(iP), colsFloor(iP), iP )+rowsDistFloor(iP)+colsDistFloor(iP);'. If it is a bilinear interpolation process. I think it should be a multiplication.That is to say, 'radInterpFilt( rowsFloor(iP), colsFloor(iP), iP )= radInterpFilt( rowsFloor(iP), colsFloor(iP), iP )+rowsDistFloor(iP)*colsDistFloor(iP);'. Would you agree with me?
Best regards!

Comment only
08 Sep 2014 Nikolay S.

Nikolay S. (view profile)

Michael, thank you for:
1) Finding the bug.
2) Helping me finding the root cause.
3) The high rating!
Best regards!

Comment only
08 Sep 2014 Michael

Thank you for the great support!

04 Sep 2014 Nikolay S.

Nikolay S. (view profile)

Hi Michael.
It seems the shift value with which the circshift is called is not an integer number. I do not see this happening when I'm running the demo. Let me email you so we can figure out the problem.
Best regards,
Nikolay.

Comment only
04 Sep 2014 Michael

When I run demoEfficientLBP.m, I receive the following error message:
Error using circshift>ParseInputs (line 71)
Invalid shift type: must be a finite, nonsparse, real integer vector.

Error in circshift (line 34)
[p, sizeA, numDimsA] = ParseInputs(a,p);

Error in pixelwiseLBP>sortNeighbours (line 198)
minLBP=weigthVec*circshift(origBinWord, iCircShift);

Error in pixelwiseLBP (line 147)
[minLBP, ~]=sortNeighbours(binaryWord, weigthVec,...

Error in demoEfficentLBP (line 49)
pwLBP=pixelwiseLBP(imgRGB, 'filtR', filtR, 'isRotInv', true, 'isChanWiseRot',
false);

Any idea what's wrong here?

Comment only
28 Aug 2014 trisha

trisha (view profile)

 
22 Jul 2014 Faisall Achsani

good

18 Jul 2014 samira

samira (view profile)

I need it

03 Jul 2014 Nikolay S.

Nikolay S. (view profile)

Thanks!

Comment only
03 Jul 2014 slimane

Hi Mr .Nikolay ,
This is a very good work
thanks

02 Jul 2014 Nikolay S.

Nikolay S. (view profile)

Hi Paresh.
I'd suggest to send your questions to my email, rather then commenting here.
Regarding your question, you should use more then one histogram element. This is called "feature vector". In some cases you can reduce the feature vector length via PCA, and other methods. In case of LBP it was proven that some histogram elements carry more information than others, such as Rotation Invariant and others. I suggest reading relevant publications.
Best regards.

Comment only
02 Jul 2014 Paresh

Paresh (view profile)

Ok. Thank You.
I have one more question, after we get the histogram feature vector how should I input that into my features matrix? i.e as it is or should I reduce LBP feature vector to a single feature? Please Reply. Thank You

Comment only
28 Jun 2014 Nikolay S.

Nikolay S. (view profile)

Hi.
Radial filter is uniform to all directions, and in most cases does the trick. Other shape filters can also be handy (especially if the problem in hand has other geometry shape preferences), but radial shape is the one commonly used in published papers.
Hope this will help a bit

Comment only
28 Jun 2014 Paresh

Paresh (view profile)

Hello,
Let me rephrase it. Why do we need radial filter at first place? Since in literature we are directly taking difference from the center pixel. Please Explain. Thank You

Comment only
28 Jun 2014 Nikolay S.

Nikolay S. (view profile)

Hi Paresh.
The multiplication is needed for proper weighting of the radial filter elements. In many cases the filter element is between pixels, and therefore a an averaging ought to be done.
Best regards.

Comment only
28 Jun 2014 Paresh

Paresh (view profile)

Hello,
While calculating pixel-wise LBP, what is the need to multiply it with radial filter? Because when I read it they are only taking difference of neighbouring pixels from the center pixel. Please explain. Thank You.

Comment only
14 May 2014 Nikolay S.

Nikolay S. (view profile)

Hi KaMu.
Channel wise rotation means that for a given pixel, each color channel rotation is calculated independently- without considering the rotation of other colors.
Regards,
Nikolay

Comment only
13 May 2014 KaMu

KaMu (view profile)

Hi Nikolay,
Thanks for the code. What do you mean by rotational channel wise. Do you mean that you rotate on one color channel?

23 Apr 2014 Nikolay S.

Nikolay S. (view profile)

Hello naif al harbi.
Well, you can have it, using the "Download submission" button above.
From the relatively low grade I can see you've found the button, but did not like the function... I'd be happy to hear your comments and improvement proposals.
Best regards.

Comment only
23 Apr 2014 Nikolay S.

Nikolay S. (view profile)

Hello naif al harbi.
Well, you can have it, using the "Download submission" button above.
For the relatively low grade I can see you've found the button, but did not like the function...
Best regards.

Comment only
23 Apr 2014 naif al harbi  
22 Apr 2014 naif al harbi

Hello,mr.Nikolay

i wante code the LBP in matlab

Comment only
02 Apr 2014 kemi

kemi (view profile)

 
22 Jan 2014 Nicola Franzoso  
10 Jan 2014 Nikolay S.

Nikolay S. (view profile)

Good evening Nicola Franzoso.
You'r comment is in place- thank you. I plan to add relevant functionality to the submission. The histogram is easy to achieve using "imhist" or "hist" with bins 1:(2^p-1) where p is the number of filter elements, applied to the LBP matrix converted to "single". What prevents me form posting this, it the Rotation Invariant (RI) case, where the histogram becomes very sparse. I failed to find an analytic way (an equation) to predict the indexes of obsolete bins. I can find the indexes of those bins for each case by applying the LBP minimization procedure, but this is inefficient and nasty. So i'm working on it. If you're not using RI-LBP, or you're fine with sparse histogram, please use my advice above.
Best wishes.

Comment only
10 Jan 2014 Nicola Franzoso

Nikolay, very good, but where i can fing the histogram, that's the template of the image ?

Comment only
09 Jan 2014 shan

shan (view profile)

Hi Nikolay ,
Very great work thanks..

14 Feb 2013 BIREM Merwan

BIREM Merwan (view profile)

 
03 Oct 2012 Nikolay S.

Nikolay S. (view profile)

Hi Charles Ding.
Well LBP is pretty simple. As far as I remember I've used Wikipedia, and some Google on top of it to understand it. This should be enough...

Comment only
21 Sep 2012 Charles ding

HI, Nikolay,

Could you please tell me a good literature about efficient LBP realized in the code? I want to understand its principles.

Comment only
28 Aug 2012 Nikolay S.

Nikolay S. (view profile)

Chris Forne, thanks for your comment. Indeed I've overlooked some issues. I hope I've resolved all- both those you've mentioned, and some others I've found myself.

Comment only
15 Aug 2012 Chris Forne

Unfortunately this function does not compute the LBP correctly.
To fix it you need to change 'sign(currNieghDiff)' to 'currNieghDiff > 0'.
You should also change 'if nNeigh<=8' to 'if nNeigh<=9', as nNeigh = number of neighbours + 1.

Finally in the Primitive pixelwise solution you need to change
neighMat( ceil(nNeigh/2))=false;
to
neighMat( ceil(nNeigh/2)+ 1 )=false;

09 Aug 2012 Rakesh Singh

hi

i wanted to know how to implement the basic concept of LBP operator with uniform patterns
i have implemented the basic concept of LBP operator in matlab
now i am using the concept of uniform pattern
the problem is that i am not able to understand the basic concept of LBP with uniform patterns

How exactly it has to be done

is there any documentation available which can help me

Comment only
17 Jul 2012 Nikolay S.

Nikolay S. (view profile)

Hello Fa Fa.
As far as I'm concerned, this comments are here for feedback, errors reporting , ratings, thanks, and code related question. Your question (and similar ones) should be be addressed via other media (directly via email, etc..).

Now, to your issue:
I don't quiet understand the question/. As far as I can see you have an interesting project ahead of you. If by "help" you mean "will I do the project for you", the answer is definitely NO.
If you wish to get some assistance with the topics of your project, that's better, but again I'm not the address in this case. I'd help you if were carrying this project under my supervision, but you aren't. I would help you nevertheless, if I was proficient in the above topics, and had some spare time, but unfortunately this is also net the case.
To conclude, it seems I can not assist you.
Best regards.

Comment only
17 Jul 2012 Fa Fa

Fa Fa (view profile)

Hi Nikolay,
i need to create 511 binary Lookup table, for LBP feature and to work with adaboost with training images.
please can you help me?
Thanks

Comment only
28 May 2012 Iqbal Nouyed  
Updates
27 Aug 2012 1.1

Many thanks goes to Chris Forne for his sharp eye. Bugs fixed, and some modification introduced.

28 Aug 2012 1.2

A Helix/Snail indexing function was аdded to scan neighborhood pixels as spiral.

09 Jan 2014 1.4

- Support Circular filter, as in M. Pietikäinen papers.
- Works on multiple color channels (gray-scale, RGB, La*b and even spectral images).
- Support Rotation Invariant mode.
- Two LBP version- pixels wise, and efficient.
Enjoy

16 Jan 2014 1.5

Changed filter direction (to CCW), starting point (3 o'clock instead of 12), support pixels interpolation.

22 May 2014 1.6

The function “roundnS” was added to the submission aimed to replace the “roundn” function that is apparently part of the Matlab Mapping Toolbox, which may be missing from some of the users trying to run this code.

05 Sep 2014 1.7

Resolved the bug reported by Michael.

06 Jan 2015 1.8

Removed duplicated outdated files. thanks to Olga for finding this.

10 Jan 2015 1.9

Resolved a few bugs related to circishift (found by Michael and Olga) and sort. Added if changing function behavior based on Matlab version.

Contact us