Domanda

Ho un problema nel convertire il binario in decimale (sembra molto lungo).

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

È possibile modificare questa riga

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 qualcosa di più breve?

È stato utile?

Soluzione

Opzione 1:

Un modo per semplificare ciò che stai facendo è creare prima una matrice 3 per 3 di fattori di scala (cioè potenze di due) e inizializzarla prima dei tuoi cicli:

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

Quindi puoi sostituire tutto all'interno del tuo ciclo con queste operazioni vettorializzate:

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

Opzione 2:

In alternativa, credo che tu possa rimuovere completamente entrambi i tuoi loop e sostituirli con questa singola chiamata a NLFILTER per ottenere la tua matrice LBP:

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

Altri suggerimenti

Non sono esattamente sicuro di quello che stai facendo lì, ma lo fa bin2dec fai quello che vuoi?

Sto aggiungendo un'altra soluzione con COLFILT funzione.

Implica il posizionamento di tutte le finestre scorrevoli in colonne di una matrice, che elaboriamo utilizzando una funzione personalizzata, quindi riorganizza il risultato nella matrice originale. Internamente utilizza IM2COL e COL2IM .

Ecco un esempio:

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

Rispetto a @gnovice seconda risposta, leggi questo suggerimento dalla documentazione di NLFILTER :

nlfilter può impiegare molto tempo per elaborare immagini di grandi dimensioni. In alcuni casi, la funzione colfilt può eseguire la stessa operazione molto più velocemente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top