主に René Schulte の作品から、さまざまな画像処理アルゴリズムから画像処理プログラムのコーディングを開始しました。ベンチマークを行ったときに、さまざまなソースから見つけたすべての効果から、「ソフトライト」効果を適用するコードが最も遅い。私は方程式の最適化が得意ではありませんが、フィルタは理由もなく変数を繰り返す数式に基づいていると感じています。
これをもっと短い、または速いものに要約できますか?
// 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))));
}
[編集 - Mohammed Hossain が 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
[編集]
Mohammed Hossain の回答に基づく最速のアルゴリズムは次のとおりです。
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)));
}