Je lis un fichier bitmap et convertissant 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
4 Réponses :
Impossible d'utiliser Bitand pour obtenir les bits directement? ETC ... P> P>
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
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 i> 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!
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
@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 code>
... 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 )]; code> Je reçois une heure d'exécution d'environ 0,0002 secondes.
Je viens d'ajouter la suggestion i> Gnovice i> (option n ° 2). A pris environ 0.00061011 sec à la construction de la table
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. P>
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!) P>
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.