Conversion du nombre binaire à décimal dans Matlab
-
29-10-2019 - |
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?
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, [])
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.