Schnellere Version der Dec2bin-Funktion zum Konvertieren vieler Elemente?

8

Ich lese eine Bitmap-Datei und konvertiere jeweils der RGB-Werte von 0 bis 255 in Binärzahlen.

So wird eine 240 mal 320 Bitmap 230400 RGB-Werte zum Konvertieren haben. Die ursprüngliche dec2bin Funktion war zu langsam, also schrieb ich meine eigene, da ich weiß, dass mein Wert immer zwischen 0 und 255 liegen wird.

Aber das Gehen durch 230400 Werte wird immer noch ca. 6 Sekunden auf meinem Rechner, und ein einzelnes Farb-Bitmap dauert etwa 2,3 Sekunden.

Gibt es überhaupt etwas, um die Dinge auf weniger als 1 Sekunde oder noch besser 0,5 Sekunden zu beschleunigen, da jede Minute für meine Anwendung zählt?

Hier ist mein Code:

%Vor%

Ich dachte, wenn ich es nicht in MATLAB machen könnte, dann werde ich vielleicht die Konvertierung in C ++ machen. Ist das ratsam?

Danke.

    
HH. 09.10.2009, 15:18
quelle

4 Antworten

10

Ein noch schnellerer Weg ist die Verwendung von Nachschlagetabellen. Da Sie wissen, dass alle Werte Intensitäten zwischen 0 und 255 sind, konstruieren Sie jeweils das binäre Äquivalent, um den Prozess zu beschleunigen.

%Vor%

Auf meinem Rechner hat es durchschnittlich 0.0036329 Sekunden gedauert (nur die Konvertierung). Beachten Sie, dass die Nachschlagetabelle fast keinen Platzbedarf hat:

%Vor%     
Amro 09.10.2009, 18:55
quelle
4

Option 1: Schleife über jedes Pixel und verwende BitGET

Sie können jedes Pixel (oder RGB-Wert) in Ihrem Bild durchlaufen und BITGET verwenden um einen Vektor von Nullen und Einsen zu erhalten. Hier ein Beispiel für die Verwendung von Bitget:

%Vor%

Option # 2: Vektorisierte Lösung mit BitGET

Es ist möglich, eine vektorisierte Lösung zu erstellen, bei der Sie jedes Bit anstelle jedes Pixels durchlaufen und dabei jedes Mal eine BITGET-Operation für die gesamte Bildmatrix durchführen. Das Folgende ist eine solche Implementierung:

%Vor%

Wenn die Matrix A 2-D (n-mal-m) oder 3-D (n-mal-m-mal-p) ist, wird die Matrix B eine Dimension größer sein. Die zusätzliche Dimension hat die Größe N mit dem höchsten Bit in Index 1. Sie können entweder in diese Dimension indizieren, um einen Bit-Wert zu erhalten, oder B in eine leichter zu visualisierende Form umformen. Hier ist ein Beispiel für die Verwendung:

%Vor%     
gnovice 09.10.2009 15:49
quelle
0

Können Sie bitand nicht verwenden, um die Bits direkt zu bekommen?

%Vor%

usw. ...

    
Locksfree 09.10.2009 15:39
quelle
0

Diese Art von Problem (eine elementweise Operation auf einem großen Array auszuführen, weil Matlab's eingebauter Code zu langsam ist) erfordert manchmal eine Lösung in Java, da Matlab auf einer JRE läuft und Argumente konvertiert / übergeben werden normalerweise eine ziemlich schnelle Operation.

Die Lösung von gnovice hört sich an, als ob sie für Sie funktioniert. Wenn Sie jedoch in eine Situation geraten, die Sie in reinem Matlab nicht lösen können, und Sie Java beherrschen, sollten Sie eine benutzerdefinierte JAR-Datei schreiben. Es ist ziemlich einfach. (Nun, viel einfacher als der Versuch, C ++ mit Matlab zu verbinden!)

    
Jason S 10.10.2009 21:53
quelle

Tags und Links