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 ..

geschätzt
War es hilfreich?

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 min konvertiert beliebige Nicht-Null bis 1.

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top