如果使用两遍算法,再结合双线性过滤,那么对于kernel大小为5x5的高斯模糊而言,我们可以用6个texture调用来计算像素的值。但是在《Real-Time Rendering》上还提到一种方法,即采用一遍算法,最多使用9个texture调用来计算像素值,这需要用双线性过滤来近似4个像素的加权值。
假设4个像素分别为
C---D
| |
A---B
且插值系数为(x,y)(x,y)(x,y),那么插值的结果为
Mwb=[ABCD][xy−x−y+1−xy+x−xy+yxy]
Mw_b = \begin{bmatrix}
A& B & C & D
\end{bmatrix}
\begin{bmatrix}
xy-x-y+1
\\
-xy+x
\\
-xy+y
\\
xy
\end{bmatrix}
Mwb=[ABCD]⎣⎢⎢⎡xy−x−y+1−xy+x−xy+yxy⎦⎥⎥⎤
wb=[xy−x−y+1−xy+x−xy+yxy](1)
w_b = \begin{bmatrix}
xy-x-y+1
\\
-xy+x
\\
-xy+y
\\
xy
\end{bmatrix} \quad (1)
wb=⎣⎢⎢⎡xy−x−y+1−xy+x−xy+yxy⎦⎥⎥⎤(1)
这里有∑wbi=1\sum {w_b}_i = 1∑wbi=1,且wbi⩾0{w_b}_i \geqslant 0wbi⩾0即双线性插值是convex combination。
假设4个像素的高斯权值为w=(w0,w1,w2,w3)w=(w_0,w_1,w_2,w_3)w=(w0,w1,w2,w3),为了使得双线性插值的结果尽可能与MwMwMw的结果近似,我们可以最小化下面的函数的值
f(x,y)=∥wb−w∑wi∥2(2) f(x,y) = \|w_b - \frac{w}{\sum w_i}\|^2 \quad (2) f(x,y)=∥wb−∑wiw∥2(2)
注意,这里我们先对www进行了归一化,因为∑wi\sum {w_i}∑wi不是1。
取《Real-Time Rendering》中的5x5 kernel的例子,左上角4个像素的权值为
w=[0.01330.05960.0030.0133] w = \begin{bmatrix}0.0133& 0.0596& 0.003& 0.0133\end{bmatrix} w=[0.01330.05960.0030.0133]
利用maple的minimize
函数,我们可以解得(2)(2)(2)在P点处取得最小值
P=(0.8174,0.1826)min=1.276×10−7 P=(0.8174,0.1826) \\ min = 1.276 \times 10^{-7} P=(0.8174,0.1826)min=1.276×10−7
最后,我们还需要将wbw_bwb乘以∑wi\sum w_i∑wi,这样得到的权值才是最终结果。
这种方法相比两遍算法而言,需要更多的texture调用(9个)。如果kernel大小动态变化,那么我们可以事先计算出所有的近似插值系数。