高斯模糊,处理Alpha透明度(Gaussian blur that handles alpha t

2019-09-16 15:24发布

我一直在试图实现在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

Answer 1:

如果您正在使用预乘alpha透明度,你可以模糊Alpha通道就像RGB通道。

如果您的阿尔法是不是相乘,就可以得到奇怪的边缘文物。 为了避免这种情况,你可以尝试将您的图像相乘,过滤,然后将其转换回。 还有在这个过程中的陷阱,但结果可能会比天真地平滑一个未经过相乘的阿尔法形象更好。



Answer 2:

您必须乘以阿尔法值的每个RGB值,之后除以以最大可能的字母的结果。

比方说,你要平均只有三个像素:

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

正如你可以看到:如果三个像素固体(阿尔法= 255),那么相比于忽略Alpha通道此计算不会cange任何东西(这的确是我们想要的)。

这里是不带 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;
            }

这里阿尔法的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;
             }


文章来源: Gaussian blur that handles alpha transparency