MATLAB Answers

uniform local binary pattern

49 views (last 30 days)
jenifer
jenifer on 6 Oct 2012
Edited: Image Analyst on 30 Jul 2020 at 14:42
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 at 7:32
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 at 14:42
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

  10 Comments

Show 7 older comments
Halina H
Halina H on 14 Dec 2017
Hi , I would like to know why for the original image you use [pixelCount grayLevels] = imhist(grayImage); but for the LBP Image , you use [pixelCounts, GLs] = imhist(uint8(localBinaryPatternImage));
My question is , why for the LBP image histogram, imhist need to be in uint8.
Thanks
Image Analyst
Image Analyst on 14 Dec 2017
Because localBinaryPatternImage is a double. And for double arrays, imhist() expects that they will be in the range 0-1. But our localBinaryPatternImage is in the range 0-255. So all values from 1 to 255 will show up in the highest bin - the 256th bin. The count for the zeros will show up in the left bin at index 1. So the histogram will show only two bins, at each extreme end. If you cast it from double to uint8, then imhist() will assume that the bins go from 0 - 255 instead of 0-1 and the histogram will be calculated correctly.
rsnandi
rsnandi on 24 Jul 2018
thanks alot sir

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

  0 Comments

Sign in to comment.


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?

  0 Comments

Sign in to comment.


Translated by