2017-01-23 5 views
0

Ich versuche, ein Stück Code zu schreiben, der ein quadratisches Bild annimmt und einen Scharfzeichenkern anwendet.Schnellste Möglichkeit zu finden, ob eine Zahl im Bereich ist

Ich schaffte es, in meiner Aufgabe erfolgreich zu sein, aber ich war von den Laufzeiten meines Programms enttäuscht. Die Zeit, die es dauert, um ein Bild zu verwischen und zu schärfen (500x500) dauert etwa 16 ms, ich möchte tiefer gehen, habe callgrind und cachegrind verwendet und ich sehe, dass mein Cache-Fehler ziemlich niedrig ist (etwa 3%) Ich habe versucht, das Problem einzugrenzen. Ich stelle fest, dass ich jedes Mal, wenn ich den Kernel auf einen Pixel anwende, frage, ob einer der Kanäle im Bereich von [0,255] liegt. Ich würde gerne wissen, ob es eine schnelle Art und Weise zu berechnen ist, wenn Zahl in Bereich ist bisher verwende ich die folgenden Makros:

#define max(a, b) ((a) > (b) ? (a) : (b)) 
#define min(a, b) ((a) < (b) ? (a) : (b)) 

Meine Pixel-Struktur:

typedef struct { 
    unsigned char red; 
    unsigned char green; 
    unsigned char blue; 
} pixel; 

und meine Berechnung:

//p is a struct of pixel. 
p.red = min(max(sumRed, 0), 255); 
p.green = min(max(sumGreen, 0), 255); 
p.blue = min(max(sumBlue, 0), 255); 
+0

Was ist der Wertebereich von 'sumRed' und was ist sein Typ? – chux

+0

Warum müssen Sie fragen, ob die Werte im Bereich 0-255 liegen? wenn dies ein Bild von 8bit ist, sollte es nicht gegeben sein? –

+1

Was erhoffst du dir mit 'max (sumRed, 0)'? Dies sind "vorzeichenlose" Werte. –

Antwort

3

Sie suchen tatsächlich nach einem schnellen Weg, um Werte innerhalb eines gegebenen Bereichs zu klemmen.

Wenn Sie die maximale Reichweite die Werte kennen nehmen, die wahrscheinlich aus dem verwendeten Algorithmus bestimmt werden kann, können Sie eine Lookup-Tabelle mit einem verwenden Offset:

// clamp_table is a table of unsigned char of size maxvalue - minvalue + 1 
// initialized this way: 
unsigned char clamp_table[maxvalue - minvalue + 1]; 
for (size_t i = minvalue; i < 0; i++) { 
    clamp_table[i - minvalue] = 0; 
} 
for (size_t i = 0; i < 256; i++) { 
    clamp_table[i - minvalue] = i; 
} 
for (size_t i = 256; i <= maxvalue; i++) { 
    clamp_table[i - minvalue] = 255; 
} 

// clamping becomes a simple table indirection: 
r.red = clamp_table[sumRed - minvalue]; 
r.green = clamp_table[sumGreen - minvalue]; 
r.blue = clamp_table[sumBlue - minvalue]; 

minvalue und maxvalue sollen bei der Kompilierung bekannt sein Zeit, clamp_table kann dann eine statisch initialisierte const-Array für eine verbesserte Leistung gemacht werden.

+0

Vielen Dank! Ich habe meine Laufzeit verbessert, jetzt stehe ich auf 5 ms! –

+1

Sie können eine separate Frage mit dem vollständigen Code für Ihre Filter auf http://codereview.stackoverflow.com stellen und nach möglichen Verbesserungen fragen. Filter können drastisch optimiert werden, zum Beispiel unter Verwendung von Vektor-Intrinsik. – chqrlie

Verwandte Themen