Graphics 预乘alpha图像卷积

Graphics 预乘alpha图像卷积,graphics,image-processing,2d,alphablending,Graphics,Image Processing,2d,Alphablending,我试图用一个3x3矩阵实现图像卷积,在这个矩阵中,我的颜色成分(每个范围从0到255)使用预乘的alpha存储。我能找到的所有教程(例如)都只描述了对RGB分量执行卷积计算,而没有提到alpha分量 我当前的代码保持alpha组件不变。在处理每个像素都有完整的alpha集的图像时,我尝试过的过滤器看起来很好。当我有部分透明的像素时,例如boxblur过滤器看起来很奇怪,因为发生模糊时,像素颜色不会传播到透明区域 在运行卷积算法时,我对alpha分量执行什么计算?在设置最终像素值时,我如何处理预乘

我试图用一个3x3矩阵实现图像卷积,在这个矩阵中,我的颜色成分(每个范围从0到255)使用预乘的alpha存储。我能找到的所有教程(例如)都只描述了对RGB分量执行卷积计算,而没有提到alpha分量

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

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

我试着用与计算RGB分量相同的方法计算新的alpha分量(即,根据滤波器矩阵将该像素周围的alpha值相加),但我在透明区域的边缘出现彩色条纹,半透明像素开始变暗太多。我想我需要更改新的RGB组件以考虑新的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*A替换r,用g*A替换g,用b*A替换b)。

谢谢!我试过了,现在我的图像过滤器看起来几乎正确了。我现在面临的问题是,当我进行大框模糊或高斯模糊时,一个开始不透明的图像开始变得越来越透明(我在photoshop中没有这种行为)。但对于小模糊来说,这并不明显。知道是不是公式出了问题吗?