我正在尝试将框模糊应用于透明图像,并且边缘周围出现“暗晕”。
Jerry Huxtable简短地提到了这个问题,并且一个很好的演示显示了问题的发生:
但是,对于我的生活,我无法理解“预乘 alpha ”如何解决问题。现在举一个非常简单的例子。我有一个 3x3 图像,包含一个红色和一个绿色像素:
实际上剩余的像素是透明的:
现在我们将对图像应用 3x3 框模糊。为简单起见,我们将只计算中心像素的新值。盒子模糊的工作方式是,因为我们有一个 9 位置的正方形(3x3,称为内核),我们取内核中每个像素的 1/9,并将其相加:
所以
finalRed = 1/9 * red1 + 1/9 * red2 + 1/9 * red3+ ... + 1/9 * red9
finalGreen = 1/9*green1 + 1/9*green2 + 1/9*green3+ ... + 1/9*green9
finalBlue = 1/9* blue1 + 1/9* blue2 + 1/9* blue3+ ... + 1/9* blue9
finalAlpha = 1/9*alpha1 + 1/9*alpha2 + 1/9*alpha3+ ... + 1/9*alpha9
在这个非常简化的示例中,计算变得非常简单:
finalRed = 1/9 * 255
finalGreen = 1/9 * 255
finalBlue = 0
finalAlpha = 1/9*255 + 1/9*255
这给了我一个最终的颜色值:
finalRed = 28
finalGreen = 28
finalBlue = 0
finalAlpha = 56 (22.2%)
这个颜色太深了。当我在 Photoshop 中对相同的 3x3 像素图像执行 3px 框模糊时,我得到了我所期望的:
在白色上显示时更清晰:
实际上,我在包含透明文本的位图上执行框模糊,并且文本在边缘周围变得暗淡:
我从PixelFormat32bppARGB
格式的 GDI+ 位图开始
应用 3x3 卷积核时如何使用“预乘 alpha”?
任何答案都必须包括新的论坛,因为:
final = 1/9*(pixel1+pixel2+pixel3...+pixel9)
给我错误的答案。
编辑:一个更简单的例子是:
我将使用 0..1 范围内的颜色和 alpha 值执行此数学运算:
我将框模糊卷积过滤器应用于中间像素:
ARGB'
= 1/9 * (0,1,0,1) + 1/9 * (0,0,0,0) + 1/9 * (0,0,0,0) +
1/9 * (0,1,0,1) + 1/9 * (0,0,0,0) + 1/9 * (0,0,0,0) +
1/9 * (0,1,0,1) + 1/9 * (0,0,0,0) + 1/9 * (0,0,0,0);
= (0, 0.11, 0, 0.11) + (0,0,0,0) + (0,0,0,0) +
(0, 0.11, 0, 0.11) + (0,0,0,0) + (0,0,0,0) +
(0, 0.11, 0, 0.11) + (0,0,0,0) + (0,0,0,0)
= (0, 0.33, 0, 0.33)
这给出了相当透明的深绿色。
这不是我期望看到的。相比之下,Photoshop 的 Box Blur 是:
如果我假设(0, 0.33, 0, 0.33)
是预乘 alpha,并且不乘它,我得到:
(0, 1, 0, 0.33)
这看起来适合我的全不透明示例;但是当我开始涉及部分透明的像素时,我不知道该怎么办。