Beseitigen Sie die Verzweigung, wenn Sie den Median in einem Binärbild {0, 255} finden

8

Ich habe ein binäres Bild, der binäre Wert ist entweder 0 oder 255. Der Typ der Bilddaten ist unsigned char . Hier muss ich eine mediane Filterung für dieses Bild durchführen.

Ich denke, ein Histogramm zu verwenden, um den Median zu finden, sollte schnell sein. Mit einigen Codes erklären:

%Vor%

Dann könnten wir den Medianwert sehr schnell erhalten. Aber aufgrund dieses Falles könnten die Codes noch verbessert werden:

%Vor%

Aber ich frage mich, ob es eine andere Möglichkeit gibt, den if-else-Zweig zu eliminieren, wie Bitoperationen, um {0, 255} etwas zuzuordnen, damit wir einfach ein Flag ohne Verzweigung aktualisieren können.

Irgendwelche Vorschläge?

    
blackball 04.10.2013, 06:14
quelle

2 Antworten

10

Alle Bits von 255 sind 1, so dass Sie das "if" zu:

vereinfachen können %Vor%

Wenn Sie den Zähler verwenden möchten, können Sie:

%Vor%     
Joni 04.10.2013 06:20
quelle
5

Diese Berechnung kann VIEL schneller und genauer O(n) in der Anzahl der Pixel und unabhängig von der Kerngröße gemacht werden.

Die Idee ist, zuerst eine "Scan-Konvertierung" zu machen, die eine summierte Bereichstabelle berechnet, in der der Wert jedes ( x, y) Pixel wird durch die Summe aller Pixel von (0, 0) bis (x, y) ersetzt.

Damit können Sie in fester Zeit feststellen, wie viele Pixel in einem Rect mit

gesetzt sind %Vor%

und da jedes Pixel 0 oder 1 ist, gibt die Summe die Anzahl der Einsen.

Die gesamte Berechnungszeit ist O(n) , um die Summentabelle zu erstellen, und O(n) , um die Median-Filterung durchzuführen, unabhängig davon, wie groß der Bereich ist, in dem gezählt werden soll.

Bei der Median-Filterung könnten Sie das Ergebnis abhängig von der Summe und der Formel in der inneren Schleife vorberechnen:

%Vor%

Außerdem muss die Summentabelle nicht vollständig berechnet werden (was eine ganze Zahl pro Pixel erfordert), aber sie könnte "träge" berechnet werden, während das Ergebnis durchgeführt wird, und Sie brauchen nur so viele Zeilen der Tabelle wie die Höhe der Kernel behält noch Rechenzeit O(image_width*image_height) , benötigt aber nur kernel_height*image_width Speicher.

    
6502 04.10.2013 06:29
quelle