【发布时间】:2011-01-31 18:57:03
【问题描述】:
我正在尝试将框模糊应用于透明图像,并且边缘周围出现“暗晕”。
Jerry Huxtable has a short mention of the problem,一个很好的演示表明问题发生了:
但我一辈子都无法理解“pre-multiplied 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)
这看起来适合我的全不透明示例;但是当我开始涉及部分透明像素时,我不知道该怎么办。
另见
【问题讨论】:
-
我想你现在明白了。部分透明的像素根本不会改变数学。
-
抱歉,我之前的评论是基于对公式的误读。您确实需要添加一个预乘步骤:
preRed1 = red1 * alpha1 / 255;等。
标签: image-processing alphablending convolution premultiplied-alpha