Question

I have a problem in converting the binary to decimal (it seems very lengthy).

%% Read

clear all;
close all;
clc;
I=imread('test.png');
imshow(I);

%% Crop
I2 = imcrop(I);
figure, imshow(I2)
w=size(I2,1);
h=size(I2,2);
%% LBP
for i=2:w-1
    for j=2:h-1
        J0=I2(i,j);
        I3(i-1,j-1)=I2(i-1,j-1)>J0;
        I3(i-1,j)=I2(i-1,j)>J0;
        I3(i-1,j+1)=I2(i-1,j+1)>J0; 
        I3(i,j+1)=I2(i,j+1)>J0;
        I3(i+1,j+1)=I2(i+1,j+1)>J0; 
        I3(i+1,j)=I2(i+1,j)>J0; 
        I3(i+1,j-1)=I2(i+1,j-1)>J0; 
        I3(i,j-1)=I2(i,j-1)>J0;
        LBP(i,j)=I3(i-1,j-1)*2^8+I3(i-1,j)*2^7+I3(i-1,j+1)*2^6+I3(i,j+1)*2^5+I3(i+1,j+1)*2^4+I3(i+1,j)*2^3+I3(i+1,j-1)*2^2+I3(i,j-1)*2^1;
    end
end
figure,imshow(I3)
figure,imhist(LBP)

Is it possible to change this line

LBP(i,j)=I3(i-1,j-1)*2^8+I3(i-1,j)*2^7+I3(i-1,j+1)*2^6+I3(i,j+1)*2^5+I3(i+1,j+1)*2^4+I3(i+1,j)*2^3+I3(i+1,j-1)*2^2+I3(i,j-1)*2^1;

to something shorter?

Was it helpful?

Solution

Option 1:

One way to simplify what you're doing is to first create a 3-by-3 matrix of scale factors (i.e. powers of two) and initialize it before your loops:

scale = 2.^[8 7 6; 1 -inf 5; 2 3 4];

Then you can replace everything inside your loop with these vectorized operations:

temp = (I2(i-1:i+1,j-1:j+1) > I2(i,j)).*scale;
LBP(i,j) = sum(temp(:));

Option 2:

Alternatively, I believe you can remove both of your loops entirely and replace them with this single call to NLFILTER to get your matrix LBP:

LBP = nlfilter(I2,[3 3],@(x) sum((x(:) > x(5)).*scale(:)));

OTHER TIPS

I'm not exactly sure what you're doing there, but does bin2dec do what you want?

I'm adding another solution with the COLFILT function.

It involves placing all sliding window into columns of a matrix, which we process using a custom function, then it rearranges the result into the original matrix. Internally it uses the IM2COL and COL2IM functions.

Here is an example:

I = imread('coins.png');
fun = @(b) sum( bsxfun(@times, 2.^(8:-1:1)', ...
           bsxfun(@gt, b([1 4 7 8 9 6 3 2],:), b(5,:))) );
II = colfilt(I, [3 3], 'sliding', fun);
imshow(II, [])

screenshot

With comparison to @gnovice's second answer, read this tip from the NLFILTER documentation:

nlfilter can take a long time to process large images. In some cases, the colfilt function can perform the same operation much faster.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top