Pregunta

Tengo un problema al convertir el binario al decimal (parece muy largo).

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

¿Es posible cambiar esta línea?

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;

a algo más corto?

¿Fue útil?

Solución

Opción 1:

Una forma de simplificar lo que estás haciendo es crear primero una matriz de factores de escala de 3 por 3 (es decir,potencias de dos) e inicialícelo antes de sus bucles:

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

Luego puedes reemplazar todo dentro de tu bucle con estas operaciones vectorizadas:

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

Opcion 2:

Alternativamente, creo que puedes eliminar ambos bucles por completo y reemplazarlos con esta única llamada a NLFILTRO para obtener tu matriz LBP:

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

Otros consejos

No estoy seguro de lo que está haciendo allí, pero bin2dec ¿haces lo que quieres?

Estoy agregando otra solución con COLFILT función.

Implica colocar todas las ventanas deslizantes en columnas de una matriz, que procesamos utilizando una función personalizada, luego reorganiza el resultado en la matriz original. Internamente, utiliza IM2COL y Funciones de COL2IM .

Aquí hay un ejemplo:

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, [])

captura de pantalla

En comparación con @gnovice Segunda respuesta, lea este consejo de la documentación de NLFILTER :

nlfilter puede tardar mucho en procesar imágenes grandes. En algunos casos, la función colfilt puede realizar la misma operación mucho más rápido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top