如果使用兩遍演算法,再結合雙線性過濾,那麼對於kernel大小為5x5的高斯模糊而言,我們可以用6個texture呼叫來計算畫素的值。但是在《real-time rendering》上還提到一種方法,即採用一遍演算法,最多使用9個texture呼叫來計算畫素值,這需要用雙線性過濾來近似4個畫素的加權值。
假設4個畫素分別為
c---d
| |
a---b
且插值係數為(x,
y)
(x,y)
(x,y
),那麼插值的結果為
m wb
=[ab
cd][
xy−x
−y+1
−xy+
x−xy
+yxy
]mw_b = \begin a& b & c & d \end \begin xy-x-y+1 \\ -xy+x \\ -xy+y \\ xy \end
mwb=[
ab
cd
]⎣⎢⎢
⎡xy
−x−y
+1−x
y+x−
xy+y
xy⎦
⎥⎥⎤
w b=
[xy−
x−y+
1−xy
+x−x
y+yx
y](1
)w_b = \begin xy-x-y+1 \\ -xy+x \\ -xy+y \\ xy \end \quad (1)
wb=⎣⎢
⎢⎡x
y−x−
y+1−
xy+x
−xy+
yxy
⎦⎥⎥⎤
(1)
這裡有∑wb
i=
1\sum _i = 1
∑wbi
=1,且w bi
⩾0
_i \geqslant 0
wbi⩾
0即雙線性插值是convex combination。
假設4個畫素的高斯權值為w=(
w0,w
1,w2
,w3)
w=(w_0,w_1,w_2,w_3)
w=(w0
,w1
,w2
,w3
),為了使得雙線性插值的結果盡可能與mwmw
mw的結果近似,我們可以最小化下面的函式的值
f (x
,y)=
∥wb−
w∑wi
∥2(2
)f(x,y) = \|w_b - \frac\|^2 \quad (2)
f(x,y)
=∥wb
−∑w
iw
∥2(2
)注意,這裡我們先對w
ww進行了歸一化,因為∑wi
\sum
∑wi
不是1。
取《real-time rendering》中的5x5 kernel的例子,左上角4個畫素的權值為
w =[
0.0133
0.0596
0.003
0.0133
]w = \begin0.0133& 0.0596& 0.003& 0.0133\end
w=[0.0
133
0.05
960
.003
0.0
133
]利用maple的minimize
函式,我們可以解得(2)
(2)(2
)在p點處取得最小值
p =(
0.8174
,0.1826)m
in
=1.276×1
0−
7p=(0.8174,0.1826) \\ min = 1.276 \times 10^
p=(0.8
174,
0.18
26)m
in=1
.276
×10−
7最後,我們還需要將w
bw_b
wb乘以∑wi
\sum w_i
∑wi
,這樣得到的權值才是最終結果。
這種方法相比兩遍演算法而言,需要更多的texture呼叫(9個)。如果kernel大小動態變化,那麼我們可以事先計算出所有的近似插值係數。
雙線性過濾和三線過濾
雙線性過濾 bilinear filtering 是進行縮放顯示的時候進行紋理平滑的一種紋理過濾方法。在大多數情況下,紋理在螢幕上顯示的時候都不會同儲存的紋理一模一樣,沒有任何失真。正因為這樣,所以一些畫素要使用紋素之間的點進行表示,在這裡我們假設紋素都是位於各個單元中心或者左上或者其它位置的點。雙...
補充 雙線性差值
opencv使用函式cv2.resize 進行影象縮放的時候,預設使用使用的插值方式是雙線性插值 cv2.inter linear 我們知道,fcn是在用雙線性插值的方式來初始化反卷積的卷積核。所以在這裡補充一下。但是其他 很少用這種方式。放在這裡,能跑通。自己用不用都行,會呼叫就行了 想深究的可以...
雙線性插值
雙線性插值作為opencv中預設使用的影象縮放演算法,其效果和速度都是不錯的。並且效果也比較穩定,計算複雜度並不算太高。我看了很多網上的演算法,自己也沒看太懂,下面是從網上找的雙線性插值 演算法的講解。影象的雙線性插值放大演算法中,目標影象中新創造的象素值,是由源影象位置在它附近的2 2區域4個鄰近...