How can i calculate the feature vector of local binary pattern image?
4 次查看(过去 30 天)
显示 更早的评论
I found the demo code which was published by @Image Analyst.Where local binary pattern image is calculated for the whole image. But i want to calculate it for region of interest. According to wikipedia... The LBP feature vector, in its simplest form, is created in the following manner:
1)Divide the examined window into cells (e.g. 16x16 pixels for each cell).
2)For each pixel in a cell, compare the pixel to each of its 8 neighbors (on its left-top, left-middle, left-bottom, right-top, etc.). Follow the pixels along a circle, i.e. clockwise or counter-clockwise. Where the center pixel's value is greater than the neighbor's value, write "0". Otherwise, write "1". This gives an 8-digit binary number (which is usually converted to decimal for convenience).
3)Compute the histogram, over the cell, of the frequency of each "number" occurring (i.e., each combination of which pixels are smaller and which are greater than the center). This histogram can be seen as a 256-dimensional feature vector.
4)Optionally normalize the histogram.
5)Concatenate (normalized) histograms of all cells. This gives a feature vector for the entire window.
But according to the given code it doesn't divide the window in cells.It computes LBP for the entire image.That means it skip 1,3,4,and 5 options.How can i do it?How can do it for my region of interest?
if true
[pixelCount grayLevels] = imhist(grayImage);
subplot(2, 2, 2);
bar(pixelCount);
title('Histogram of original image', 'FontSize', fontSize);
xlim([0 grayLevels(end)]); % Scale x axis manually.
% Preallocate/instantiate array for the local binary pattern.
localBinaryPatternImage = zeros(size(grayImage));
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;
localBinaryPatternImage(row, col) = uint8(...
pixel7 * 2^7 + pixel6 * 2^6 + ...
pixel5 * 2^5 + pixel4 * 2^4 + ...
pixel3 * 2^3 + pixel2 * 2^2 + ...
pixel1 * 2 + pixel0);
end
end
subplot(2,2,3);
imshow(localBinaryPatternImage, []);
title('Local Binary Pattern', 'FontSize', fontSize);
subplot(2,2,4);
[pixelCounts, GLs] = imhist(uint8(localBinaryPatternImage));
bar(GLs, pixelCounts);
title('Histogram of Local Binary Pattern', 'FontSize', fontSize);
end
0 个评论
回答(1 个)
Image Analyst
2017-8-17
I see no need for step 1 and step 5. What good do they do? If you take the histogram of a bunch of 16x16 windows and then combine all the histograms, you'll get the same histogram as of the whole image, so I don't see how steps 1 and 5 are even needed, or if they were implemented how the end result would be any different that doing all "cells" at the same time (i.e. ignoring cells). Perhaps you can explain to me how it makes a difference.
If you want to get the LBP of an irregular region of interest set the pixels outside the mask to -1 or nan. Then when you scan the 8 pixel neighbors, if you encounter a -1 or nan in the pixels neighbors, just skip that pixel - don't compute the LBP for that pixel.
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!