2

透明度を処理するガウスぼかしのアルゴリズムを C# で実装しようとしています。次の 2 つの実装を試しましたが、それぞれ異なるタイプの結果が得られるようです。しかし、どちらもアルファチャンネルを考慮していません。

http://code.google.com/p/imagelibrary/downloads/detail?name=ImageLibrary-source-1_2_4.zip&can=2&q= http://www.smokycogs.com/blog/image-processing-in-c-シャープスムージングを使用した畳み込み/

私のテスト画像には、透明な背景 PNG に単純な円があります。

透明度のある画像でガウスぼかしを機能させるために、誰かが私を正しい方向に向けることができますか? 私が見つけた唯一のリンクは、ボックスのぼかしでした。 http://www.codeproject.com/Articles/6162/Gausian-and-Alpha-Blurring

4

2 に答える 2

4

事前に乗算されたアルファ透明度を使用している場合は、RGBチャンネルと同じようにアルファチャンネルをぼかすことができます。

アルファが事前に乗算されていない場合、奇妙なフリンジアーティファクトが発生する可能性があります。これを回避するには、画像を事前乗算に変換し、フィルタリングしてから、元に戻すことができます。このプロセスには落とし穴がありますが、結果は、乗算されていないアルファ画像を単純に平滑化するよりも優れている可能性があります。

于 2012-04-20T20:19:09.100 に答える
2

各 RGB 値にアルファ値を掛けてから、その結果を可能な最大アルファ値で除算する必要があります。

3 つのピクセルだけを平均化するとします。

newBlue = (
  src[-1].Blue * src[-1].Alpha + 
  src[0].Blue * src[0].Alpha + 
  src[1].Blue * src[1].Alpha ) / (255*3);

ご覧のとおり、3 つのピクセルがすべてソリッド (アルファ = 255) の場合、この計算は、アルファ チャネルを無視する場合と比べて何も変化しません (これは実際に必要なことです)。

これは、アルファなしの 3x3 畳み込みです。

            for (var i = nWidth - 2; i > 0; i--)
            {
                n = ((((pT[-sourcePixelSize]*m.TL) + (pT[0]*m.TM) + (pT[sourcePixelSize]*m.TR) +
                       (pM[-sourcePixelSize]*m.ML) + (pM[0]*m.MM) + (pM[sourcePixelSize]*m.MR) +
                       (pB[-sourcePixelSize]*m.BL) + (pB[0]*m.BM) + (pB[sourcePixelSize]*m.BR) + 5)/m.Factor) + m.Offset);
                *pD = (byte) (n <= 0 ? 0 : n >= 255 ? 255 : n);
                pT += sourcePixelSize;
                pM += sourcePixelSize;
                pB += sourcePixelSize;
                pD += 4;
            }

アルファ同等のものは次のとおりです。

            for (var i = nWidth - 2; i > 0; i--)
            {
                alphaSum = (pT[-4 + ao] + pT[ao] + pT[4 + ao] +
                            pM[-4 + ao] + pM[ao] + pM[4 + ao] +
                            pB[-4 + ao] + pB[ao] + pB[4 + ao] + 5)/9;
                n = alphaSum != 0
                        ? ((((pT[-4]*pT[-4 + ao]*m.TL) + (pT[0]*pT[ao]*m.TM) + (pT[4]*pT[4 + ao]*m.TR) +
                             (pM[-4]*pM[-4 + ao]*m.ML) + (pM[0]*pM[ao]*m.MM) + (pM[4]*pM[4 + ao]*m.MR) +
                             (pB[-4]*pB[-4 + ao]*m.BL) + (pB[0]*pB[ao]*m.BM) + (pB[4]*pB[4 + ao]*m.BR) + 5)/
                            (m.Factor*alphaSum)) + m.Offset)
                        : 0;
                *pD = (byte) (n <= 0 ? 0 : n >= 255 ? 255 : n);
                pT += 4;
                pM += 4;
                pB += 4;
                pD += 4;
             }
于 2012-04-22T19:02:19.107 に答える