圖像的雙線性插值放大算法中,目標圖像中新創造的象素值,是由源圖像位置在它附近的2*2區域4個鄰近象素的值通過加權平均計算得出的。雙線性內插值算法放大后的圖像質量較高,不會出現像素值不連續的的情況。然而次算法具有低通濾波器的性質,使高頻分量受損,所以可能會使圖像輪廓在一定程度上變得模糊。

圖1
X方向的線性插值
對于標準的雙線性差值算法,X方向的線性插值:
[通用1]
[通用2]
具體到我們所實現的算法中,我們使Q11、Q12、Q21、Q22為光柵上相鄰的四點,即P只能落于這四點其中一點上。Δcol是當前像素離像素所屬區域原點的水平距離,比如圖2,各種不同的顏色代表一個區域,區域原點為區域左上角的像素。
δ R2 = Color Q22 −Color Q12 ?Δcol+Color Q12 ?256 (1)
δ R1 = Color Q21 −Color Q11 ?Δcol+Color Q11 ?256 (2)
其中:Δcol=(DestColNumber?((SrcWidth?8)/DestWidth))&255, Color(X)表示點X的顏色,具體算法使用的是24位真彩色格式。
Y方向的線性插值
做完X方向的插值后再做Y方向的插值,對于一般情況,有:
[通用3]
而我們的具體算法中,Y方向的線性插值方法如(3)所示。Δrow是當前像素離像素所屬區域原點的垂直距離,比如圖2,各種不同的顏色代表一個區域,區域原點為區域左上角的像素。
Color P = δ R2 ?256+ δ R2 −δ R1 ?Δrow ?16 (3)
其中:Δrow=(DestRowNumber?((SrcHeight?8)/DestHeight))&255,由于前面為了便于計算左移了16位,因此最后需要右移16位保持匹配。
算法描述
類 C 偽碼如下:
- for (目標圖像第一行的像素++)
- {
- // 源圖像上Q12, Q22, Q11, Q21的選取見下一節
- 獲取源圖像Q12, Q22, Q11, Q21的顏色;
-
- // X 方向的插值
- δ(R2) = (Color(Q22) - Color(Q12)) * δcol+ Color(Q12) * 256;
- δ(R1) = (Color(Q21) - Color(Q11)) * δcol+ Color(Q11) * 256;
-
- // 保存 δ(R1)到一個臨時數組,因為下一行的δ(R2)等于這一行的δ(R1)
- temp[i++] = δ(R1);
-
- // Y 方向的插值
- Color(P) = (δ(R2) * 256 + (δ(R2) - δ(R1)) *δrow) >> 16;
-
- 將 P 輸出到目標位圖中。
- }
-
- for (目標圖像第二行到最末行)
- {
- for (行上的像素++)
- {
- // 源圖像上Q12, Q22, Q11, Q21的選取見下一節
- 獲取源圖像Q12, Q22, Q11, Q21的顏色;
-
- // X 方向的插值
- δ(R2) = temp[i++]; // 下一行的δ(R2)等于上一行的δ(R1)
- δ(R1) = (Color(Q21) - Color(Q11)) *δcol+ Color(Q11) * 256;
-
- // 保存 δ(R1)到一個臨時數組,因為下一行的δ(R2)等于這一行的δ(R1)
- temp[i++] = δ(R1);
-
- // Y 方向的插值
- Color(P) = (δ(R2) * 256 + (δ(R2) - δ(R1)) * δrow) >> 16;
-
- 將 P 輸出到目標位圖中。
- }
- }
算法中Q12, Q22, Q11, Q21的選取
我們以放大兩倍為例,說明選取Q12, Q22, Q11, Q21的過程。源圖像3*3區域放大為目標區域6*6區域。設以下為目標圖像:
A
|
A
|
B
|
B
|
|
|
A
|
A
|
B
|
B
|
|
|
|
|
C
|
C
|
|
|
|
|
C
|
C
|
|
|
|
|
|
|
D
|
D
|
|
|
|
|
D
|
D
|
圖2
目標圖像A像素區域對應的Q21,Q22,Q11,Q12,以紅色區域為原點向右下方擴展的2*2區域。
圖3
目標圖像B像素區域對應的Q21,Q22,Q11,Q12,以藍色區域為原點向右下方擴展的2*2區域。
圖4
目標圖像C像素區域對應的Q21,Q22,Q11,Q12,以綠色區域為原點向右下方擴展的2*2區域。
圖5
目標圖像D像素區域對應的Q21,Q22,Q11,Q12,目標圖像處于最后兩行的邊界情況,將Q21,Q22,Q11,Q12這四個點的值設為一樣。
圖6


程序流程圖
流程圖右邊虛線框中為相關過程的注解。