Ich habe begonnen, ein Bildverarbeitungsprogramm aus verschiedenen Bildverarbeitungsalgorithmen zu programmieren, meistens aus der Arbeit von René Schulte, und beim Benchmark habe ich festgestellt, dass ich von allen Effekten aus verschiedenen Quellen a Code für die Anwendung eines "Softlight" -Effekts war der langsamste. Ich bin nicht gut darin, die Gleichung zu optimieren, aber ich glaube, dass der Filter auf einer Formel basiert, die vielleicht Variablen ohne Grund wiederholt.Ist diese Formel repetitiv oder optimal?
Könnte dies in etwas kürzer oder schneller zusammengefasst werden?
// Basically, b is from Image A, and t from Image B
int csoftLight(float b, float t)
{
b /= 255;
t /= 255;
return (int)((t < 0.5) ? 255 * ((1 - 2 * t) * b * b + 2 * t * b) : 255 * ((1 - (2 * t - 1)) * b + (2 * t - 1) * (Math.Pow(b, 0.5))));
}
[Bearbeiten - Ergebnisse der Gleichung Mohammed Hossain über Softlight in PS gefunden mit]
// Input: 137 and 113
// Byte version:
int other = ((byte)((B < 128) ? (2 * ((A >> 1) + 64)) * ((float)B/255) : (255 - (2 * (255 - ((A >> 1) + 64)) * (float)(255 - B)/255))));
// Returns 116
// float version:
int res = (int)((t < 0.5) ? 255 * ((1 - 2 * t) * b * b + 2 * t * b) : 255 * ((1 - (2 * t - 1)) * b + (2 * t - 1) * (Math.Pow(b, 0.5))));
// Returns 129
[Bearbeiten]
Hier ist der schnellste Algorithmus basiert auf Mohammed Hossain Antwort:
int csoftLight(byte A, byte B)
{
return (int)((A < 128) ? (2 * ((B >> 1) + 64)) * ((float)A/255) : (255 - (2 * (255 - ((B >> 1) + 64)) * (float)(255 - A)/255)));
}
Ich hoffe würde, dass Compiler gemeinsame subexpression Beseitigung tun würde, aber als Fließ- Point goes involved ... – nneonneo
Und googlen den Namen des Kerls, der diesen Code zur ursprünglichen Quelle hinzugefügt hat, gibt nichts zurück. Ich werde am Ende den Coder rufen! –
Arithmetische Operationen auf Float sind teurer als auf ganze Zahlen. Wenn es möglich ist ändere die Parameter-Typen zu int, dann kann ich eine Lösung liefern –