Pergunta

Tenho um problema ao converter o binário em decimal (parece muito demorado).

%% 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)

É possível mudar esta linha

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;

para algo mais curto?

Foi útil?

Solução

Opção 1:

Uma maneira de simplificar o que você está fazendo é primeiro criar uma matriz 3 por 3 de fatores de escala (ou seja, potências de dois) e inicializá-la antes de seus loops:

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

Então você pode substituir tudo dentro do seu loop com estas operações vetorizadas:

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

Opção 2:

Como alternativa, acredito que você pode remover os dois loops inteiramente e substituí-los por esta única chamada para NLFILTER para obter seu LBP da matriz:

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

Outras dicas

Não tenho certeza do que você está fazendo aí, mas bin2dec faz o que quiser?

Estou adicionando outra solução com o COLFILT função.

Envolve colocar todas as janelas deslizantes em colunas de uma matriz, que processamos usando uma função personalizada e, em seguida, reorganiza o resultado na matriz original. Internamente, ele usa o IM2COL e COL2IM funções.

Aqui está um exemplo:

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

Em comparação com @gnovice segunda resposta, leia esta dica da documentação do NLFILTER :

O nlfilter pode demorar muito para processar imagens grandes. Em alguns casos, a função colfilt pode realizar a mesma operação muito mais rápido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top