我编写了一个卷积测试程序,用于试验某些东西。我创建了一个5x5的高斯模糊内核。一切看起来都很好,然后我尝试使中间带有白色圆圈的透明png模糊。在模糊的图像上,边缘看起来像是从白色到黑色的渐变。
这在数学上是正确的,因为透明点被视为黑色的透明像素,所以卷积应逐渐在边缘附近给出较暗的颜色。
但是如果我在同一张图像上进行高斯模糊,例如在GIMP中,圆圈将完全变为白色,并且边缘逐渐变得透明。我想要这种效果。我缺少什么?

如果将透明像素设置为透明白色,则可以使用,但是仅当模糊的颜色是白色时。

这是原始图像:


如果将透明像素保留为默认值,则得到的结果是:


如果将透明像素设置为#00FFFFFF,我得到这个(如果模糊的颜色是白色,这是要使用的)



#1 楼

很抱歉,您只浏览了您的问题/答案以及您提供的链接,但是我认为发布需要执行的操作以对包含Alpha通道的图像进行正确的混合和/或过滤是一个好主意。 >首先要注意的是,所有计算都应在线性色彩空间中进行,但是PNG和JPEG中的图像数据最有可能是非线性的sRGB。在执行任何计算之前,您应该将此数据转换为线性形式。例如,sRGB中黑色(0,0,0)和白色(255,255,255)的平均值不是(127,127,127),而是(186,186,186)。如果不考虑伽玛,图像的过滤,尤其是具有相邻的,互补的,饱和的颜色(例如,黄色和蓝色)的图像看起来可能很奇怪。
该理论的第二部分可以追溯到波特和达夫的开创性1984年的论文“合成数字图像”介绍了预乘alpha的概念。预乘Alpha基本上意味着您在进行计算之前将RGB与Alpha值相乘。
Porter-Duff论文指出...

出于某些原因,该建议被驳回,
最严重的是所有合成操作
都将红色通道中的1乘以
alpha通道中的.5来计算该对象的红色贡献
这个像素。避免这种
乘法的愿望提出了一个更好的解决方案,将
预乘值存储在颜色分量中,以便像素。

...。这表明这样做最初只是为了降低计算成本,但是在吉姆·布林(Jim Blinn)的文章“合成理论”中,他证明了这一点进行任何过滤或合成操作的正确方法是先将所有内容都转换为预乘。
线性化然后预乘像素数据后,请进行滤波/混合,最后取消预乘并重新应用gamma函数以映射回sRGB。

#2 楼

事实证明,我忘了用透明度对颜色通道进行加权,所以我遇到了与此处相同的问题:
Blur Transparency Bug

#3 楼

如何加载图像?

也许图像以RGB而不是RGB-A的形式加载,这意味着您完全忽略了Alpha通道(透明度值)。在这种情况下,透明像素将转换为黑色像素。

如果您使用的是OpenCV库,本文可能会帮助您将4通道的图像加载到4维数组中;那么您就可以在每4个通道上应用高斯模糊函数,并获得所需的结果。

评论


$ \ begingroup $
该图像已加载Java的ImageIO.read,它将正确加载透明度。我已附上图片。
$ \ endgroup $
–罗森斯
17年8月19日在11:46