Question

J'ai un problème à convertir le binaire en décimal (cela semble très long).

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

Est-il possible de changer cette ligne

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;

à quelque chose de plus court?

Était-ce utile?

La solution

Option 1:

Une façon de simplifier ce que vous faites est de créer d'abord une matrice 3 par 3 de facteurs d'échelle (c'est-à-dire des pouvoirs de deux) et de l'initialiser avant vos boucles:

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

Ensuite, vous pouvez remplacer tout dans votre boucle par ces opérations vectorisées:

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

Option 2:

Alternativement, je crois que vous pouvez supprimer entièrement vos deux boucles et les remplacer par cet appel unique à Nlfilter Pour obtenir votre matrice LBP:

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

Autres conseils

Je ne sais pas exactement ce que vous faites là-bas, mais le fait bin2dec Faites ce que vous voulez?

J'ajoute une autre solution avec le Colfilt fonction.

Il s'agit de placer toute la fenêtre coulissante dans des colonnes d'une matrice, que nous traitons à l'aide d'une fonction personnalisée, puis il réorganise le résultat dans la matrice d'origine. En interne, il utilise le Im2col et Col2im les fonctions.

Voici un exemple:

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

Avec comparaison avec @gnoviceDeuxième réponse, lisez cette astuce de la Nlfilter Documentation:

NLFilter peut prendre beaucoup de temps pour traiter les grandes images. Dans certains cas, la fonction COLFILT peut effectuer le même opération beaucoup plus rapidement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top