1. 程式人生 > >Matlab 插值演算法(最鄰近、雙線性、雙三次插值)

Matlab 插值演算法(最鄰近、雙線性、雙三次插值)

1、最鄰近元法

這是最簡單的一種插值方法,不需要計算,在待求象素的四鄰象素中,將距離待求象素最近的鄰象素灰度賦給待求象素。設i+u, j+v(i, j為正整數, u, v為大於零小於1的小數,下同)為待求象素座標,則待求象素灰度的值 f(i+u, j+v) 如下圖所示:

clip_image002

如果(i+u, j+v)落在A區,即u<0.5, v<0.5,則將左上角象素的灰度值賦給待求象素,同理,落在B區則賦予右上角的象素灰度值,落在C區則賦予左下角象素的灰度值,落在D區則賦予右下角象素的灰度值。

最鄰近元法計算量較小,但可能會造成插值生成的影象灰度上的不連續,在灰度變化的地方可能出現明顯的鋸齒狀。

2、雙線性內插法

雙線性內插法是利用待求象素四個鄰象素的灰度在兩個方向上作線性內插,如下圖所示:

clip_image003

對於 (i, j+v),f(i, j) 到 f(i, j+1) 的灰度變化為線性關係,則有:

f(i, j+v) = [f(i, j+1) - f(i, j)] * v + f(i, j)

同理對於 (i+1, j+v) 則有:

                  f(i+1, j+v) = [f(i+1, j+1) - f(i+1, j)] * v + f(i+1, j)

從f(i, j+v) 到 f(i+1, j+v) 的灰度變化也為線性關係,由此可推匯出待求象素灰度的計算式如下:

                  f(i+u, j+v) = (1-u) * (1-v) * f(i, j) + (1-u) * v * f(i, j+1) + u * (1-v) * f(i+1, j) + u * v * f(i+1, j+1)

雙線性內插法的計算比最鄰近點法複雜,計算量較大,但沒有灰度不連續的缺點,結果基本令人滿意。它具有低通濾波性質,使高頻分量受損,影象輪廓可能會有一點模糊。

3、三次內插法

該方法利用三次多項式S(x)求逼近理論上最佳插值函式sin(x)/x, 其數學表示式為:

待求畫素(x, y)的灰度值由其周圍16個灰度值加權內插得到,如下圖:

clip_image004

待求畫素的灰度計算式如下:

f(x, y) = f(i+u, j+v) = ABC

其中:

三次曲線插值方法計算量較大,但插值後的影象效果最好。

最鄰近插值(近鄰取樣法)、雙線性內插值、三次卷積法 等插值演算法對於旋轉變換、錯切變換、一般線性變換 和 非線性變換 都適用。

例子:

i=imread('lena.jpg');
i=rgb2gray(i);
b=imrotate(i,30,'nearest');
c=imrotate(i,50,'bilinear');
d=imrotate(i,80,'bicubic');
subplot(2,2,1),imshow(i);
title('原影象');
subplot(1,3,1),imshow(b);
title('最鄰近差值');
subplot(1,3,2),imshow(c);
title('雙線性差值');
subplot(1,3,3);imshow(d);
title('雙三次差值');

結果: