I need to threshold the surrounding pixels of the given matrix with respect to the centre pixel of the given matrix. If the surrounding values are greater than or equal to the center of the pixel they are given a 1 otherwise they are given a 0. Then I need to store all the values in the shown order to result in a vector which contains the binary value.
MATLAB: Problem to Threshold a Matrix
#thresholding #matrixImage Processing Toolboxlocal binary pattern
Related Solutions
You could use the following:
ind = 1:size(A,1);A(:,3) = arrayfun(@(x) I(A(x,1),A(x,2)), ind)';
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; endendgrayImage = 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; endendtoc;% 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
Best Answer