MATLAB實現雙線性內插演算法

2021-08-11 02:31:02 字數 1551 閱讀 8290

用matlab簡易的實現雙線性內插演算法演算法,實現影象的縮放。具體的細節,程式注釋裡面裡面會有。

講的還是清晰易懂

本實現**,也是參考上面這篇博文的講解實現的

% 雙線性插值實現

% f(x,y)=w1*p1+w2*p2+w3*p3+w4*p4 p1,p2,p3,p4是與(x,y)最近的四個畫素點

% w1,w2,w3,w4分別是對應的權重

% src是原影象(m*n),dst是目標影象(p*q)

% 縮放因子是m/p,n/q

%%雙線性內插本質上就是從x方向和y方向分別作了一次線性插值

% 得到原影象的大小

[m,n,z] = size(src);

% 設定目標影象的大小是300*300*3

dst = zeros(300,300,3);

[p,q,h] = size(dst);

scaler_x = m/p;

scaler_y = n/q;

% 插值實現

for i=1:p

for j=1:q

% 後向對映得到在原圖上的大概座標

% 注意一般是浮點型別

x = i*scaler_x;

y = j*scaler_y;

% 取得與(x,y)距離最近的4個畫素點

x1 = floor(x);

x2 = ceil(x);

y1 = floor(y);

y2 = ceil(y);

p1_1 = src(x1,y1,:);

p1_2 = src(x1,y2,:);

p2_1 = src(x2,y1,:);

p2_2 = src(x2,y2,:);

% 先在x軸方向進行二次線性內插

fx1 = (x2-x)/(x2-x1).*p1_1+(x-x1)/(x2-x1).*p2_1;

fx2 = (x2-x)/(x2-x1).*p1_2+(x-x1)/(x2-x1).*p2_2;

% 在y方向進行一次線性內插

f = (y2-y)/(y2-y1).*fx1+(y-y1)/(y2-y1).*fx2;

dst(i,j,:) = f;

endenddst = im2uint8(mat2gray(dst));

figure();

imshow(src)

title('原影象512*512*3')

figure();

imshow(dst)

title('目標影象300*300*3')

結果如下圖所示:

可以看到縮放後的影象出現了黑色的網格線,可能是由於座標系的設定問題。

補充 雙線性差值

opencv使用函式cv2.resize 進行影象縮放的時候,預設使用使用的插值方式是雙線性插值 cv2.inter linear 我們知道,fcn是在用雙線性插值的方式來初始化反卷積的卷積核。所以在這裡補充一下。但是其他 很少用這種方式。放在這裡,能跑通。自己用不用都行,會呼叫就行了 想深究的可以...

bmp 雙線性插值 雙線性插值原理和實現

在對影象進行空間變換的過程中,典型的情況是在對影象進行放大處理的時候,影象會出現失真的現象。這是由於在變換之後的影象中,存在著一些變換之前的影象中沒有的畫素位置。為了說明這個問題,不妨假設有一副大小為64x64的灰度影象a,現在將影象放大到256x256,不妨令其為影象b,如圖1所示。顯然,根據簡單...

bmp 雙線性插值 雙線性插值原理與實現

在對影象進行空間變換的過程中,典型的情況是在對影象進行放大處理的時候,影象會出現失真的現象。這是由於在變換之後的影象中,存在著一些變換之前的影象中沒有的畫素位置。為了說明這個問題,不妨假設有一副大小為64x64的灰度影象a,現在將影象放大到256x256,不妨令其為影象b,如圖1所示。顯然,根據簡單...