Ersetzen Zweig Aussagen durch Bit-Verschiebeoperationen
-
22-09-2019 - |
Frage
Ich schreibe ein Bild Binarisierungsalgorithmus, die einfach jeden Helligkeitswert (Graustufenbild) des Pixels wandelt in einem schwarz oder weiß. Zur Zeit der Algorithmus für jedes Pixel Digitalisieren ist in etwa so
if( grayscale[x] < thresholdValue)
{
bitonal[x] = 1;
}
(dies ist tatsächlich eine Vereinfachung des IST-Algorithmus, weil das Schwarzweißbild ist eigentlich ein bitpacked Bild (jeder Array-Index hält 8 Pixel), damit ich die 1 innerhalb des aktuellen Array-Index tatsächlich BitPack ... aber ich glaube nicht, Das ändert sich meine Frage.
Was ich bin versucht zu tun, die Notwendigkeit für die if-Anweisung zu entfernen.
, was ich dachte war etwas entlang der Linien von, dies zu tun. Subtrahiere den Schwellenwert durch die Graustufen- und führen einige trickery Bitmanipulation auszuräumen oder Schiebebits, so dass, wenn das Ergebnis der (grayscale[x]-threshold) is less than 0, I get a 0. otherwise I would get a 1
. Wenn es einfacher ist es umgekehrt (if grayscale[x]-threshold < 0 + bitwise trickery get a 1, else get a 0)
zu tun, die auch Arbeit würde ... solange ich loswerden der Branche Anweisungen bekommen kann ... jede Hilfe ..
Lösung
bitonal[x] = (grayscale[x] < thresholdValue);
Andere Tipps
Luminanz- ist ein 8-Bit-Wert ist, dann kann man eine Anordnung von 256 Elemente aufweisen, die entweder enthalten 0 oder 1 (die erste Schwelle Elemente des Arrays enthalten 1
, und die übrigen Elemente enthalten 0
.
bitonal[x] = array[grayscale[x]];
Ich habe suchen gerade bei ähnlichen Sachen für eine zeitkritische Schleife in meinem eingebetteten App. Eine interessante Sache, die ich gefunden ist, dass Code wie diese
bit = (a<b);
erzeugt noch einen Verzweigungsbefehl auf meiner Plattform (TI F2812). Es scheint, der Compiler keinen direkten Weg hat den Status-Flag aus einem Vergleich in ein Register zu bewegen, so stattdessen erzeugt es so etwas wie
temp_register = 0
cmp a,b
branch to label if LT
temp_register = 1
label:
bit = temp_register
Allerdings hat der Prozessor eingebaute in max und min Betreiber. Da Verzweigung ziemlich teuer ist, tatsächlich dieser Code läuft schneller:
bit = min(max((b-a),0),1);
Das Ergebnis max
nur nicht Null sein, wenn a
Das ist sehr prozessorspezifische und kann überhaupt auf einem X86 nicht gelten.
Was Sprache arbeiten Sie mit? Ist die Sprache min / max-Funktionen haben? (C ++ und Java zum Beispiel beides) Wenn die Sprache der Fall ist, wäre das ein Weg sein, die, wenn ... zB Min elminate (Graustufen [x]
Vielleicht:
bitonal[x] = ((grayscale[x] - thresholdValue) >> 31) xor 1;
Ihre Sprache Unter der Annahme, nicht Equate boolean und Integer-Wert (wie C und C ++ zu tun).