常見插值算法
在現(xiàn)實生活中,我們經(jīng)常會遇到把圖像進(jìn)行放大、幾何空間變換的情況等等,這些操作都需要在源圖像和目標(biāo)圖像之間建立一個映射規(guī)則,使得兩圖像像素坐標(biāo)之間建立起一種對應(yīng)關(guān)系,從而為目標(biāo)圖像的每一個像素賦值。
從源圖像到目標(biāo)圖像的映射叫前向映射,但是這種映射方法可能會出現(xiàn)這樣的兩個問題:源圖像的好幾個像素點映射到目標(biāo)圖像中的位置是相同的;目標(biāo)圖像某些位置沒有要賦值的像素。這樣就要考慮如何把多個輸出值轉(zhuǎn)換成一個輸出值和對目標(biāo)圖像中沒有映射到的像素該如何賦值的問題。而我們經(jīng)常采用的是后向映射,這種方法比前向映射更加有效,它是從目標(biāo)圖像到源圖像的映射,即,這樣就避免了前向映射中存在的問題,但也不可避免地存在著部分像素映射回源圖像時坐標(biāo)為浮點數(shù)的問題,而圖像的像素值僅在整數(shù)坐標(biāo)處有定義,這時候就要利用圖像插值方法來給這個待求像素點賦值。
常用的插值算法有:最近鄰插值,雙線性插值,雙三次插值方法等等。其中最近鄰插值方法(零階插值)最簡單,運(yùn)算量最小,但是效果很差,塊效應(yīng)非常明顯。
一、最鄰插值算法
是最簡單的一種插值算法,當(dāng)圖片放大時,缺少的像素通過直接使用與之最近原有顏色生成,也就是說照搬旁邊的像素。這樣做結(jié)果產(chǎn)生了明顯可見的鋸齒。
在待求象素的四鄰象素中,將距離待求象素最近的鄰灰度賦給待求象素。
如果 i+u, j+v(i落在 A區(qū),即 u<0.5,v<0.5,則將左上角象素的灰度值賦給待求象素,同理落在B區(qū)則賦予右上角的象素灰度值,落在C區(qū)則賦予左下角象素的灰度值,落在D區(qū)則賦予右下角象素的灰度值。
最近鄰插值法計算量較小,但可能會造成生的圖像灰度上的不連續(xù),在變化地方可能出現(xiàn)明顯鋸齒狀
二、線性插值
線性插值是一種針對一維數(shù)據(jù)的插值方法,它根據(jù)一維數(shù)據(jù)序列中需要插值的點的左右鄰近兩個數(shù)據(jù)點來進(jìn)行數(shù)值的估計。當(dāng)然了它不是求這兩個點數(shù)據(jù)大小的平均值(當(dāng)然也有求平均值的情況),而是根據(jù)到這兩個點的距離來分配它們的比重的。
它很好地顯示了線性插值的原理。根據(jù)圖中的假設(shè):已知點(x0,y0)、(x1,y1),試問在x處插值,y的值是多少?用我們初中學(xué)過的知識,已知兩個點的坐標(biāo)可以得到一條線,又已知線上一點的一個坐標(biāo)可以求得這個點的另一個坐標(biāo)值。這就是線性插值的原理。
這樣就求得了y值。
三、雙線性插值
雙線性插值
假設(shè)源圖像大小為mxn,目標(biāo)圖像為axb。那么兩幅圖像的邊長比分別為:m/a和n/b。注意,通常這個比例不是整數(shù),編程存儲的時候要用浮點型。目標(biāo)圖像的第(i,j)個像素點(i行j列)可以通過邊長比對應(yīng)回源圖像。其對應(yīng)坐標(biāo)為(im/a,jn/b)。顯然,這個對應(yīng)坐標(biāo)一般來說不是整數(shù),而非整數(shù)的坐標(biāo)是無法在圖像這種離散數(shù)據(jù)上使用的。雙線性插值通過尋找距離這個對應(yīng)坐標(biāo)最近的四個像素點,來計算該點的值(灰度值或者RGB值)。
若圖像為灰度圖像,那么(i,j)點的灰度值的數(shù)學(xué)計算模型是:
f(x,y)=b1+b2x+b3y+b4xy
其中b1,b2,b3,b4是相關(guān)的系數(shù)。關(guān)于其的計算過程如下如下:
如圖,已知Q12,Q22,Q11,Q21,但是要插值的點為P點,這就要用雙線性插值了,首先在x軸方向上,對R1和R2兩個點進(jìn)行插值,這個很簡單,然后根據(jù)R1和R2對P點進(jìn)行插值,這就是所謂的雙線性插值。
定義:雙線性插值,又稱為雙線性內(nèi)插。在數(shù)學(xué)上,雙線性插值是有兩個變量的插值函數(shù)的線性插值擴(kuò)展,其核心思想是在兩個方向分別進(jìn)行一次線性插值。
假如我們想得到未知函數(shù)在點
的值,假設(shè)我們已知函數(shù)
在
及
四個點的值。
首先在 x 方向進(jìn)行線性插值,得到
然后在 y 方向進(jìn)行線性插值,得到
這樣就得到所要的結(jié)果,
如果選擇一個坐標(biāo)系統(tǒng)使得 的四個已知點坐標(biāo)分別為 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化簡為
或者用矩陣運(yùn)算表示為:
線性插值的結(jié)果與插值的順序無關(guān)。首先進(jìn)行 y 方向的插值,然后進(jìn)行 x 方向的插值,所得到的結(jié)果是一樣的。
注意: 源圖像和目標(biāo)圖像的原點(0,0)均選擇左上角,然后根據(jù)插值公式計算目標(biāo)圖像每點像素,假設(shè)你需要將一幅5x5的圖像縮小成3x3,那么源圖像和目標(biāo)圖像各個像素之間的對應(yīng)關(guān)系如下:
只畫了一行,用做示意,從圖中可以很明顯的看到,如果選擇右上角為原點(0,0),那么最右邊和最下邊的像素實際上并沒有參與計算,而且目標(biāo)圖像的每個像素點計算出的灰度值也相對于源圖像偏左偏上。
那么,讓坐標(biāo)加1或者選擇右下角為原點怎么樣呢?很不幸,還是一樣的效果,不過這次得到的圖像將偏右偏下。
最好的方法就是,兩個圖像的幾何中心重合,并且目標(biāo)圖像的每個像素之間都是等間隔的,并且都和兩邊有一定的邊距,這也是matlab和openCV的做法。如下圖:
計算對應(yīng)坐標(biāo)的時候改為以下公式即可:
代替
四、雙三次(bicubic)插值
雙三次插值又稱立方卷積插值。三次卷積插值是一種更加復(fù)雜的插值方式。該算法利用待采樣點周圍16個點的灰度值作三次插值,不僅考慮到4 個直接相鄰點的灰度影響,而且考慮到各鄰點間灰度值變化率的影響。三次運(yùn)算可以得到更接近高分辨率圖像的放大效果,但也導(dǎo)致了運(yùn)算量的急劇增加。這種算法需要選取插值基函數(shù)來擬合數(shù)據(jù),其最常用的插值基函數(shù)如下所示:
構(gòu)造BiCubic函數(shù):
其中,a取-0.5.
BiCubic函數(shù)具有如下形狀:

假設(shè)源圖像A大小為mn,縮放后的目標(biāo)圖像B的大小為MN。那么根據(jù)比例我們可以得到B(X,Y)在A上的的 對應(yīng)坐標(biāo)為A(x,y)=A(X(m/M),Y(n/N))。在雙線性插值法中,我們選取A(x,y)的最近四個點。而在雙立方 插值法中,我們選取的是最近的16個像素點作為計算目標(biāo)圖像B(X,Y)處像素值的參數(shù)。如圖所示:
每個像素值的權(quán)重由該點到待求像素點的距離確定,這個距離包括水平和豎直兩個方向上的距離。以像素點為例,該點在豎直和水平方向上與待求像素點的距離分別是和則該像素點的權(quán)重為。則待求點像素值的計算方法如下式所示。
其中:
插值核為: