高品质后处理渲染技术分享:十种图像模糊算法的总结与实现( 五 )


文章图片


二、方框模糊(Box Blur)


方框模糊(Box Blur) , 又常被称为盒式模糊 , 其中所得到的图像中的每个像素具有的值等于其邻近的像素的输入图像中的平均值 。 和高斯模糊一样 , Box Blur也是低通滤波器的一种形式 。 在图像处理领域 , Box Blur通常用于近似高斯模糊 。 因为根据中心极限定理 , 重复应用Box Blur可以得到和高斯模糊非常近似的模糊表现 。

可以将3 x 3的box blur的kernel表示为如下矩阵

高品质后处理渲染技术分享:十种图像模糊算法的总结与实现
文章图片


而2x2的box blur的kernel表示为如下矩阵:

高品质后处理渲染技术分享:十种图像模糊算法的总结与实现
文章图片


Box Blur和高斯模糊的性质对比可见下图:

高品质后处理渲染技术分享:十种图像模糊算法的总结与实现
文章图片

图 3D结构 , 2D结构和示例矩阵对比(a)Box Blur(b)Gaussian Blur


以下是Box Blur的作用过程的总结:

高品质后处理渲染技术分享:十种图像模糊算法的总结与实现
文章图片


Box Blur也是线性可分的 , 如有需要 , 也可以借助其此性质 , 如下所示:

高品质后处理渲染技术分享:十种图像模糊算法的总结与实现
文章图片


另外box blur也有不少扩展与变体 , 比如Tent Blur(两次Box Blur)、Quadratic Blur(三次Box Blur)等 , 具体本文暂时就不展开了 。

其中 , Tent Blur也已在XPL中进行了实现 , 具体可见:

https://github.com/QianMo/X-PostProcessing-Library/tree/master/Assets/X-PostProcessing/Effects/TentBlur


以下是一个4 x 4的box filter的shader实现 , low level optimize方面 , 可以采用乘加组合的书写方式 , 即MAD指令友好的形式 , 以在部分GPU上实现指令数的优化:

half4 BoxFilter_4Tap(TEXTURE2D_ARGS(tex, samplerTex), float2 uv, float2 texelSize)
{
float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0);

half4 s = 0;
s = SAMPLE_TEXTURE2D(tex, samplerTex, uv + d.xy) * 0.25h;// 1 MUL
s += SAMPLE_TEXTURE2D(tex, samplerTex, uv + d.zy) * 0.25h; // 1 MAD
s += SAMPLE_TEXTURE2D(tex, samplerTex, uv + d.xw) * 0.25h; // 1 MAD
s += SAMPLE_TEXTURE2D(tex, samplerTex, uv + d.zw) * 0.25h; // 1 MAD

return s;


推荐阅读