Matlab的LBP算子实现

参考地址https://www.mathworks.com/matlabcentral/answers/386196-trying-to-display-a-lbp-image-from-extractlbpfeatures
记录一下,以防网址打不开…

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值