Ho iniziato a codificare un programma di elaborazione di immagini da diversi algoritmi di elaborazione delle immagini, principalmente dal lavoro di René Schulte, e durante il benchmark ho notato che da tutti gli effetti che ho trovato da diverse fonti, il codice per applicare un effetto "Softlight" era il più lento. Non sono bravo nell'ottimizzare l'equazione, ma ritengo che il filtro sia basato su una formula che forse sta ripetendo variabili senza motivo.Questa formula è ripetitiva o ottimale
Questo potrebbe essere riassunto in qualcosa di più breve o più veloce?
// 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))));
}
[Edit - risultati utilizzando l'equazione Mohammed Hossain trovato circa softlight in 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
[Edit]
Ecco l'algoritmo più veloce basano su Mohammed Hossain risposta:
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)));
}
mi auguro che i compilatori farebbero eliminazione sottoespressione comune, ma quando floating il punto viene coinvolto ... – nneonneo
E googling il nome del tizio che ha aggiunto questo codice alla fonte originale non restituisce nulla, finirò col chiamare il codificatore! –
Le operazioni aritmetiche su float sono più costose che su numeri interi. cambiare i tipi di parametri in int, quindi posso fornire una soluzione. –