8
votes

Version plus rapide de la fonction déc2bin pour la conversion de nombreux éléments?

Je lis un fichier bitmap et convertissant chaque forte> des valeurs RVB allant de 0 à 255 à binaire.

Ainsi, un 230 bitmap bitmap sera de 230400 RVB pour convertir. La fonction Dec2bin originale était trop lente, alors j'ai écrit le mien comme je sais que ma valeur sera toujours comprise entre 0 et 255. P>

mais traversera 230400 Les valeurs vont toujours prendre env. 6Sec sur ma machine et une seule couleur bitmap prendront environ 2,3sec. P>

est là pour accélérer les choses pour être inférieures à 1 constituée ou même mieux 0,5 secondes, comme chaque MSEC compte pour ma demande? p>

Voici mon code: P>

function s = dec2bin_2(input)

if input == 255
    s = [1;1;1;1;1;1;1;1];
    return;
end

s = [0;0;0;0;0;0;0;0];

if input == 0
    return;
end

if input >= 128
    input = input - 128;
    s(1) = 1;
    if input == 0
        return;
    end
end

if input >= 64
    input = input - 64;
    s(2) = 1;
    if input == 0
        return;
    end
end

if input >= 32
    input = input - 32;
    s(3) = 1;
    if input == 0
        return;
    end
end

if input >= 16
    input = input - 16;
    s(4) = 1;
    if input == 0
        return;
    end
end

if input >= 8
    input = input - 8;
    s(5) = 1;
    if input == 0
        return;
    end
end

if input >= 4
    input = input - 4;
    s(6) = 1;
    if input == 0
        return;
    end
end

if input >= 2
    input = input - 2;
    s(7) = 1;
    if input == 0
        return;
    else
        s(8) = 1;
    end
end
end


2 commentaires

Je ne comprends pas. Dans le fichier bitmap, les valeurs sont déjà binaires. Quel est votre besoin exact?


Je veux que ce soit dans 0 et 1, comme je le modulerai à Matlab. Bien que les 0 et 1 soit double en valeur.


4 Réponses :


0
votes

Impossible d'utiliser Bitand pour obtenir les bits directement? XXX

ETC ...


0 commentaires

4
votes

Option n ° 1: boucle sur chaque pixel et utiliser bitget

Vous pouvez boucler sur chaque pixel (ou la valeur RVB) dans votre image et utiliser Bitget pour obtenir un vecteur de zéros et ceux. Voici un exemple de comment utiliser Bitget: P>

>> A = uint8([126 128; 127 129]);  % A 2-by-2 matrix of uint8 values
>> B = get_bits(A,8);              % B is a 2-by-2-by-8 matrix
>> B(:,:,1)                        % Get bit 8 for each value in A

ans =

     0     1
     0     1

>> reshape(B,4,8)                  % Reshape B into a 4-by-8 matrix

ans =

     0     1     1     1     1     1     1     0
     0     1     1     1     1     1     1     1
     1     0     0     0     0     0     0     0
     1     0     0     0     0     0     0     1


2 commentaires

Oui, ça beaucoup plus vite ... environ 0.7Sec pour un bitmap de pixels multi-collées. Merci!!!


@Hh: l'option vectorisée que j'ai ajoutée est beaucoup plus rapide que la première. Sur ma machine, une matrice UINT8 de 240 by-320 prend en moyenne moins de 0,01 seconde pour être traitée!



10
votes

Un moyen encore plus rapide est d'utiliser des tables de recherche. Puisque vous savez que toutes les valeurs sont des intensités comprises entre 0 et 255, vous construisez l'équivalent binaire de chacun pour accélérer le processus.

>> whos lookupTable
  Name               Size            Bytes  Class    Attributes
  lookupTable      256x8              2048  uint8 


4 commentaires

@Amro - c'est vraiment élégant. La seule chose à ajouter peut être un remodelage final (Bini, 240,320,8) pour obtenir la réponse de la même taille que l'image d'origine ..


Très agréable. Je pense que vous pouvez accélérer le calcul de la table de recherche encore plus si vous utilisez Bitget comme je le fais dans ma option # 2: lookissable = zéros (256,8, 'uint8'); pour i = 1: 8, lookuptable (:, i) = bitget (0: 255,9-i); fin


... ou même plus vite si vous déroulez la boucle ci-dessus: v = (0: 255) '; bitget (v, 5) bitget (v, 4) bitget (v, 3) bitget (v, 2) bitget (v, 1 )]; Je reçois une heure d'exécution d'environ 0,0002 secondes.


Je viens d'ajouter la suggestion Gnovice (option n ° 2). A pris environ 0.00061011 sec à la construction de la table



0
votes

Ce type de problème (effectuez une opération par élément sur un grand tableau, car le code intégré de Matlab est trop lent), appelle parfois une solution en Java, puisque Matlab s'exécute sur une JRE et que les arguments de la convertissage / passagers sont généralement une opération assez rapide.

La solution de Gnovice sonne comme ça fonctionne pour vous, mais si vous rencontrez une situation, vous ne pouvez pas résoudre à Pure Matlab, et que vous êtes maîtrisé en Java, envisagez d'écrire un fichier JAR personnalisé. C'est assez facile. (Eh bien, beaucoup plus facile que d'essayer d'interfacer C ++ à Matlab!)


0 commentaires