用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所示。顯然,根據簡單...