Zacząłem kodować program do obróbki obrazu z różnych algorytmów przetwarzania obrazu, głównie z pracy René Schulte, a podczas testów porównawczych zauważyłem, że ze wszystkich efektów, które mogłem znaleźć z różnych źródeł, kod stosowania efektu "Softlight" był najwolniejszy. Nie jestem dobra w optymalizowaniu równania, ale uważam, że filtr oparty jest na formule, która może powtarzać zmienne bez powodu.Czy ta formuła jest powtarzalna, czy optymalna?
Czy można to podsumować w czymś krótszym lub szybszym?
// 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))));
}
[Edycja - Wyniki za pomocą równania Mohammed Hossain znaleźć o oświetleniu rozproszonym w PS]
// 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
[Edytuj]
Oto najszybszy algorytm na podstawie Mohammed Hossain odpowiedź:
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)));
}
bym nadzieję, że kompilatory zrobi eliminacja wspólnych podwyrażeń, ale kiedy o zmiennym Point angażuje się ... – nneonneo
I googling nazwisko faceta, który dodał ten kod do oryginalnego źródła nic nie zwraca.Na koniec zadzwonię do kodera! –
Operacje arytmetyczne na float są droższe niż na liczbach całkowitych. zmienić typy parametrów na int, wtedy mogę dostarczyć rozwiązanie –