用於圖像縮放。
1、最近鄰插值算法(零階插值算法)
目標圖像B(X,Y)通過同時求得源圖像A(x+u,y+v)(u,v是<=1的小數),則對應在源圖像上的坐標為A(x,y)=A(i,j),所以要找鄰近的4個像素點:
如果 i+u, j+v(i落在 A區,即 u<0.5,v<0.5,則將左上角象素的灰度值賦給待求象素,同理落在B區則賦予右上角的象素灰度值,落在C區則賦予左下角象素的灰度值,落在D區則賦予右下角象素的灰度值。
最近鄰插值法計算量較小,但可能會造成生的圖像灰度上的不連續,在變化地方可能出現明顯鋸齒狀。
近鄰取樣插值縮放簡單、速度快,但是縮放出的圖片質量比較差,當圖片放大時,缺少的像素通過直接使用與之最近原有顏色生成,也就是說照搬旁邊的像素這樣做結果產生了明顯可見的鋸齒。效果不好的根源就是其簡單的最臨近插值方法引入了嚴重的圖像失真,比如,當由目標圖的坐標反推得到的源圖的的坐標是一個浮點數的時候,采用了四舍五入的方法,直接采用了和這個浮點數最接近的象素的值,這種方法是很不科學的。
2、雙線性(一階插值法)
經過三次插值才能得到最終結果,是對最近鄰的改進。先對兩水平方向進行一階線性插值,然后再在垂直方向上進行一階線性插值。能創造出比雙線性插值更平滑的圖像邊緣。
單線性插值
相當於在y=y0和y=y1這兩個值上做了線性的插值。
雙線性插值
雙線性插值是有兩個變量的插值函數的線性插值擴展,在兩個方向分別進行一次線性插值。
假如想得到未知函數f在p點的值,已經知道了f在Q11 = (x1, y1)、Q12 = (x1, y2), Q21(x2, y1) 以及 Q22(x2, y2) 四個點的值。
首先在x方向進行兩次線性插值:
然后在 y 方向進行一次線性插值:
圖像雙線性插值只會用相鄰的4個點,opencv中用了一些優化手段,比如用整數計算代替float,源圖像和目標圖像幾何中心的對齊。
假設源圖像A大小為m*n,像素坐標為(x,y),縮放后的目標圖像大小是M*N,依次求B(X,Y)每一個像素點的值,先找到B(X,Y)對應在A(x,y)的坐標:
x = X * (m/M)
y = Y * (n/N)
中心對齊(OpenCV也是如此):
SrcX=(dstX+0.5) * (srcWidth/dstWidth) -0.5
SrcY=(dstY+0.5) * (srcHeight/dstHeight)-0.5
源圖像和目標圖像的原點(0,0)均選擇左上角,假設你需要將一幅5x5的圖像縮小成3x3,那么源圖像和目標圖像各個像素之間的對應關系如下。如果沒有這個兩個圖像的幾何中心對齊,根據基本公式去算,就會發現源圖像中最右邊和最下邊上的像素沒有參與運算,輸出圖像的像素點的灰度值相對於源圖像偏,就會得到左邊這樣的結果;而用了對齊,就會得到右邊的結果:
效果分析
效果好於最近鄰插值,計算量稍大,放縮后圖像質量提高,基本克服了最近鄰插值灰度值不連續的缺點,但是由於只考慮了相鄰的4個點,沒有考慮各個點之間灰度值的變化率的影響,因此具有低通濾波的作用,知道圖像的高頻分量受到影響,圖像邊緣在一定程度上變得模糊。
3、立方卷積插值算法(雙三次、雙立方)
是對雙線性插值的改進,是一種較為復雜的插值方式,它不僅考慮到相鄰的4*4像素點灰度值的影響,還考慮到它們灰度值變化率的影響。
卷積插值公式
假設P(x+u,y+v)點就是(x,y)對應在目標圖像的位置,雙立方差值就是通過bicubic基函數得到目標像素點周圍的16個相鄰像素目標像素點P的影響因子,該基函數(卷積插值公式)是:
a=-0.5時比較合適
x位在目標圖像中相鄰的16個像素到P的距離。
a=-1時
此時逼近的函數是y = sin(x*π)/(x*π):
當a=-0.5
此時逼近三次Hermite樣條:
對比圖
過程
假設源圖像A大小為m*n,像素坐標為(x,y),縮放后的目標圖像大小是M*N,依次求B(X,Y)每一個像素點的值,先找到B(X,Y)對應在A的坐標(x+u,y+v),因為計算出來的不可能肯定是整數,所以這樣表示,然后找找到最接近的點就是A(x,y),最終B(X,Y)的像素值就是由A(x,y)附近的16個像素點來決定,這十六個像素點的范圍是:
設像素點的像素值的函數是f(x,y),那么目標圖像B中對應的像素點(X,Y)的像素值為F(x+u,y+v):
S(x)就是卷積插值公式W(x)。
a取-0.5
矩陣形式:
效果分析
立方卷積插值不僅考慮到周圍四個直接相鄰像素點灰度值的影響,還考慮到它們灰度值變化率的影響。因此克服了前兩種方法的不足之處,能夠產生比雙線性插值更為平滑的邊緣,計算精度很高,處理后的圖像像質損失最少,效果是最佳的。
4、基於像素區域關系
共分三種情況,圖像放大時類似於雙線性插值,圖像縮小(x軸、y軸同時縮小)又分兩種情況,此情況下可以避免波紋出現。
5、蘭索斯插值
由相鄰的8*8像素計算得出,公式類似於雙線性,執行效率非常低。