MATLAB: Uniform local binary pattern

Image Processing Toolboxlocal binary patternlpbuniform local binary pattern

i need a matlab source code for "uniform local binary pattern" for textural features..

Best Answer

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
Related Question