【问题标题】:Image convolution with pre-multiplied alpha带有预乘 alpha 的图像卷积
【发布时间】:2011-06-30 10:48:59
【问题描述】:

我正在尝试使用 3x3 矩阵实现图像卷积,其中我的颜色分量(每个范围从 0 到 255)使用预乘 alpha 进行存储。我能找到的所有教程(例如http://www.codeproject.com/KB/GDI-plus/csharpfilters.aspx)只描述了对 RGB 分量执行卷积计算,而没有提及 alpha 分量。

我当前的代码保持 alpha 组件不变。在处理每个像素都已设置完整 alpha 的图像时,我尝试过的过滤器看起来不错。当我有部分透明的像素时,例如boxblur 滤镜看起来很奇怪,因为当模糊发生时像素颜色不会传播到透明区域。

在运行卷积算法时,我对 alpha 分量执行哪些计算,以及在设置最终像素值时如何处理预乘 alpha? 另外,我是否将过滤器偏移添加到alpha 分量?

我尝试以与计算 RGB 分量相同的方式计算我的新 alpha 分量(即根据过滤器矩阵为该像素添加周围的 alpha 值),但我在透明区域的边缘出现彩色条纹,并且半透明像素开始变暗太多。我想我需要更改新的 RGB 组件以考虑新的 alpha 值,但我不确定该怎么做。

谢谢。

【问题讨论】:

    标签: graphics image-processing 2d alphablending


    【解决方案1】:

    我认为正确的方法是首先使用标准公式计算卷积的 alpha

    alpha = a1*m1 + a2*m2 + a3*m3 +
            a4*m4 + a5*m5 + a6*m6 +
            a7*m7 + a8*m8 + a9*m9;
    

    那么你必须计算原始(非预乘)r/g/b 的卷积和后乘 alpha

    red = (r1/a1*m1 + r2/a2*m2 + r3/a3*m3 +
           r4/a4*m4 + r5/a5*m5 + r6/a6*m6 +
           r7/a7*m7 + r8/a8*m8 + r9/a9*m9) * alpha;
    

    绿色和蓝色的公式相似。

    一种更有效的方法是首先删除预乘(即用 r/a 替换 r,用 g/a 替换 g,用 b/a 替换 b)使用标准公式对所有分量进行卷积,然后重新预乘(替换 r与 r*a、g 与 g*a 和 b 与 b*a)。

    【讨论】:

    • 谢谢!我试过了,我的图像过滤器现在看起来几乎正确了。我现在面临的问题是,当我进行大框模糊或高斯模糊时,开始时不透明的图像开始变得越来越透明(我在 Photoshop 中没有这种行为)。不过,对于小模糊来说,这并不明显。知道公式是否有问题吗?
    猜你喜欢
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 2016-04-28
    • 2018-10-28
    • 1970-01-01
    • 2018-10-19
    • 2015-12-14
    相关资源
    最近更新 更多