簡體   English   中英

高斯模糊處理alpha透明度

[英]Gaussian blur that handles alpha transparency

我一直在嘗試在C#中實現一個高斯模糊算法來處理透明度。 我嘗試了以下兩個實現,每個實現似乎給了我不同類型的結果。 但兩者都沒有考慮到alpha通道。

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

如果您使用預乘Alpha透明度,則可以像RGB通道一樣模糊Alpha通道。

如果你的alpha不是預乘的,你可以得到奇怪的邊緣文物。 為避免這種情況,您可以嘗試將圖像轉換為預乘,過濾,然后將其轉換回來。 在這個過程中存在缺陷,但結果可能比天真地平滑未經過重復的alpha圖像更好。

您必須將每個RGB值與alpha值相乘,然后將結果除以最大可能的alpha值。

假設你想平均只有​​三個像素:

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

正如你所看到的:如果所有三個像素都是實心的(alpha = 255),那么與忽略alpha通道(這確實是我們想要的)相比,這個計算不會產生任何影響。

這是一個沒有 alpha的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;
            }

這是 alpha的eqvivalent:

            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;
             }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM