5

主に 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)));          
}
4

1 に答える 1

4

この答えはあなたを助け、いくつかのことを少し明確にするはずです:フォトショップは2つの画像をどのようにブレンドしますか?

方程式の1つは、ソフトライトアルゴリズムです。

#define ChannelBlend_SoftLight(A,B) ((uint8)((B < 128)?(2*((A>>1)+64))*((float)B/255):(255-(2*(255-((A>>1)+64))*(float)(255-B)/255)))) //not very accurate

重要なのは、コストのかかる平方根演算を回避し、それほど重要ではないが、2で除算する代わりにビットシフト演算子を使用することです(とにかく、スマートコンパイラによって最適化する必要があります)。また、より高速な浮動演算よりも多くの整数演算を使用します。

これは別の式です(変数の操作を切り替えるこれの所有者の礼儀であり、それは一見機能しているようです...

#define ChannelBlend_SoftLight(A,B) (uint8)(((A < 128) ? (2 * ((B >> 1) + 64)) * ((float) A / 255) : (255 - (2 * (255 - ((B >> 1) + 64)) * (float) (255 - A) / 255))));
于 2013-03-21T18:55:31.327 に答える