Conversione da numero binario a numero decimale in MATLAB
-
29-10-2019 - |
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?
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, [])
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.