uniform local binary pattern

38 views (last 30 days)
jenifer
jenifer on 6 Oct 2012
Commented: Sanjib on 28 Mar 2022
i need a matlab source code for "uniform local binary pattern" for textural features..
  1 Comment
Gianna Gonzalez Gonzalez
Gianna Gonzalez Gonzalez on 30 Jul 2020
Hola, necesitaria código de LPB para patrones uniformes e invariantes a la rotación. Si alguien me pudiera ayudar..

Sign in to comment.

Accepted Answer

Image Analyst
Image Analyst on 6 Oct 2012
Edited: Image Analyst on 30 Jul 2020
I don't know what "uniform" means with respect to LBP, but here is my demo for LBP, for what it's worth. It computes the LBP for each pixel with 8 different starting points. In other words, I have each of the 8 neighbors be bit 0 in turn, thus producing 8 LBP images. You can see they're all slightly different but essentially similar:
% Computes the local binary pattern of an image. Actually 8 of them with the "starting point" for the binary number at each of the 8 neighbor directions.
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
imtool close all; % Close all imtool figures.
clear; % Erase all existing variables.
workspace; % Make sure the workspace panel is showing.
fontSize = 20;
% Read in a standard MATLAB gray scale demo image.
folder = fileparts(which('cameraman.tif')); % Determine where demo folder is (works with all versions).
baseFileName = 'cameraman.tif';
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
if ~exist(fullFileName, 'file')
% Didn't find it there. Check the search path for it.
fullFileName = baseFileName; % No path this time.
if ~exist(fullFileName, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist.', fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
grayImage = imread(fullFileName);
% Get the dimensions of the image. numberOfColorBands should be = 1.
[rows columns numberOfColorBands] = size(grayImage);
% Display the original gray scale image.
subplot(2, 2, 1);
imshow(grayImage, []);
title('Original Grayscale Image', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0, 0.04, 1, 0.96]);
set(gcf,'name','Image Analysis Demo','numbertitle','off')
% Let's compute and display the histogram.
[pixelCount grayLevels] = imhist(grayImage);
subplot(2, 2, 2);
bar(pixelCount, 'BarWidth', 1, 'EdgeColor', 'none');
grid on;
title('Histogram of Original Gray Scale Image', 'FontSize', fontSize);
xlim([0 grayLevels(end)]); % Scale x axis manually.
% Preallocate/instantiate array for the local binary pattern.
localBinaryPatternImage1 = zeros(size(grayImage), 'uint8');
localBinaryPatternImage2 = zeros(size(grayImage), 'uint8');
localBinaryPatternImage3 = zeros(size(grayImage), 'uint8');
localBinaryPatternImage4 = zeros(size(grayImage), 'uint8');
localBinaryPatternImage5 = zeros(size(grayImage), 'uint8');
localBinaryPatternImage6 = zeros(size(grayImage), 'uint8');
localBinaryPatternImage7 = zeros(size(grayImage), 'uint8');
localBinaryPatternImage8 = zeros(size(grayImage), 'uint8');
tic;
for row = 2 : rows - 1
for col = 2 : columns - 1
centerPixel = grayImage(row, col);
pixel7=grayImage(row-1, col-1) > centerPixel;
pixel6=grayImage(row-1, col) > centerPixel;
pixel5=grayImage(row-1, col+1) > centerPixel;
pixel4=grayImage(row, col+1) > centerPixel;
pixel3=grayImage(row+1, col+1) > centerPixel;
pixel2=grayImage(row+1, col) > centerPixel;
pixel1=grayImage(row+1, col-1) > centerPixel;
pixel0=grayImage(row, col-1) > centerPixel;
% Create LBP image with the starting, LSB pixel in the upper left.
eightBitNumber = uint8(...
pixel7 * 2^7 + pixel6 * 2^6 + ...
pixel5 * 2^5 + pixel4 * 2^4 + ...
pixel3 * 2^3 + pixel2 * 2^2 + ...
pixel1 * 2 + pixel0);
% Or you can use the built-in function bwpack(), which is somewhat simpler but a lot slower.
% eightBitNumber = uint8(bwpack([pixel0; pixel1; pixel2; pixel3; pixel4; pixel5; pixel6; pixel7]));
localBinaryPatternImage1(row, col) = eightBitNumber;
% Create LBP image with the starting, LSB pixel in the upper middle.
eightBitNumber = uint8(...
pixel6 * 2^7 + pixel5 * 2^6 + ...
pixel5 * 2^4 + pixel3 * 2^4 + ...
pixel3 * 2^2 + pixel1 * 2^2 + ...
pixel0 * 2 + pixel7);
% Or you can use the built-in function bwpack(), which is somewhat simpler but a lot slower.
% eightBitNumber = uint8(bwpack([pixel0; pixel1; pixel2; pixel3; pixel4; pixel5; pixel6; pixel7]));
localBinaryPatternImage2(row, col) = eightBitNumber;
% Create LBP image with the starting, LSB pixel in the upper right.
eightBitNumber = uint8(...
pixel5 * 2^7 + pixel4 * 2^6 + ...
pixel3 * 2^5 + pixel2 * 2^4 + ...
pixel1 * 2^3 + pixel0 * 2^2 + ...
pixel7 * 2 + pixel6);
% Or you can use the built-in function bwpack(), which is somewhat simpler but a lot slower.
% eightBitNumber = uint8(bwpack([pixel0; pixel1; pixel2; pixel3; pixel4; pixel5; pixel6; pixel7]));
localBinaryPatternImage3(row, col) = eightBitNumber;
% Create LBP image with the starting, LSB pixel in the center right.
eightBitNumber = uint8(...
pixel4 * 2^7 + pixel3 * 2^6 + ...
pixel2 * 2^5 + pixel1 * 2^4 + ...
pixel0 * 2^3 + pixel7 * 2^2 + ...
pixel6 * 2 + pixel5);
% Or you can use the built-in function bwpack(), which is somewhat simpler but a lot slower.
% eightBitNumber = uint8(bwpack([pixel0; pixel1; pixel2; pixel3; pixel4; pixel5; pixel6; pixel7]));
localBinaryPatternImage4(row, col) = eightBitNumber;
% Create LBP image with the starting, LSB pixel in the lower right.
eightBitNumber = uint8(...
pixel3 * 2^7 + pixel2 * 2^6 + ...
pixel1 * 2^5 + pixel0 * 2^4 + ...
pixel7 * 2^3 + pixel6 * 2^2 + ...
pixel5 * 2 + pixel0);
% Or you can use the built-in function bwpack(), which is somewhat simpler but a lot slower.
% eightBitNumber = uint8(bwpack([pixel0; pixel1; pixel2; pixel3; pixel4; pixel5; pixel6; pixel7]));
localBinaryPatternImage5(row, col) = eightBitNumber;
% Create LBP image with the starting, LSB pixel in the lower center.
eightBitNumber = uint8(...
pixel2 * 2^7 + pixel1 * 2^6 + ...
pixel0 * 2^5 + pixel7 * 2^4 + ...
pixel6 * 2^3 + pixel5 * 2^2 + ...
pixel4 * 2 + pixel3);
% Or you can use the built-in function bwpack(), which is somewhat simpler but a lot slower.
% eightBitNumber = uint8(bwpack([pixel0; pixel1; pixel2; pixel3; pixel4; pixel5; pixel6; pixel7]));
localBinaryPatternImage6(row, col) = eightBitNumber;
% Create LBP image with the starting, LSB pixel in the lower left.
eightBitNumber = uint8(...
pixel1 * 2^7 + pixel0 * 2^6 + ...
pixel7 * 2^5 + pixel6 * 2^4 + ...
pixel5 * 2^3 + pixel4 * 2^2 + ...
pixel3 * 2 + pixel2);
% Or you can use the built-in function bwpack(), which is somewhat simpler but a lot slower.
% eightBitNumber = uint8(bwpack([pixel0; pixel1; pixel2; pixel3; pixel4; pixel5; pixel6; pixel7]));
localBinaryPatternImage7(row, col) = eightBitNumber;
% Create LBP image with the starting, LSB pixel in the center left.
eightBitNumber = uint8(...
pixel0 * 2^7 + pixel7 * 2^6 + ...
pixel6 * 2^5 + pixel5 * 2^4 + ...
pixel4 * 2^3 + pixel3 * 2^2 + ...
pixel2 * 2 + pixel1);
% Or you can use the built-in function bwpack(), which is somewhat simpler but a lot slower.
% eightBitNumber = uint8(bwpack([pixel0; pixel1; pixel2; pixel3; pixel4; pixel5; pixel6; pixel7]));
localBinaryPatternImage8(row, col) = eightBitNumber;
end
end
toc;
% Outer layer of pixels will be zero because they didn't have 8 neighbors.
% So, to avoid a huge spike in the histogram at zero, replace the outer layer of pixels with the next closest layer.
localBinaryPatternImage1(1, :) = localBinaryPatternImage1(2, :);
localBinaryPatternImage1(end, :) = localBinaryPatternImage1(end-1, :);
localBinaryPatternImage1(:, 1) = localBinaryPatternImage1(:, 2);
localBinaryPatternImage1(:, end) = localBinaryPatternImage1(:, end-1);
subplot(2,2,3);
imshow(localBinaryPatternImage1, []);
title('Local Binary Pattern', 'FontSize', fontSize);
hp = impixelinfo();
hp.Units = 'normalized';
hp.Position = [0.2, 0.5, .5, .03];
subplot(2,2,4);
[pixelCounts, GLs] = imhist(uint8(localBinaryPatternImage1(2:end-1, 2:end-1)));
bar(GLs, pixelCounts, 'BarWidth', 1, 'EdgeColor', 'none');
grid on;
title('Histogram of Local Binary Pattern', 'FontSize', fontSize);
% Bring up another figure with all 8 LBP images on it, plus the average of them all.
LBPAverageImage = (double(localBinaryPatternImage1) + double(localBinaryPatternImage2) + double(localBinaryPatternImage3) + double(localBinaryPatternImage4) + double(localBinaryPatternImage5) + double(localBinaryPatternImage6) + double(localBinaryPatternImage7) + double(localBinaryPatternImage8)) / 8;
figure;
subplot(3, 3, 1);
imshow(localBinaryPatternImage1);
title('LSB at upper left', 'FontSize', fontSize);
subplot(3, 3, 2);
imshow(localBinaryPatternImage2);
title('LSB at upper center', 'FontSize', fontSize);
subplot(3, 3, 3);
imshow(localBinaryPatternImage3);
title('LSB at upper right', 'FontSize', fontSize);
subplot(3, 3, 6);
imshow(localBinaryPatternImage4);
title('LSB at center right', 'FontSize', fontSize);
subplot(3, 3, 9);
imshow(localBinaryPatternImage5);
title('LSB at lower right', 'FontSize', fontSize);
subplot(3, 3, 8);
imshow(localBinaryPatternImage6);
title('LSB at lower center', 'FontSize', fontSize);
subplot(3, 3, 7);
imshow(localBinaryPatternImage7);
title('LSB at lower left', 'FontSize', fontSize);
subplot(3, 3, 4);
imshow(localBinaryPatternImage8);
title('LSB at center left', 'FontSize', fontSize);
subplot(3, 3, 5);
imshow(LBPAverageImage, []);
title('Average of the 8', 'FontSize', fontSize, 'Color', 'r', 'FontWeight', 'bold');
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0, 0.04, 1, 0.96]);
set(gcf,'name','Image Analysis Demo','numbertitle','off')
impixelinfo;
% threshold(128, 255, localBinaryPatternImage);
% Run through each gray level, displaying a map of where these gray levels occur.
% figure;
% for gl = 0 : 255
% binaryImage = localBinaryPatternImage1 == gl;
% imshow(binaryImage);
% caption = sprintf('LBP Image. Pixels with Gray Level = %d', gl);
% title(caption, 'FontSize', 12);
% drawnow;
% pause(0.04);
% end
  17 Comments
Sanjib
Sanjib on 28 Mar 2022
I would like to implement uniform LBP. This is the definiton given by wikipedia for uniform LBP.
A local binary pattern is called uniform if the binary pattern contains at most two bitwise transitions from 0 to 1 or vice versa when the bit pattern is traversed circularly. For example, the patterns 00000000 (0 transitions), 01110000 (2 transitions) and 11001111 (2 transitions) are uniform whereas the patterns 11001001 (4 transitions) and 01010010 (6 transitions) are not. In the computation of the LBP labels, uniform patterns are used so that there is a separate label for each uniform pattern and all the non-uniform patterns are labeled with a single label. For example, when using (8,R) neighborhood, there are a total of 256 patterns, 58 of which are uniform, which yields in 59 different labels.
I have written code for LBP but not sure how to convert it to a uniform LBP. Below is the code for LBP
for row = 2 : rows - 1
for col = 2 : columns - 1
centerPixel = grayImage(row, col);
pixel7=grayImage(row-1, col-1) >= centerPixel;
pixel6=grayImage(row-1, col) >= centerPixel;
pixel5=grayImage(row-1, col+1) >= centerPixel;
pixel4=grayImage(row, col+1) > =centerPixel;
pixel3=grayImage(row+1, col+1) >= centerPixel;
pixel2=grayImage(row+1, col) >= centerPixel;
pixel1=grayImage(row+1, col-1) >= centerPixel;
pixel0=grayImage(row, col-1) > = centerPixel;
eightBitNumber = uint8(...
pixel7 * 2^7 + pixel6 * 2^6 + ...
pixel5 * 2^5 + pixel4 * 2^4 + ...
pixel3 * 2^3 + pixel2 * 2^2 + ...
pixel1 * 2 + pixel0);

Sign in to comment.

More Answers (3)

anusha
anusha on 24 Sep 2014
Edited: anusha on 26 Sep 2014
lbp code
clear all; close all; I=imread('cameraman.tif'); I=rgb2gray(I); I1=imcrop(I); [w h]=size(I1);
for i=2:w-1 for j=2:h-1 val=I1(i,j); scale=2.^[0 1 2;7 -inf 3;6 5 4]; mat=[I1(i-1,j-1) I1(i-1,j) I1(i-1,j+1);I1(i,j-1) I1(i,j) I1(i,j+1);I1(i+1,j-1) I1(i+1,j) I1(i+1,j+1)]; mat=mat>=val; fin=mat.*scale; I1(i,j)=uint8(sum(sum(fin))); end end imshow(I1,[]);
  1 Comment
Image Analyst
Image Analyst on 26 Sep 2014
Essentially a more compact version of mine with one difference. You set the bit if it equals the center pixel, while I followed http://en.wikipedia.org/wiki/Local_binary_patterns, which says " Where the center pixel's value is greater than the neighbor's value, write "1". Otherwise, write "0". " and do not set the bit. Why did you choose to set the bit differently?

Sign in to comment.


Salma Hassan
Salma Hassan on 6 Feb 2017
how can i compute the features after these statement

sonu Lamba
sonu Lamba on 21 Jul 2017
I need to understand dynamic texture by local binary pattern and how to extract LBP feature for videos?. Here I am not getting the spatio-temporal meaning of feature and how to visualize them?

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!