具有预乘alpha的图像卷积

时间:2011-02-19 17:17:19

标签: graphics image-processing 2d alphablending

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

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

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

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

感谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

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)。